Docker 通过提供轻量级、可移植且高效的解决方案,简化了软件开发和部署。“docker build”命令是 Docker 镜像创建过程的核心。本文将探讨 Docker 构建命令、用法以及 Docker 构建的优化。
Docker 构建有什么作用?
Docker build 是一个命令行界面 CLI命令,允许你根据 Dockerfile 中指定的指令构建 Docker镜像。它使镜像创建过程自动化,确保了一致性和可重复性。
Docker 构建是如何工作的?
Docker 构建通过执行 Dockerfile 中的指令序列来创建镜像。这些指令包括复制文件、安装依赖项和执行命令等操作。当运行 docker build 命令时,Docker 守护进程会逐条读取并执行 Dockerfile 中的指令,每条指令都会生成一个轻量级的只读层。这些层被堆叠起来,形成最终的镜像。
为了提高效率,Docker 会缓存那些自上次构建以来未发生变化的层,这样在后续的构建中就可以直接使用这些缓存层,而无需重新构建,从而大幅缩短构建时间。
完成所有指令后,Docker 将生成一个包含应用程序及其所有依赖项的最终镜像,这个镜像随时准备被用来运行容器。
安装 Docker
安装必要的依赖包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加 Docker APT 源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
更新软件包索引
sudo apt-get update
安装 Docker CE (社区版)
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
验证 Docker 是否安装成功
sudo docker --version
Docker version 24.0.5, build 12345678
启动并设置 Docker 开机自启
sudo systemctl start docker
sudo systemctl enable docker
将当前用户加入 docker 用户组
默认情况下,只有 root 用户或 docker 用户组的成员才能运行 Docker 命令。如果您希望当前用户无需使用 sudo 即可运行 Docker,可以将用户加入 docker 用户组:
sudo usermod -aG docker $USER
然后重新登录终端或重启系统以使更改生效。
检查 Docker 服务是否正在运行:
sudo reboot #重启
sudo systemctl status docker
测试 Docker
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
- 该命令会从 Docker Hub 上拉取
hello-world
镜像,并在容器中运行。 - 如果成功,会在终端中看到一段欢迎信息。
安装docker-compose
docker-compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose,你可以使用 YAML 文件来配置应用程序的服务、网络和卷。它简化了复杂应用的配置和启动过程,使得管理和部署多个相互依赖的容器变得非常简单。
# 删除旧版本(如果有)
sudo rm -f /usr/local/bin/docker-compose
#离线安装
wget -c --no-check-certificate https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-Linux-x86_64
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# 或者使用阿里云镜像源下载
sudo curl -L "https://mirrors.aliyun.com/docker-toolbox/linux/compose/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 检查下载内容是否为二进制文件
file /usr/local/bin/docker-compose
#/usr/local/bin/docker-compose: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=..., not stripped
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
在docker-compose.yml文件所在目录,运行容器服务
docker-compose up
docker-compose.yml 文件详解
docker-compose.yml 文件用于定义服务、网络和卷。这个文件使用 YAML 格式编写,并且可以通过它来描述多个容器之间的关系以及它们的配置。下面是一个详细的解释,帮助你理解如何编写和使用 docker-compose.yml 文件。
version: '3.4'
services:
project:
image: shanghai.aliyuncs.com/hyperf-work/skeleton:hyperf-7.4
container_name: test-api
restart: always
ports:
- "9005:8080"
volumes:
- ./:/www
entrypoint: ["php", "/www/bin/hyperf.php", "start"]
#entrypoint: ["sleep", "3600"]
networks:
- manage-v3-api
networks:
test-api:
driver: bridge
- image: 使用的镜像地址,这里是阿里云的一个私有镜像仓库中的 Hyperf 项目镜像。
- container_name: 容器名称,命名为 test-api。
- build: 如果需要从 Dockerfile 构建镜像,可以指定路径。
- depends_on: 表示依赖的服务,但请注意这不会等待直到依赖服务完全启动。
- restart: 设置容器重启策略为 always,即无论退出状态如何,Docker 都会自动重启该容器。
- environment: 设置环境变量。
- ports: 端口映射,将主机的 9005 端口映射到容器的 8080 端口。可以使用9005或者8080访问
- volumes: 卷挂载,将当前目录(.)挂载到容器内的 /www 目录。
- command: 覆盖默认的命令
- entrypoint: 容器启动时执行的命令,这里是启动 Hyperf 应用。
- networks: 容器连接的网络,指定为 test-api 网络。
- test-api: 定义了一个名为 test-api 的自定义网络,使用 bridge 网络驱动。