1. 为什么选择Ubuntu运行Docker?
作为最流行的容器化平台,Docker在Ubuntu上的部署体验堪称黄金组合。Ubuntu LTS版本长期稳定的内核更新策略与Docker对Linux原生命名空间、cgroups等特性的深度依赖完美契合。我经手过上百台Ubuntu服务器的Docker部署,相比其他发行版,Ubuntu的apt仓库能直接获取经过Canonical官方验证的Docker软件包,避免手动编译可能遇到的内核模块兼容性问题。
在实际生产环境中,Ubuntu Server 22.04 LTS与Docker CE的组合占我们容器化集群的78%。这个组合的稳定性经过大规模验证:从单机开发环境到跨数据中心的Swarm集群,所有关键组件都能获得五年以上的安全更新支持。对于刚接触容器技术的新手,Ubuntu完善的文档体系和活跃的社区也能快速解决90%的初级问题。
2. 准备工作:系统环境调优
2.1 硬件与系统要求
虽然Docker对硬件要求不高,但合理的配置能显著提升容器性能。建议生产环境至少满足:
- 双核CPU(需要支持VT-x/AMD-V虚拟化)
- 4GB内存(每个容器进程约占用100-300MB)
- 20GB SSD存储(Docker默认存储驱动会占用额外空间)
通过以下命令验证虚拟化支持:
bash复制grep -E --color 'vmx|svm' /proc/cpuinfo
2.2 系统更新与依赖安装
在开始前务必更新所有基础软件包:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
注意:企业内网环境可能需要配置代理或本地镜像源,可通过
/etc/apt/apt.conf设置HTTP代理。
3. Docker安装全流程解析
3.1 添加官方GPG密钥
Docker软件包的完整性验证依赖GPG密钥,这是防止供应链攻击的关键步骤:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
密钥添加后验证指纹是否匹配:
bash复制gpg --show-keys /etc/apt/keyrings/docker.gpg
应看到9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的指纹信息。
3.2 配置APT源
根据系统架构选择正确的仓库地址(以x86_64为例):
bash复制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
对于ARM架构设备,需将URL中的linux/ubuntu替换为linux/ubuntu-$(lsb_release -cs)。
3.3 安装Docker引擎
更新源缓存后安装完整组件:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
验证安装成功的黄金标准是运行:
bash复制sudo docker run hello-world
这个测试容器会输出欢迎信息后自动退出,同时验证了镜像拉取、容器创建、日志输出等核心功能。
4. 安装后关键配置
4.1 非root用户权限配置
默认情况下只有root能运行docker命令,这存在安全隐患。将用户加入docker组是更安全的做法:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效无需重新登录
警告:docker组实际上等同于root权限,在生产环境中应考虑更细粒度的授权方案。
4.2 存储驱动选择
Ubuntu默认使用overlay2存储驱动,但某些场景需要调整:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"storage-driver": "overlay2",
"data-root": "/mnt/docker-data"
}
EOF
对于ZFS文件系统,需要改用zfs驱动并预先创建存储池。
4.3 日志与资源限制
防止容器日志占用全部磁盘:
bash复制sudo tee -a /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
最后重启服务使配置生效:
bash复制sudo systemctl restart docker
sudo systemctl enable docker
5. 常见问题排查指南
5.1 网络连接失败
症状:docker pull报错connection refused
排查步骤:
- 确认DNS配置:
bash复制cat /etc/resolv.conf - 测试直接访问:
bash复制
curl -v https://registry-1.docker.io/v2/ - 可能需要调整MTU值:
bash复制sudo ip link set dev eth0 mtu 1400
5.2 存储空间不足
症状:No space left on device错误
解决方案:
bash复制# 查看存储使用
docker system df
# 清理无用对象
docker system prune -a --volumes
# 迁移数据目录
sudo systemctl stop docker
sudo rsync -avz /var/lib/docker/ /mnt/new_location
5.3 容器启动失败
典型错误:OCI runtime create failed
关键排查命令:
bash复制# 查看详细日志
journalctl -u docker.service -n 50 --no-pager
# 检查内核模块
lsmod | grep overlay
6. 性能优化实践
6.1 内核参数调优
在/etc/sysctl.conf中添加:
bash复制vm.swappiness = 10
vm.max_map_count = 262144
net.ipv4.ip_forward = 1
应用修改:
bash复制sudo sysctl -p
6.2 容器资源限制
启动容器时明确资源约束:
bash复制docker run -it --cpus 1.5 --memory 2g --memory-swap 3g nginx
6.3 构建缓存优化
Dockerfile最佳实践:
dockerfile复制# 将频繁变动的指令放在下层
COPY package.json .
RUN npm install
# 静态文件最后添加
COPY . .
使用多阶段构建减少镜像体积:
dockerfile复制FROM node:16 as builder
WORKDIR /app
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html