1. 从手工安装到自动化构建:Docker 落地最该关注什么

Docker 真正落地时,最该先弄清楚的不是功能列表,而是从单机手工安装到批量自动化构建的完整路径。很多人在手工安装阶段就卡在权限、镜像源或依赖冲突上,更别说后续的镜像构建和编排部署了。这篇文章我会按实际落地顺序,把手工安装、镜像加速、权限配置、Dockerfile 构建、Compose 编排这几个关键环节的实操细节和避坑点拆清楚。

手工安装 Docker 最容易出问题的地方往往不是命令本身,而是系统环境残留、镜像源不可用或权限配置遗漏。而自动化构建的核心也不在于 Dockerfile 语法多熟练,而是如何把应用依赖、环境变量、文件路径和启动顺序一次性打包清楚。下面我会先带你在主流 Linux 发行版上把 Docker 服务跑起来,再一步步走到多服务编排的自动化部署。

2. 手工安装阶段:重点看系统适配和镜像加速

2.1 环境清理:避免旧版本冲突

无论你用 CentOS、Ubuntu 还是其他 Linux 发行版,安装新版 Docker 前一定要先清理可能存在的旧版本。残留的旧版本不仅会导致依赖冲突,还可能让新装的服务无法正常启动。

在 CentOS/RHEL 系列系统上,清理命令包括删除旧版软件包和配置文件:

# 删除 Docker 相关源
sudo rm -f /etc/yum.repos.d/docker*.repo

# 卸载旧版 Docker 和关联软件包
sudo yum -y remove docker-ce containerd.io docker-ce-cli docker-compose-plugin

在 Ubuntu/Debian 系列上,则需要用 apt 清理:

