1. 为什么选择Docker?
Docker作为当前最流行的容器化解决方案,已经成为现代开发和运维的标配工具。它通过轻量级的容器技术,实现了应用程序与底层系统的解耦,让开发环境、测试环境和生产环境保持高度一致。我在多个生产环境中使用Docker已有五年经验,可以说它彻底改变了我们部署应用的方式。
在Ubuntu上安装Docker有几个显著优势:
- Ubuntu作为最流行的Linux发行版之一,对Docker有官方支持
- apt包管理器让安装过程变得极其简单
- 社区支持强大,遇到问题容易找到解决方案
注意:虽然Podman也是一个不错的容器工具,但Docker仍然是企业环境中的主流选择,特别是在CI/CD流水线中。
2. 安装前的准备工作
2.1 系统要求检查
在开始安装前,建议先检查你的Ubuntu系统版本。Docker需要64位版本的Ubuntu,并且要求内核版本至少为3.10。可以通过以下命令检查:
bash复制uname -r
lsb_release -a
我建议使用Ubuntu 20.04 LTS或更高版本,因为这些长期支持版本有更稳定的软件源。在我的实践中,遇到过在旧版Ubuntu上安装Docker时出现的各种依赖问题,升级系统后这些问题都迎刃而解。
2.2 清理可能的旧版本
如果你之前尝试安装过Docker,或者系统中有残留的Docker组件,最好先进行清理:
bash复制sudo apt-get remove docker docker-engine docker.io containerd runc
这个步骤很重要,因为残留的旧版本可能会导致冲突。我曾经因为跳过这个步骤,导致新安装的Docker无法正常启动,浪费了两个小时排查问题。
2.3 更新系统包
安装任何新软件前,更新系统包是个好习惯:
bash复制sudo apt-get update
sudo apt-get upgrade -y
这个步骤确保你获取的是最新的软件包和安全补丁。在团队协作环境中,保持所有开发机的系统更新状态一致,可以避免很多"在我机器上能运行"的问题。
3. Docker安装方法详解
3.1 使用官方仓库安装(推荐)
这是我最推荐的安装方式,能确保获取最新且稳定的Docker版本:
bash复制# 安装必要的依赖
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
这种方法虽然步骤稍多,但有以下优势:
- 直接从Docker官方获取软件包,版本最新
- 后续更新更方便
- 可以明确选择安装特定版本
3.2 使用Ubuntu仓库安装
如果你需要快速安装,可以使用Ubuntu自带的仓库:
bash复制sudo apt-get install docker.io
这是原文中提到的方法,简单快捷。但需要注意:
- 版本可能不是最新的
- 某些新功能可能不可用
- 在Ubuntu 18.04上,这个方式安装的是Docker 18.09.7
在我的测试中,Ubuntu仓库提供的Docker版本通常比官方仓库落后6-12个月。对于生产环境,我建议还是使用官方仓库。
3.3 安装Podman-docker(备选方案)
原文中还提到了podman-docker,这是一个Docker兼容层:
bash复制sudo apt-get install podman-docker
Podman是一个不需要守护进程的容器引擎,在某些场景下是Docker的替代品。安装podman-docker包会创建一个docker命令行别名,实际调用的是podman。
提示:如果你只是想运行Docker命令而不想安装完整的Docker引擎,这是一个轻量级的选择。但在需要完整Docker功能的场景下(如使用Docker Compose),可能会遇到兼容性问题。
4. 安装后的配置与验证
4.1 启动Docker服务
安装完成后,需要启动Docker守护进程:
bash复制sudo systemctl start docker
sudo systemctl enable docker
第二行命令确保Docker在系统启动时自动运行。这是很多初学者容易忽略的步骤,导致重启后Docker没有自动启动。
4.2 验证安装
验证Docker是否正确安装:
bash复制sudo docker run hello-world
这个命令会下载一个测试镜像并运行它。如果看到"Hello from Docker!"的消息,说明安装成功。我第一次成功运行这个命令时,那种成就感至今难忘。
4.3 非root用户权限配置(重要)
默认情况下,运行Docker命令需要sudo权限。为了方便日常使用,可以将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker
这个配置非常重要但容易被忽视。我曾经因为忘记做这一步,在自动化脚本中频繁遇到权限问题。配置后需要注销并重新登录才能生效。
5. 常见问题与解决方案
5.1 安装过程中断或失败
如果安装过程中出现错误,可以尝试:
- 检查网络连接是否正常
- 确保系统已更新(sudo apt update && sudo apt upgrade)
- 清理之前的安装尝试(sudo apt autoremove)
5.2 Docker服务无法启动
如果遇到Docker无法启动的情况:
bash复制# 查看服务状态
sudo systemctl status docker
# 查看详细日志
journalctl -xe
常见原因包括:
- 端口冲突(如已有其他服务占用Docker端口)
- 存储驱动不兼容
- 内核模块未加载
5.3 镜像拉取速度慢
国内用户可能会遇到拉取镜像速度慢的问题,可以配置镜像加速器:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<你的镜像加速器地址>"]
}
EOF
sudo systemctl restart docker
常用的镜像加速器包括阿里云、腾讯云等提供的服务。这个优化可以让镜像下载速度提升10倍以上。
6. 进阶配置与优化
6.1 修改Docker数据存储位置
默认情况下,Docker将镜像和容器存储在/var/lib/docker目录。如果这个分区空间不足,可以修改存储位置:
bash复制sudo systemctl stop docker
sudo mv /var/lib/docker /新的位置
sudo ln -s /新的位置/docker /var/lib/docker
sudo systemctl start docker
我在处理一个大型项目时,曾因为默认存储空间不足导致构建失败,后来通过这个方法解决了问题。
6.2 配置Docker日志轮转
Docker容器日志可能会占用大量磁盘空间,建议配置日志轮转:
bash复制sudo tee /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker
这个配置会限制每个容器的日志文件最大为10MB,最多保留3个文件。在生产环境中,这个设置可以避免日志占满磁盘。
6.3 内存和CPU限制
在多容器环境中,合理分配资源很重要:
bash复制# 运行容器时限制资源
docker run -it --cpus="1.5" --memory="512m" ubuntu
这些限制可以防止单个容器占用过多资源影响其他服务。在我的经验中,合理的资源限制能让系统更加稳定。