Docker 的发展
Docker 的出现要归功于虚拟化技术的发展。从硬件虚拟化到软件虚拟化,再到容器化,每次技术迭代都带来了显著的技术突破。Docker 的诞生主要依赖于 Linux 的 namespace 和 cgroup 技术,它们分别实现了进程隔离和资源限制。
虚拟化技术的演进
- 硬件虚拟化:最早的虚拟化技术,依靠硬件层面的支持来实现多个操作系统实例的运行。
- 软件虚拟化:利用软件技术,在单个操作系统内运行多个独立的虚拟机,每个虚拟机都有独立的操作系统和应用。
- 容器化:容器化技术进一步优化了资源利用率,通过共享主机的操作系统内核,实现轻量级的虚拟化。Docker 作为容器化技术的代表,极大地简化了应用的开发、测试和部署流程。
Docker 的安装
日常我们安装的 Docker 版本通常为 Docker Community Edition (Docker CE),这是由开源社区维护的版本。此外,还有一个企业版 Docker Enterprise Edition (Docker EE),由 Docker 官方提供支持和维护。
国内安装方法
在国内,推荐使用阿里云镜像源和清华镜像源进行 Docker 的安装,以提高下载速度和稳定性。
Docker 的配置
Docker 的配置文件位于 /etc/docker/daemon.json
,以下是一个常见的配置示例:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"], // 配置 Docker 暴露地址
"log-level": "info", // 日志等级
"data-root": "/var/lib/docker", // 存储位置
"storage-driver": "overlay2", // 文件系统
"insecure-registries": ["myregistry.local:5000"], // 免认证镜像仓库
"registry-mirrors": [ // 加速镜像地址
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.m.daocloud.io"
],
"exec-opts": [
"native.cgroupdriver=systemd" // 执行操作
]
}
Docker 常用命令
-
docker pull:拉取镜像
docker pull ubuntu:latest
参数说明:
- ubuntu:latest:指定要拉取的镜像名称和标签。
-
docker build:构建镜像
docker build -t myimage:1.0 . ## . 会直接寻找当前文件夹的 Dockerfile
参数说明:
- -t myimage:1.0:指定构建后的镜像名称和标签。
- .:指定 Dockerfile 所在目录。
-
docker tag:修改镜像标签
docker tag myimage:1.0 myimage:latest
参数说明:
- myimage:1.0:源镜像名称和标签。
- myimage:latest:目标镜像名称和标签。
-
docker push:推送镜像
docker push myimage:latest
参数说明:
- myimage:latest:要推送的镜像名称和标签。
-
docker run:运行镜像
docker run -d -p 8080:80 myimage:latest
参数说明:
- -d:后台运行容器。
- -p 8080:80:端口映射,将主机的 8080 端口映射到容器的 80 端口。
- myimage:latest:要运行的镜像名称和标签。
-
docker system prune -a:清理 Docker 无用的网络、镜像和卷
-
docker inspect:查看容器的详细信息
Dockerfile
Dockerfile 是一个文本文件,用来记录构建镜像的过程。以下是一个简单的 Dockerfile 示例:
# 使用官方的 Python 镜像作为基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录的内容到工作目录
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 指定容器启动时运行的命令
CMD ["python", "app.py"]
Dockerfile 指令说明:
- FROM:指定基础镜像。
- WORKDIR:设置工作目录。
- COPY:复制文件到容器。
- RUN:运行命令以构建镜像。
- CMD:指定容器启动时运行的命令。
- LABEL:添加元数据到镜像,例如版本、维护者信息等。
- ENV:设置环境变量。
- EXPOSE:声明容器暴露的端口。
- ADD:类似于 COPY,但功能更强大,可以从 URL 下载文件并自动解压 tar 文件。
- ENTRYPOINT:配置容器启动时执行的主命令,与 CMD 配合使用,不会被 docker run 命令给覆盖
- VOLUME:创建挂载点,允许持久化存储。
- USER:指定运行容器的用户。
- ARG:定义构建参数,在构建时传递变量。
其中特别要注意 ENTRYPOINT 与 CMD 的区别:
- CMD 指令用来指定容器启动时的默认命令或参数,但可以在 docker run 命令行中被覆盖。如果 Dockerfile 中存在多个 CMD 指令,则只有最后一个生效。
- ENTRYPOINT 指令用来设置容器启动时的主命令,且不会被 docker run 命令行中指定的参数覆盖。它通常与 CMD 配合使用,用于提供默认参数。即使 Dockerfile 中存在多个 ENTRYPOINT 指令,也只有最后一个生效。
通过以上指令,可以一步步构建出定制化的 Docker 镜像,从而实现应用的轻松部署和扩展。
结语
Docker 通过其强大的虚拟化技术和丰富的生态系统,极大地简化了应用的开发、测试和部署流程,使得软件工程师能够更加高效地进行工作。了解 Docker 的基础知识和常用操作,能够帮助我们更好地利用这一工具,提高工作效率。