1. 为什么选择Ubuntu 22.04运行Docker?
作为目前最流行的容器化解决方案,Docker在Ubuntu 22.04 LTS(Jammy Jellyfish)上的部署已经成为现代开发运维的标配组合。这个LTS版本提供了长达5年的官方支持周期,与Docker的稳定性需求完美匹配。我在生产环境中部署这个组合已超过两年,实测其稳定性远超其他Linux发行版。
Ubuntu官方仓库虽然提供了docker.io包,但版本往往滞后。我们会直接使用Docker官方源获取最新稳定版,这也是大多数企业级部署的标准做法。最新统计显示,超过78%的云原生应用选择在Ubuntu上运行Docker容器。
2. 准备工作与环境检查
2.1 系统要求验证
在开始安装前,建议先运行以下命令检查系统架构和版本:
bash复制lsb_release -a
uname -m
输出示例:
code复制No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.2 LTS
Release: 22.04
Codename: jammy
x86_64
重要提示:虽然Docker支持ARM架构,但部分镜像可能仅提供x86_64版本。生产环境建议使用x86_64服务器。
2.2 旧版本清理
如果系统存在旧版Docker,必须先彻底清除:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
这个清理步骤经常被忽略,但却是避免后续冲突的关键。我遇到过多次因为残留配置导致的诡异问题,彻底清理后都能解决。
3. 安装Docker Engine完整流程
3.1 设置官方软件源
首先安装必要的依赖工具:
bash复制sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
添加Docker官方GPG密钥:
bash复制sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置稳定版仓库:
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
3.2 安装Docker组件
更新源并安装完整套件:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
验证安装版本:
bash复制docker --version
docker compose version
典型输出:
code复制Docker version 23.0.6, build ef23cbc
Docker Compose version v2.17.3
4. 安装后配置与优化
4.1 非root用户权限配置
将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker
这个配置需要重新登录才能生效。我建议直接新建终端会话测试,避免权限问题。
4.2 服务启动与自启配置
启动Docker服务并设置开机自启:
bash复制sudo systemctl enable docker
sudo systemctl start docker
验证服务状态:
bash复制sudo systemctl status docker
健康检查:
bash复制docker run hello-world
5. 典型报错与解决方案
5.1 GPG密钥错误
错误现象:
code复制The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX
解决方案:
bash复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXXXXXXXXXX
5.2 存储驱动冲突
错误日志:
code复制devmapper: Error running deviceCreate
解决方法:
bash复制sudo nano /etc/docker/daemon.json
添加:
json复制{
"storage-driver": "overlay2"
}
然后重启服务:
bash复制sudo systemctl restart docker
5.3 代理配置问题
当企业网络需要代理时:
bash复制sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
添加:
code复制[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
应用配置:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
6. 生产环境优化建议
6.1 日志轮转配置
防止日志爆盘:
bash复制sudo nano /etc/docker/daemon.json
添加:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
6.2 存储位置修改
默认存储路径为/var/lib/docker,如需更改:
bash复制sudo systemctl stop docker
sudo rsync -aXS /var/lib/docker/ /new/path/
sudo nano /etc/docker/daemon.json
添加:
json复制{
"data-root": "/new/path/docker"
}
6.3 内核参数调优
编辑sysctl配置:
bash复制sudo nano /etc/sysctl.conf
添加:
code复制net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness = 0
vm.overcommit_memory = 1
vm.max_map_count = 262144
应用配置:
bash复制sudo sysctl -p
7. 容器网络问题排查
7.1 端口冲突检测
列出所有容器端口映射:
bash复制docker ps --format "table {{.Names}}\t{{.Ports}}"
检查端口占用:
bash复制sudo netstat -tulnp | grep <port>
7.2 DNS解析异常
临时测试DNS:
bash复制docker run --rm busybox nslookup example.com
自定义DNS配置:
bash复制sudo nano /etc/docker/daemon.json
添加:
json复制{
"dns": ["8.8.8.8", "1.1.1.1"]
}
8. 安全加固措施
8.1 用户命名空间隔离
启用userns-remap:
bash复制sudo nano /etc/docker/daemon.json
添加:
json复制{
"userns-remap": "default"
}
8.2 容器只读文件系统
运行容器时添加:
bash复制docker run --read-only -it alpine sh
8.3 资源限制配置
示例限制CPU和内存:
bash复制docker run -it --cpus="1.5" --memory="512m" ubuntu
9. 日常维护命令速查
9.1 磁盘空间清理
查看磁盘使用:
bash复制docker system df
清理无用对象:
bash复制docker system prune -a --volumes
9.2 容器批量操作
停止所有容器:
bash复制docker stop $(docker ps -aq)
删除所有容器:
bash复制docker rm $(docker ps -aq)
删除所有镜像:
bash复制docker rmi $(docker images -q)
10. 性能监控方案
10.1 实时资源监控
查看容器资源占用:
bash复制docker stats
详细性能数据:
bash复制docker container top <container_id>
10.2 日志收集方案
查看容器日志:
bash复制docker logs -f --tail 100 <container_id>
日志驱动配置示例:
json复制{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://192.168.0.10:514"
}
}
在长期运维实践中,我发现保持Docker主机简洁非常重要。建议定期检查并清理无用镜像和容器,避免积累导致性能下降。另外,对于生产环境,一定要配置完善的监控和告警系统,容器虽然轻量但故障传播速度也更快。