1. Ubuntu系统安装Docker完整指南
Docker作为当前最流行的容器化技术,已经成为开发者和运维人员的标配工具。在Ubuntu系统上安装Docker看似简单,但实际过程中可能会遇到各种依赖问题、版本冲突和配置难题。本文将详细介绍在Ubuntu 18.04/20.04/22.04 LTS版本上安装Docker CE(社区版)的完整流程,包括不同安装方式的对比、常见问题的解决方案以及生产环境的最佳实践。
1.1 准备工作
在开始安装之前,需要确保你的Ubuntu系统满足以下基本要求:
- 64位x86架构CPU(可通过
uname -m命令查看) - 内核版本3.10或更高(通过
uname -r检查) - 至少2GB可用磁盘空间
- 稳定的网络连接
建议先更新系统软件包:
bash复制sudo apt update && sudo apt upgrade -y
注意:生产环境中建议使用LTS(长期支持)版本的Ubuntu系统,目前主流支持版本包括18.04、20.04和22.04。非LTS版本可能会遇到兼容性问题。
1.2 安装方法对比
Ubuntu系统上安装Docker主要有三种方式:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 官方仓库安装 | 版本新,更新及时 | 需要手动添加仓库 | 大多数情况推荐 |
| deb包手动安装 | 可离线安装 | 依赖管理复杂 | 无网络环境 |
| 脚本自动安装 | 简单快捷 | 安全性风险 | 测试环境快速搭建 |
对于生产环境,强烈建议使用官方仓库安装方式,这也是本文主要介绍的方法。
2. 通过官方仓库安装Docker
2.1 卸载旧版本
如果系统中存在旧版Docker(可能被称为docker、docker.io或docker-engine),需要先彻底卸载:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
残留的配置文件也需要清理:
bash复制sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
2.2 设置Docker仓库
- 安装必要的依赖包:
bash复制sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加Docker官方GPG密钥:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置稳定版仓库:
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
提示:如果使用非稳定版(如测试版或夜间构建版),可以将上述命令中的"stable"替换为"test"或"nightly"。
2.3 安装Docker引擎
更新apt包索引并安装最新版Docker:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
如果需要安装特定版本,可以先列出可用版本:
bash复制apt-cache madison docker-ce
然后选择安装特定版本(以5:20.10.12~3-0~ubuntu-focal为例):
bash复制sudo apt install -y docker-ce=5:20.10.12~3-0~ubuntu-focal docker-ce-cli=5:20.10.12~3-0~ubuntu-focal containerd.io
2.4 验证安装
安装完成后,运行hello-world镜像验证:
bash复制sudo docker run hello-world
如果看到"Hello from Docker!"的输出信息,说明安装成功。
3. 配置与管理
3.1 用户权限配置
默认情况下,docker命令需要sudo权限。为了避免每次都要输入sudo,可以将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
然后退出当前会话重新登录使更改生效。
安全提示:docker组实际上具有root权限,因此只应信任的用户加入该组。
3.2 服务管理
Docker安装后会自动启动并启用开机自启。如果需要手动管理服务状态:
bash复制# 启动Docker服务
sudo systemctl start docker
# 停止Docker服务
sudo systemctl stop docker
# 重启Docker服务
sudo systemctl restart docker
# 查看Docker服务状态
sudo systemctl status docker
# 设置开机自启
sudo systemctl enable docker
3.3 配置镜像加速
国内用户访问Docker Hub可能会很慢,可以配置国内镜像加速器。以阿里云为例:
- 登录阿里云容器镜像服务控制台获取加速器地址
- 创建或修改/etc/docker/daemon.json文件:
json复制{
"registry-mirrors": ["https://<your-aliyun-mirror>.mirror.aliyuncs.com"]
}
- 重启Docker服务使配置生效:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
4. 常见问题与解决方案
4.1 安装过程中的常见错误
问题1:依赖关系不满足
code复制The following packages have unmet dependencies:
docker-ce : Depends: containerd.io (>= 1.4.1) but 1.2.6-0ubuntu1 is to be installed
解决方案:先安装新版containerd.io
bash复制sudo apt install -y containerd.io
问题2:GPG密钥错误
code复制The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX
解决方案:重新导入GPG密钥
bash复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXXXXXXXXXX
4.2 运行时的常见问题
问题1:无法连接到Docker守护进程
code复制Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方案:确保Docker服务已启动
bash复制sudo systemctl start docker
问题2:存储驱动问题
code复制Error starting daemon: error initializing graphdriver: driver not supported
解决方案:修改存储驱动为overlay2(编辑/etc/docker/daemon.json)
json复制{
"storage-driver": "overlay2"
}
4.3 性能优化建议
- 日志轮转:防止日志文件过大
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 存储优化:对于生产环境,建议使用direct-lvm存储驱动
- 网络优化:根据需求选择合适的网络驱动(bridge、host、macvlan等)
5. 进阶配置与使用
5.1 使用Docker Compose
Docker Compose是管理多容器应用的工具,安装方法:
bash复制sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
bash复制docker-compose --version
5.2 安全加固建议
- 定期更新Docker版本
- 限制容器资源使用(CPU、内存等)
- 使用非root用户运行容器
- 启用内容信任(DOCKER_CONTENT_TRUST=1)
- 定期审计容器和镜像
5.3 监控与日志
推荐使用以下工具监控Docker环境:
- cAdvisor:容器资源监控
- Prometheus + Grafana:监控和可视化
- ELK Stack:日志收集和分析
6. 卸载Docker
如果需要完全卸载Docker及其相关组件:
bash复制sudo apt purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
同时删除镜像、容器、卷和网络等残留文件:
bash复制sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
7. 实际应用案例
7.1 开发环境搭建
使用Docker快速搭建LNMP开发环境:
- 创建docker-compose.yml文件
yaml复制version: '3'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:7.4-fpm
volumes:
- ./php.ini:/usr/local/etc/php/conf.d/custom.ini
- ./html:/var/www/html
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: userpass
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
- 启动服务
bash复制docker-compose up -d
7.2 CI/CD流水线集成
在Jenkins等CI/CD工具中使用Docker:
groovy复制pipeline {
agent {
docker {
image 'maven:3.8.4-jdk-11'
args '-v $HOME/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
8. 性能调优与最佳实践
8.1 资源限制
合理设置容器资源限制可以防止单个容器占用过多资源:
bash复制docker run -it --cpus=".5" --memory="512m" --memory-swap="1g" ubuntu
8.2 存储驱动选择
根据文件系统类型选择合适的存储驱动:
| 文件系统 | 推荐驱动 | 备注 |
|---|---|---|
| ext4/xfs | overlay2 | 默认推荐 |
| btrfs | btrfs | 需要特定配置 |
| zfs | zfs | 需要额外插件 |
8.3 网络优化
对于高性能网络需求,可以考虑:
- 使用host网络模式减少NAT开销
- 配置macvlan实现直接物理网络访问
- 使用SR-IOV技术实现高性能网络
9. 容器安全实践
9.1 镜像安全扫描
定期扫描镜像中的漏洞:
bash复制docker scan <image-name>
9.2 最小权限原则
使用非root用户运行容器:
bash复制docker run -u 1000:1000 my-image
9.3 只读文件系统
尽可能以只读模式运行容器:
bash复制docker run --read-only my-image
10. 故障排查技巧
10.1 查看容器日志
bash复制docker logs <container-id>
10.2 进入运行中的容器
bash复制docker exec -it <container-id> /bin/bash
10.3 检查容器资源使用
bash复制docker stats <container-id>
10.4 分析容器配置
bash复制docker inspect <container-id>
11. 版本升级策略
11.1 小版本升级
对于Docker CE的小版本升级(如20.10.12 → 20.10.13),可以直接使用包管理器:
bash复制sudo apt update
sudo apt upgrade
11.2 大版本升级
对于大版本升级(如19.03 → 20.10),建议:
- 备份重要容器和数据
- 查看官方升级文档
- 按新版要求准备系统环境
- 卸载旧版后安装新版
- 验证兼容性
12. 生产环境建议
- 使用容器编排工具:如Kubernetes或Docker Swarm管理生产集群
- 实现高可用:部署多个Docker守护进程实例
- 集中日志收集:使用ELK或类似方案
- 监控告警:配置资源使用告警
- 定期备份:备份重要的卷数据
13. 替代方案比较
除了Docker CE,Ubuntu上还可以考虑:
| 方案 | 特点 | 适用场景 |
|---|---|---|
| Podman | 无守护进程,rootless | 开发环境,安全敏感场景 |
| LXC/LXD | 系统容器 | 需要完整系统环境 |
| Containerd | 底层容器运行时 | 作为Kubernetes运行时 |
14. 未来发展趋势
- Wasm容器:WebAssembly作为容器运行时
- 机密计算容器:增强安全隔离
- 边缘容器:优化边缘计算场景
- 绿色容器:降低资源消耗
15. 学习资源推荐
- 官方文档:https://docs.docker.com/
- Docker Mastery课程(Udemy)
- 《Docker Deep Dive》书籍
- Docker官方博客和社区论坛
在实际使用中,我发现定期清理无用镜像和容器可以显著节省磁盘空间。建议设置定时任务执行以下命令:
bash复制# 清理停止的容器、无用网络和悬空镜像
docker system prune -f
# 清理所有无用镜像(包括未被容器引用的)
docker system prune -a -f
