最近在Ubuntu 22.04 LTS上安装Docker时遇到了一个典型问题:执行sudo apt install docker.io后系统报错"Unable to locate package docker.io"。这种情况在Ubuntu新版本中其实相当常见,特别是当系统缺少必要依赖或软件源配置不完整时。作为使用Linux系统超过10年的老运维,我整理了这份完整解决方案。
这个问题通常伴随着以下症状:
注意:本文所有操作均需root权限,建议使用
sudo -i切换到root账户操作,避免频繁输入sudo
首先确认你的Ubuntu版本:
bash复制lsb_release -a
# 输出应包含类似:
# Distributor ID: Ubuntu
# Description: Ubuntu 22.04.3 LTS
# Release: 22.04
更新软件包索引(这步很关键):
bash复制apt update && apt upgrade -y
安装基础依赖:
bash复制apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
官方源需要密钥验证,执行:
bash复制mkdir -p /etc/apt/keyrings
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
# 应看到类似:
# pub rsa4096 2017-02-22 [SCEA]
# 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
# uid [ unknown] Docker Release (CE deb) <docker@docker.com>
根据你的架构设置仓库(amd64/arm64):
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
再次更新索引:
bash复制apt update
现在可以安装最新版Docker:
bash复制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
避免每次使用docker都要sudo:
bash复制usermod -aG docker $USER
newgrp docker # 立即生效
验证权限:
bash复制docker run hello-world
# 应看到欢迎信息而非权限错误
如果遇到如下错误:
code复制E: Conflicting values set for option Signed-By regarding source https://download.docker.com/linux/ubuntu/ jammy: /etc/apt/keyrings/docker.gpg !=
E: The list of sources could not be read.
解决方法:
bash复制rm /etc/apt/sources.list.d/docker.list
# 重新执行2.3步骤
如果之前安装过旧版,需要彻底清理:
bash复制apt remove --purge docker docker-engine docker.io containerd runc
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
企业网络可能需要配置代理:
bash复制mkdir -p /etc/systemd/system/docker.service.d
echo '[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"' > /etc/systemd/system/docker.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart docker
检查内核版本:
bash复制uname -r
# 建议5.4以上
升级内核:
bash复制apt install --install-recommends linux-generic-hwe-22.04
reboot
对于SSD建议使用overlay2:
bash复制cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
修改默认资源限制:
bash复制mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
EOF
systemctl daemon-reload
systemctl restart docker
防止日志爆满磁盘:
bash复制cat > /etc/logrotate.d/docker <<EOF
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
delaycompress
missingok
copytruncate
}
EOF
定期执行:
bash复制docker system prune -af
# 清理所有停止的容器、悬空镜像和网络
bash复制docker system df
# 输出示例:
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 5 3 1.2GB 500MB (41%)
# Containers 3 1 200MB 200MB (100%)
# Local Volumes 2 1 100MB 0B (0%)
实时查看日志:
bash复制journalctl -u docker.service -f
检查服务健康状态:
bash复制systemctl status docker -l
bash复制echo '{
"userns-remap": "default"
}' >> /etc/docker/daemon.json
systemctl restart docker
bash复制docker run --cap-drop ALL --cap-add NET_BIND_SERVICE -it ubuntu bash
bash复制export DOCKER_CONTENT_TRUST=1
如果所有方法都无效,可以尝试:
bash复制apt purge docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
bash复制apt install docker-ce=5:20.10.24~3-0~ubuntu-jammy docker-ce-cli=5:20.10.24~3-0~ubuntu-jammy containerd.io
bash复制curl -fsSL https://get.docker.com -o get-docker.sh
DRY_RUN=1 sh ./get-docker.sh