1. 为什么选择Docker?容器化技术的核心优势
在Ubuntu系统上部署Docker已经成为现代开发者的标配技能。相比传统虚拟机,Docker容器具有更轻量级的资源消耗——启动一个完整的Ubuntu容器只需不到1秒,而内存占用仅为传统虚拟机的1/10。我在实际项目中发现,同一台物理机上运行Docker容器数量可以达到VM的5-8倍。
Docker的核心价值在于其分层存储机制。当我们拉取一个官方Ubuntu镜像时,实际上下载的是由多个只读层(layer)叠加而成的文件系统。例如基础镜像层、apt工具层、用户自定义层等。这种设计使得不同容器可以共享相同的底层镜像层,仅存储差异部分。实测显示,这种方式可以节省60%-80%的磁盘空间。
注意:Ubuntu 22.04 LTS是目前对Docker兼容性最好的长期支持版本,建议生产环境优先选择。我在18.04系统上曾遇到cgroup v2导致的兼容性问题,需要额外配置才能正常运行容器。
2. Ubuntu系统Docker安装全流程
2.1 系统环境准备
首先需要确保你的Ubuntu系统版本不低于18.04。运行以下命令检查系统信息:
lsb_release -a uname -m # 确认是x86_64架构更新apt索引并安装必要的依赖包:
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common这里特别说明几个关键依赖的作用:
apt-transport-https:允许apt通过HTTPS协议访问仓库ca-certificates:确保SSL证书验证正常curl:用于下载Docker的GPG密钥software-properties-common:提供add-apt-repository命令
2.2 添加Docker官方GPG密钥
Docker官方仓库使用GPG密钥进行签名验证。执行以下命令添加密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg这个命令做了三件事:
- 通过curl下载密钥
- 使用gpg --dearmor解码二进制格式
- 将密钥保存到系统密钥环位置
2.3 设置稳定版仓库
根据你的Ubuntu版本选择对应的仓库配置。对于22.04 Jammy:
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这个命令动态获取系统架构和发行版代号,确保仓库配置准确。我在多架构环境中发现,明确指定arch参数可以避免amd64和arm64的混淆问题。
2.4 安装Docker引擎
更新apt索引并安装Docker:
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装完成后验证版本:
docker --version # 输出示例:Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.13. 国内镜像加速配置实战
3.1 为什么需要镜像加速?
默认情况下,Docker会从Docker Hub拉取镜像。但在国内网络环境下,速度可能只有几十KB/s。通过配置国内镜像加速器,实测拉取ubuntu:latest镜像的速度可以从5分钟缩短到20秒左右。
主流镜像加速服务对比:
| 服务商 | 地址示例 | 是否需要注册 | 限速策略 |
|---|---|---|---|
| 阿里云 | https://<你的ID>.mirror.aliyuncs.com | 是 | 个人版不限速 |
| 腾讯云 | https://mirror.ccs.tencentyun.com | 否 | 不限速 |
| 华为云 | https://<你的ID>.swr.myhuaweicloud.com | 是 | 不限速 |
| 中科大 | https://docker.mirrors.ustc.edu.cn | 否 | 限连接数 |
3.2 阿里云加速器配置步骤
- 首先访问阿里云容器镜像服务控制台获取专属加速地址
- 创建或修改/etc/docker/daemon.json文件:
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } EOF- 重新加载配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart docker验证配置是否生效:
docker info | grep Mirrors -A 1 # 应显示你配置的镜像地址3.3 多镜像源fallback策略
在生产环境中,我建议配置多个镜像源作为备用。修改daemon.json如下:
{ "registry-mirrors": [ "https://primary.mirror.com", "https://secondary.mirror.com", "https://docker.mirrors.ustc.edu.cn" ] }当主镜像源不可用时,Docker会自动尝试下一个地址。这个技巧在大规模部署时特别有用。
4. 安装后关键配置与验证
4.1 非root用户操作权限
默认情况下,只有root用户和docker组的用户才能运行Docker命令。将当前用户加入docker组:
sudo usermod -aG docker $USER newgrp docker # 立即生效无需注销警告:docker组权限等同于root,在生产环境中应该严格控制组成员。我曾见过因为滥用docker组导致容器逃逸的安全事故。
4.2 验证安装完整性
运行测试容器验证基础功能:
docker run --rm hello-world这个命令会:
- 自动拉取hello-world镜像(如果没有本地缓存)
- 创建并运行临时容器
- 输出欢迎信息后自动删除容器
4.3 检查存储驱动
Ubuntu默认使用overlay2存储驱动,查看当前配置:
docker info | grep Storage如果显示aufs或devicemapper,建议调整为overlay2以获得更好性能。修改/etc/docker/daemon.json:
{ "storage-driver": "overlay2" }4.4 系统服务管理
关键systemctl命令备忘:
sudo systemctl enable docker # 开机自启 sudo systemctl status docker # 查看状态 sudo journalctl -u docker -f # 实时日志5. 常见问题排错指南
5.1 网络连接问题
症状:docker pull时出现"connection timeout"或"TLS handshake timeout"
排查步骤:
- 确认基础网络连通性:
ping download.docker.com curl -Iv https://download.docker.com - 检查DNS配置:
cat /etc/resolv.conf docker run --rm busybox nslookup docker.com - 临时关闭防火墙测试:
sudo ufw disable
5.2 存储空间不足
Docker默认将镜像存储在/var/lib/docker目录。当出现"No space left on device"错误时:
- 查看磁盘使用情况:
docker system df - 清理无用资源:
docker system prune -a --volumes - 修改存储位置(适用于全新安装):
添加:sudo rsync -a /var/lib/docker /new/path/ sudo vim /etc/docker/daemon.json{ "data-root": "/new/path/docker" }
5.3 镜像拉取失败
当出现"manifest unknown"或"pull access denied"错误时:
- 确认镜像名称拼写正确
- 检查是否需要在私有仓库登录:
docker login registry.example.com - 尝试指定精确版本号而非latest标签
6. 性能优化与进阶配置
6.1 日志轮转配置
默认情况下,Docker容器日志会无限增长。修改daemon.json限制日志大小:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }6.2 内存与CPU限制
在/etc/docker/daemon.json中设置全局资源限制:
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 } }, "cgroup-parent": "docker.slice" }6.3 内核参数调优
编辑/etc/sysctl.conf添加:
vm.swappiness = 0 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 fs.file-max = 1000000应用修改:
sudo sysctl -p7. 生产环境最佳实践
7.1 版本锁定策略
避免自动升级导致兼容性问题,可以固定Docker版本:
sudo apt-mark hold docker-ce docker-ce-cli containerd.io查看可用版本:
apt-cache madison docker-ce安装指定版本:
sudo apt install docker-ce=5:24.0.5-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.5-1~ubuntu.22.04~jammy7.2 安全加固措施
- 启用内容信任:
export DOCKER_CONTENT_TRUST=1 - 定期扫描镜像漏洞:
docker scan ubuntu:latest - 限制容器能力:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE ...
7.3 监控与告警
使用cAdvisor监控容器资源使用:
docker run -d \ --name=cadvisor \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ gcr.io/cadvisor/cadvisor:v0.47.0访问http://localhost:8080查看监控数据。