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目前有两个主要版本:
- 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 # 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
解决方案:
- 检查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 docker
5.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 docker
6.2 开发环境技巧
- 使用docker-compose.override.yml :为开发环境定制特殊配置,不会影响生产配置
- 利用缓存加速构建 :合理设计Dockerfile的指令顺序,把变化少的层放在前面
- 交互式调试 :
# 进入运行中的容器
docker exec -it container_name /bin/bash
# 查看实时日志
docker-compose logs -f service_name
6.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正是实现这一目标的完美工具。
更多推荐
所有评论(0)