# 删除 Docker 相关源
sudo rm -f /etc/apt/sources.list.d/*docker*.list

# 卸载旧版软件包
for pkg in docker.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin; do
    sudo apt-get remove -y $pkg
done

清理完成后,建议重启系统或至少重启网络服务,确保环境干净。很多人忽略这一步,直接安装新版本,结果遇到各种难以排查的依赖错误。

2.2 系统特定的安装细节

不同 Linux 发行版的包管理器和软件源配置方式不同,安装时需要关注系统特定的细节。

CentOS 7/8 注意事项:

  • CentOS 7 默认用 yum,CentOS 8 用 dnf,但命令结构基本一致
  • 需要先配置正确的软件源,特别是 CentOS 8 的源已经下线,要用阿里云等替代源
  • 安装时建议同时安装 docker-ce、docker-ce-cli、containerd.io 和 docker-compose-plugin,避免后续单独安装的兼容性问题

Ubuntu 20.04+ 注意事项:

  • 需要先安装 apt-transport-https、ca-certificates 等基础依赖
  • GPG 密钥配置方式有变化,建议使用 keyrings 目录管理
  • 对于 Ubuntu 24.04 (noble) 等新版本,Docker 官方源可能还未完全适配,需要选择兼容的稳定版源

阿里云生态系统的特殊处理:

  • 阿里云帮助文档中提到的 http://mirrors.cloud.aliyuncs.com 是内网地址,非阿里云服务器需要替换为 https://mirrors.aliyun.com
  • 如果遇到网络问题,优先检查实例是否已开通公网访问权限

2.3 镜像加速器配置:解决拉取失败问题

国内网络直接拉取 Docker Hub 镜像经常失败或速度极慢,配置镜像加速器是必做步骤。阿里云、腾讯云、华为云等都提供免费的镜像加速服务。

配置方法是在 /etc/docker/daemon.json 中添加 registry-mirrors:

{
    "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
}

配置后需要重启 Docker 服务生效:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置是否生效可以执行 docker info ,在输出中查看 Registry Mirrors 部分。需要注意的是, docker search 命令仍然会直接查询 Docker Hub,在国内网络环境下可能失败,这是正常现象。

3. 权限和服务管理:让 Docker 用起来更顺手

3.1 非 root 用户权限配置

默认情况下,Docker 命令需要 root 权限,每次都要加 sudo 很不方便。更安全便捷的做法是将当前用户添加到 docker 用户组:

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 生效组权限(需要重新登录或执行以下命令)
newgrp docker

配置完成后,当前用户就可以直接使用 docker 命令而不需要 sudo 了。这是生产环境的标准做法,既方便又符合最小权限原则。

3.2 服务启动和开机自启

安装完成后需要启动 Docker 服务并设置开机自启:

# 启动 Docker 服务
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

# 检查服务状态
sudo systemctl status docker

正常运行的 Docker 服务应该显示 active (running) 状态。如果启动失败,可以查看详细日志:

# 查看 Docker 服务日志
sudo journalctl -u docker.service -f

常见的启动失败原因包括:内核版本过低、存储驱动不兼容、磁盘空间不足、端口冲突等。

3.3 基础验证和故障排查

安装完成后建议用 hello-world 镜像验证基本功能:

docker run hello-world

如果出现权限错误,检查用户是否在 docker 组中;如果出现网络超时,检查镜像加速器配置;如果镜像拉取失败,尝试手动配置 DNS 或检查网络连接。

对于 "Cannot connect to the Docker daemon" 错误,通常是因为 Docker 服务没有启动,或者当前用户没有连接 Docker socket 的权限。

4. 从手工操作到 Dockerfile 自动化构建

4.1 理解 Dockerfile 的核心价值

手工安装完成后,下一步就是学会用 Dockerfile 自动化构建镜像。Dockerfile 的本质是一个构建脚本,它把应用运行所需的环境、依赖、配置和启动命令全部代码化。

一个典型的 Web 应用 Dockerfile 示例:

FROM nginx:latest
RUN echo 'Hello World!' > /usr/share/nginx/html/index.html
EXPOSE 80

这个简单的 Dockerfile 做了三件事:

  1. 基于 nginx 官方镜像
  2. 创建自定义的首页内容
  3. 声明容器暴露的端口

4.2 构建镜像的关键参数

使用 docker build 命令构建镜像时,有几个关键参数需要注意:

# 基本构建命令
docker build -t my-app:latest .

# 带构建缓存的优化命令
docker build --build-arg ENV=production -t my-app:prod .

# 多阶段构建(适合复杂应用)
docker build -f Dockerfile.multi-stage -t my-app:optimized .

-t 参数为镜像打标签,便于后续识别和管理。点号表示使用当前目录作为构建上下文,Docker 会把上下文中的所有文件发送给守护进程,所以要注意 .dockerignore 文件的使用,避免发送不必要的文件。

4.3 镜像构建的最佳实践

基于多年的踩坑经验,我总结了几条镜像构建的最佳实践:

分层优化:

  • 把变化频率低的指令放在前面,利用构建缓存
  • 合并多个 RUN 指令减少镜像层数
  • 使用多阶段构建减小最终镜像体积

安全考虑:

  • 不要使用 root 用户运行应用
  • 定期更新基础镜像中的安全补丁
  • 扫描镜像中的漏洞依赖

可维护性:

  • 使用明确的标签版本而不是 latest
  • 在 Dockerfile 中添加 LABEL 说明信息
  • 保持构建环境与运行环境一致

5. Docker Compose:多服务编排的自动化方案

5.1 为什么需要 Compose

当应用包含多个服务(如 Web 服务器 + 数据库 + 缓存)时,手工管理每个容器的启动顺序、网络连接和环境变量变得非常复杂。Docker Compose 通过一个 YAML 文件定义整个应用栈,实现一键部署。

5.2 Compose 文件结构解析

一个典型的 WordPress 应用 docker-compose.yaml:

version: '3.8'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: wordpress
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

这个文件定义了两个服务之间的依赖关系、网络连接和数据持久化。关键要素包括:

  • services:定义各个容器服务
  • environment:配置环境变量
  • volumes:数据持久化
  • depends_on:服务启动顺序

5.3 Compose 实战命令

安装 Docker Compose 插件后,常用的管理命令:

# 启动所有服务(后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs -f wordpress

# 停止并删除所有容器
docker compose down

# 环境变量文件方式启动
docker compose --env-file .env up -d

使用环境变量文件(.env)管理敏感信息是生产环境的最佳实践,避免将密码等敏感信息硬编码在 Compose 文件中。

6. 生产环境的关键考量点

6.1 资源限制和监控

在生产环境中运行 Docker 必须设置资源限制,防止单个容器耗尽系统资源:

services:
  web:
    image: nginx:latest
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1.0'
        reservations:
          memory: 256M
          cpus: '0.5'

同时要配置日志轮转和监控,确保能够及时发现和处理问题:

# 查看容器资源使用情况
docker stats

# 查看容器日志
docker logs --tail 100 -f container_name

6.2 网络和存储规划

多容器应用的网络设计很重要,常见的模式包括:

  • bridge 网络:默认网络,容器间通过容器名通信
  • host 网络:容器直接使用主机网络栈
  • overlay 网络:跨主机的容器通信

数据持久化也需要提前规划:

  • bind mount:主机目录挂载,适合开发环境
  • volume:Docker 管理的存储卷,适合生产环境
  • tmpfs:内存文件系统,适合临时数据

6.3 健康检查和自愈机制

生产环境容器需要配置健康检查,确保服务真正可用:

services:
  web:
    image: nginx:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

结合 restart 策略,可以实现基本的自愈能力:

restart: unless-stopped

7. 常见问题排查手册

7.1 安装阶段问题

镜像拉取失败:

  • 检查镜像加速器配置是否正确
  • 确认网络连接正常,DNS 解析无误
  • 尝试手动指定镜像版本而不是 latest

权限错误:

  • 确认用户已加入 docker 组
  • 检查 /var/run/docker.sock 文件权限
  • 重新登录使组权限生效

服务启动失败:

  • 查看 systemctl status docker 详细错误信息
  • 检查内核版本是否满足要求(3.10+)
  • 确认没有端口冲突或其他服务占用

7.2 运行时问题

容器启动后立即退出:

  • 检查容器内应用启动命令是否正确
  • 查看容器日志 docker logs container_name
  • 确认环境变量和配置文件路径无误

容器间网络不通:

  • 确认使用相同的 Docker 网络
  • 检查防火墙规则是否阻止通信
  • 验证容器名称解析是否正常

磁盘空间不足:

  • 定期清理无用镜像和容器 docker system prune
  • 检查 volume 和镜像占用的磁盘空间
  • 设置日志轮转策略避免日志文件过大

7.3 性能优化问题

构建速度慢:

  • 利用构建缓存,合理安排 Dockerfile 指令顺序
  • 使用 .dockerignore 减少构建上下文大小
  • 考虑使用构建缓存镜像或本地镜像仓库

运行时资源占用高:

  • 设置合理的资源限制
  • 监控容器资源使用情况,及时调整限制值
  • 考虑使用更轻量的基础镜像

从手工安装到自动化构建,Docker 的真正价值在于把应用环境标准化、代码化。我建议先花时间把基础环境搭稳,再逐步推进到 Dockerfile 和 Compose 的自动化流程。实际落地时,最该关注的不是功能有多全,而是整个流程的可靠性和可维护性。

更多推荐