1. Docker 安装前的系统准备
在Ubuntu 22.04(代号jammy)上安装Docker前,有几个关键准备工作需要完成。我见过太多人直接跳进安装步骤,结果遇到各种奇怪问题又得从头再来。
1.1 检查系统架构和内核版本
首先打开终端,运行:
bash复制uname -m
这个命令会显示你的系统架构,常见的有x86_64(64位)或arm64(M1/M2芯片)。Docker对不同架构的支持程度不同,特别是如果你在用苹果M系列芯片的机器通过虚拟机跑Ubuntu。
接着检查内核版本:
bash复制uname -r
Docker要求内核版本至少3.10以上,但Ubuntu 22.04默认安装的内核(通常是5.15)完全满足要求。我建议在继续之前先更新系统:
bash复制sudo apt update && sudo apt upgrade -y
1.2 卸载旧版Docker(如有)
很多人容易忽略这一步,导致新旧版本冲突。用以下命令彻底清理旧版本:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
然后手动检查残留文件:
bash复制sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
1.3 安装依赖工具包
这些基础工具在后续配置中会用到:
bash复制sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
注意:在企业内网环境中,可能需要先配置代理才能正常访问Docker仓库。但记住我们绝对不讨论任何网络访问工具,只建议检查公司内网策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker官方仓库安装详解
2.1 添加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
如果遇到网络问题(特别是在国内),可以考虑使用镜像源,但要注意安全风险。我个人的做法是直接使用官方源,通过重试几次通常能成功。
2.2 设置稳定版仓库
现在设置apt仓库源:
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
这里有个细节:$(lsb_release -cs)会自动获取你的Ubuntu版本代号(如jammy),确保不会因为版本升级导致仓库失效。
2.3 安装Docker引擎
更新apt索引并安装:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装完成后,检查版本:
bash复制docker --version
正常应该显示类似"Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1"的信息。
3. 安装后关键配置
3.1 非root用户权限配置
默认情况下,运行docker命令需要sudo权限,这既不安全也不方便。将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
然后需要重新登录才能使更改生效。很多人忘记重新登录,然后困惑为什么还是需要sudo。
验证配置是否生效:
bash复制docker run hello-world
如果看到欢迎信息,说明安装成功。
3.2 配置Docker开机自启
对于服务器环境,通常需要Docker随系统启动:
bash复制sudo systemctl enable docker.service
sudo systemctl enable containerd.service
3.3 国内用户镜像加速配置(可选)
在国内访问Docker Hub可能较慢,可以配置镜像加速器。创建或修改配置文件:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
然后重启服务:
bash复制sudo systemctl restart docker
重要提示:选择镜像源时要谨慎,只使用可信的镜像服务。我通常推荐阿里云或腾讯云的镜像服务,避免使用不明来源的镜像。
4. 常见错误及解决方案
4.1 "Cannot connect to the Docker daemon"
这是最常见的问题之一,通常有以下几种原因:
- Docker服务未启动:
bash复制sudo systemctl start docker
- 用户不在docker组(即使已经添加,可能需要重新登录):
bash复制groups # 检查当前用户所属组
- 系统代理配置冲突:
检查环境变量:
bash复制env | grep -i proxy
如果有不需要的代理设置,可以取消:
bash复制unset http_proxy https_proxy
4.2 "Failed to download metadata for repo"
这通常是因为网络问题导致无法访问Docker仓库。可以尝试:
- 检查DNS配置:
bash复制cat /etc/resolv.conf
尝试改用Google DNS:
bash复制sudo tee /etc/resolv.conf <<-'EOF'
nameserver 8.8.8.8
nameserver 8.8.4.4
EOF
- 临时关闭防火墙测试:
bash复制sudo ufw disable
(测试后记得重新启用)
4.3 "IPv4 forwarding is disabled"
某些网络功能需要启用IP转发:
bash复制sudo sysctl -w net.ipv4.ip_forward=1
使配置永久生效:
bash复制sudo tee -a /etc/sysctl.conf <<-'EOF'
net.ipv4.ip_forward=1
EOF
4.4 "Permission denied" on /var/run/docker.sock
这个错误通常发生在使用非root用户时:
bash复制sudo chmod 666 /var/run/docker.sock
但更好的做法还是确保用户加入了docker组。
5. 生产环境优化建议
5.1 日志配置
默认情况下,Docker容器日志会无限制增长。对于生产环境,建议配置日志轮转:
bash复制sudo tee -a /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
然后重启Docker:
bash复制sudo systemctl restart docker
5.2 存储驱动选择
Ubuntu 22.04默认使用overlay2存储驱动,通常是最佳选择。但如果你使用特定的文件系统(如btrfs),可能需要调整:
bash复制docker info | grep "Storage Driver"
如果需要更改,编辑/etc/docker/daemon.json:
json复制{
"storage-driver": "overlay2"
}
5.3 资源限制配置
为防止单个容器占用所有资源,可以设置全局限制:
bash复制sudo tee -a /etc/docker/daemon.json <<-'EOF'
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
}
}
EOF
6. 验证安装完整性
完整的验证步骤应该包括:
- 基础功能测试:
bash复制docker run --rm hello-world
- 网络功能测试:
bash复制docker run --rm alpine ping -c 4 google.com
- 卷挂载测试:
bash复制docker run --rm -v $(pwd):/data alpine ls /data
- 构建测试:
bash复制mkdir test-docker && cd test-docker
echo "FROM alpine\nCMD echo 'Success!'" > Dockerfile
docker build -t test .
docker run --rm test
如果所有这些测试都通过,说明Docker安装完全正常。我在实际运维中发现,很多问题其实都源于跳过这些基本验证步骤。
