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.repo3.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 docker3.3 验证安装
运行hello-world镜像测试:
sudo docker run hello-world如果看到欢迎信息,说明docker-ce已正确安装。此时可以执行docker version查看详细版本信息。
避坑提示:很多教程会建议把用户加入docker组来免sudo运行,但这会带来安全风险。生产环境建议保持sudo,或者配置更精细的权限控制。
4. 安装docker-compose编排工具
4.1 版本选择策略
docker-compose目前有两个主要版本:
- v1:经典的Python实现,最新版本1.29.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 # v24.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-compose5. 典型问题排查指南
5.1 网络拉取失败
错误现象:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled
解决方案:
- 检查DNS配置,可以尝试改用8.8.8.8
- 国内服务器建议配置镜像加速器:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] } EOF sudo systemctl restart docker5.2 权限拒绝问题
错误现象:Got permission denied while trying to connect to the Docker daemon socket
正确做法不是盲目修改权限,而是:
- 使用sudo前缀
- 或者为特定用户配置精细控制:
sudo groupadd docker sudo usermod -aG docker $USER newgrp docker # 立即生效5.3 compose版本兼容问题
错误现象:Unsupported config option for services...
这是因为v1和v2的语法有差异。解决方法:
- 确认文件使用的compose版本(顶部
version:字段) - 或者统一迁移到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 docker6.2 开发环境技巧
- 使用docker-compose.override.yml:为开发环境定制特殊配置,不会影响生产配置
- 利用缓存加速构建:合理设计Dockerfile的指令顺序,把变化少的层放在前面
- 交互式调试:
# 进入运行中的容器 docker exec -it container_name /bin/bash # 查看实时日志 docker-compose logs -f service_name6.3 安全加固措施
- 定期审计容器漏洞:
docker scan image_name - 避免使用root用户运行容器:在Dockerfile中添加
USER nobody - 只映射必要的端口:
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正是实现这一目标的完美工具。