三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Docker-CE与Docker-Compose安装指南及最佳实践

Docker-CE与Docker-Compose安装指南及最佳实践

1. 为什么需要同时安装docker-ce和docker-compose?

在容器化技术普及的今天,Docker已经成为开发者必备的工具链组成部分。但很多刚接触容器技术的新手常常会困惑:为什么官方文档总是把docker-ce(社区版引擎)和docker-compose(多容器编排工具)分开说明?这两者之间到底是什么关系?

简单来说,docker-ce就像汽车的发动机,而docker-compose则是整车的控制系统。没有引擎,车辆根本无法启动;但只有引擎没有控制系统,你也无法高效驾驶。在实际开发中,约83%的Docker使用者会同时用到这两个组件,特别是在微服务架构下,一个应用往往由多个容器组成,这时docker-compose的编排能力就变得不可或缺。

我经历过从手动管理单个容器到使用compose编排的完整进化过程。早期每次启动服务都要手动输入一长串docker run命令,不仅容易出错,团队间也难以共享配置。直到采用了docker-compose,所有服务依赖和配置都能用声明式的YAML文件管理,效率提升了至少5倍。这也是为什么我强烈建议任何学习Docker的人从一开始就掌握这两个工具的配合使用。

2. 环境准备与依赖检查

2.1 系统兼容性确认

在开始安装前,首先要确认你的系统环境。目前主流的Linux发行版都能完美支持Docker,但不同系统需要不同的安装方式:

  • Ubuntu:最友好的Docker平台,官方提供.deb包
  • CentOS/RHEL:需配置EPEL仓库,注意SELinux的影响
  • Debian:与Ubuntu类似,但版本兼容性要特别注意
  • Windows/macOS:使用Docker Desktop更简单(本文主要针对Linux服务器环境)

重要提示:内核版本最好在4.x以上,运行uname -r查看。我曾在一台内核3.10的CentOS 7机器上遇到各种兼容性问题,最后不得不升级内核。

2.2 清理旧版本

如果你之前安装过Docker的旧版本(如docker.io或早期docker-engine),必须先彻底清理:

sudo apt-get remove docker docker-engine docker.io containerd runc sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd

这个步骤很多人会忽略,导致后续安装出现各种诡异问题。特别是/var/lib/docker目录,残留的镜像和容器数据可能造成冲突。

3. 安装docker-ce社区版

3.1 配置官方仓库

不同于直接下载安装包,我强烈建议通过官方仓库安装,这样可以确保后续获得安全更新:

# Ubuntu/Debian sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # CentOS/RHEL sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo

3.2 安装docker-ce核心组件

更新仓库后,安装最新稳定版:

# Ubuntu/Debian sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # CentOS/RHEL sudo yum install docker-ce docker-ce-cli containerd.io

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

sudo systemctl start docker sudo systemctl enable docker

3.3 验证安装

运行hello-world镜像测试:

sudo docker run hello-world

如果看到欢迎信息,说明docker-ce已正确安装。此时可以执行docker version查看详细版本信息。

避坑提示:很多教程会建议把用户加入docker组来免sudo运行,但这会带来安全风险。生产环境建议保持sudo,或者配置更精细的权限控制。

4. 安装docker-compose编排工具

4.1 版本选择策略

docker-compose目前有两个主要版本:

  1. v1:经典的Python实现,最新版本1.29.2
  2. v2:Go语言重写版,性能更好,内置在Docker CLI中

虽然v2是未来趋势,但很多老项目还在使用v1语法。我建议同时安装两个版本:

# 安装v2(作为Docker插件) sudo apt-get install docker-compose-plugin # 安装v1独立版本 sudo curl -L "https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

这样既可以使用docker compose(v2)命令,也能继续支持docker-compose(v1)的旧脚本。

4.2 验证compose安装

检查两个版本是否正常工作:

docker-compose --version # v1 docker compose version # v2

4.3 升级与维护

compose工具更新频繁,建议设置定期检查更新的机制。对于v1版本,可以创建自动更新脚本:

#!/bin/bash COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | cut -d'"' -f4) sudo curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

5. 典型问题排查指南

5.1 网络拉取失败

错误现象:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled

解决方案:

  1. 检查DNS配置,可以尝试改用8.8.8.8
  2. 国内服务器建议配置镜像加速器:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] } EOF sudo systemctl restart docker

5.2 权限拒绝问题

错误现象:Got permission denied while trying to connect to the Docker daemon socket

正确做法不是盲目修改权限,而是:

  1. 使用sudo前缀
  2. 或者为特定用户配置精细控制:
sudo groupadd docker sudo usermod -aG docker $USER newgrp docker # 立即生效

5.3 compose版本兼容问题

错误现象:Unsupported config option for services...

这是因为v1和v2的语法有差异。解决方法:

  1. 确认文件使用的compose版本(顶部version:字段)
  2. 或者统一迁移到v3+语法格式

6. 最佳实践建议

6.1 生产环境配置优化

安装完成后,建议调整这些关键参数:

# 限制日志大小防止磁盘爆满 sudo tee -a /etc/docker/daemon.json <<-'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF # 调整默认ulimit sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/limits.conf <<-'EOF' [Service] LimitNOFILE=65536 LimitNPROC=65536 EOF sudo systemctl daemon-reload sudo systemctl restart docker

6.2 开发环境技巧

  1. 使用docker-compose.override.yml:为开发环境定制特殊配置,不会影响生产配置
  2. 利用缓存加速构建:合理设计Dockerfile的指令顺序,把变化少的层放在前面
  3. 交互式调试
# 进入运行中的容器 docker exec -it container_name /bin/bash # 查看实时日志 docker-compose logs -f service_name

6.3 安全加固措施

  1. 定期审计容器漏洞:docker scan image_name
  2. 避免使用root用户运行容器:在Dockerfile中添加USER nobody
  3. 只映射必要的端口:ports:字段精确控制

7. 从安装到实战的过渡

完成基础安装后,我建议通过这个简单的compose文件快速验证整套环境:

version: '3.8' services: web: image: nginx:alpine ports: - "8080:80" db: image: postgres:13 environment: POSTGRES_PASSWORD: example

保存为docker-compose.yml后运行:

docker-compose up -d

访问http://localhost:8080 应该能看到Nginx欢迎页,同时PostgreSQL数据库也会在后台运行。这个简单的例子展示了compose如何一键启动多容器应用。

在实际项目中,你可能会遇到更复杂的场景,比如:

  • 容器间的网络通信
  • 数据卷持久化
  • 环境变量管理
  • 资源限制配置

这些都可以通过逐步扩展compose文件来实现。记住一个原则:所有基础设施配置都应该代码化(Infrastructure as Code),而docker-compose正是实现这一目标的完美工具。

← 返回列表