Ubuntu 20安装Docker全攻略:3分钟避坑指南+版本选择技巧
sudo apt remove -y docker docker-engine docker.io containerd runc
2.1 通过官方仓库安装Docker Engine
我的首选安装方式是从Docker官方仓库获取最新稳定版本。先给系统添加可信密钥环,执行curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
时,注意终端不能出现gpg: no valid OpenPGP data found
的警告。遇到网络波动导致密钥下载失败的情况,可以改用sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
通过国内镜像源加速。
配置软件源时需精准匹配系统代号,Ubuntu 20.04对应的代号是focal
。建立仓库链接的命令echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list
要逐字核对,曾经有运维同事把signed-by
参数写成sign-by
导致后续安装报错。更新源清单后运行sudo apt update
,应该在输出列表里看到docker-ce-stable
分支的新条目。
2.2 使用deb包手动安装方式
当服务器无法连接外网时,手动安装deb包成为救命稻草。先到https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/ 找特定版本包,比如docker-ce_24.0.7-1~ubuntu.20.04~focal_amd64.deb。用wget
下载到本地后,执行sudo dpkg -i docker-ce*.deb
时经常会出现依赖缺失的红字报错,这时候需要提前备好containerd、docker-cli等依赖包的deb文件。
手动安装更适合需要固定特定版本的生产环境。我有次在金融系统部署时,客户指定必须使用docker-ce=5:20.10.23~3-0~ubuntu-focal版本,只能通过手动下载30多个关联deb包逐个安装。记得用apt-cache depends docker-ce
查看完整依赖树,避免漏装关键组件导致服务异常启动。
2.3 Docker CE与Docker Engine版本选择指南
版本命名规则变化曾让我栽过跟头。2017年后Docker CE(社区版)与EE(企业版)的划分已调整为Docker Engine单一品牌,但apt仓库里仍保留docker-ce
的包名。通过apt list -a docker-ce
能看到类似24.0.7-1~ubuntu.20.04~focal的版本号结构,其中5:24.0.7
的5代表包版本序列,比单纯24.0.7更易追踪更新路径。
生产环境建议锁定次要版本,比如sudo apt install docker-ce=5:24.0.7-1~ubuntu.20.04~focal
避免自动升级到新主版本。测试环境可用docker-ce-cli
与docker-ce
组合安装最新版,但要注意containerd版本兼容性——有次升级后容器无法启动,回退containerd到1.6.9版本才解决。
3.1 运行测试容器验证基础功能
装完Docker后的第一个动作就是跑个hello-world容器试试水。在终端敲入sudo docker run hello-world
,当看到那只熟悉的鲸鱼图案和"Hello from Docker!"的欢迎信息,悬着的心才算放下。有次在客户现场遇到镜像拉取超时,发现是DNS配置问题,临时改用sudo docker run --dns 8.8.8.8 hello-world
才成功加载测试镜像。
新手常会遇到权限拒绝的报错,表现为"Got permission denied while trying to connect to the Docker daemon socket"。这时候需要把当前用户加入docker组,执行sudo usermod -aG docker $USER
后重新登录系统。记得用docker run --rm alpine echo "导管测试"
验证中文环境支持,避免后续开发时容器内出现乱码。
3.2 检查Docker服务运行状态
服务是否正常启动直接决定后续操作成败。运行sudo systemctl status docker
时,关注输出中的"Active: active (running)"绿色标识。有次凌晨升级内核后服务异常,发现状态显示"inactive (dead)",用journalctl -u docker.service --since "2024-01-01 00:00:00"
查日志才发现是cgroup驱动不兼容。
配置开机自启是生产环境必备操作,执行sudo systemctl enable docker
会创建符号链接到systemd启动目录。测试环境中偶尔需要重启服务,掌握sudo systemctl restart docker
比直接reboot服务器更优雅。遇到端口占用导致服务启动失败时,netstat -tulnp | grep 2375
能快速定位冲突进程。
3.3 查看版本信息确认组件完整性
版本一致性检查是部署后的重要环节。执行docker version
会分两栏显示Client和Server的版本信息,特别注意两者是否匹配。曾遇到客户端24.0.7连接服务端23.0.1的情况,导致部分新命令无法执行,需要重新用sudo apt install --only-upgrade docker-ce
对齐版本。
docker info
输出的信息量更大,包含存储驱动、镜像数量、运行容器等关键数据。重点关注"Server Version"和"Containerd Version"的兼容性,有次升级后containerd从1.6.9跳到1.7.3导致旧容器崩溃,回退时需要用sudo apt install containerd.io=1.6.9-1
指定版本。通过docker-compose --version
和docker buildx version
还能验证扩展组件的完整性,避免构建工具链缺失。
4.1 配置非root用户docker权限
每次操作都要加sudo实在太麻烦。我习惯安装后立即把常用账号加入docker组,执行sudo usermod -aG docker $USER
这条命令。新用户在终端看到"docker: command not found"提示别慌,注销重新登录就能生效。上次在团队服务器配置时忘做这步,结果开发同事的CI/CD流水线一直报权限错误。
真正的权限问题藏在组权限里。检查/etc/group文件确认用户名已出现在docker组条目中,有时需要手动激活组变更newgrp docker
。生产环境我会用docker run --user 1001
指定容器用户ID,避免直接使用root账户运行容器,这个习惯帮我拦住了好几次安全漏洞。
4.2 设置国内镜像加速器
拉取镜像卡在90%进度太折磨人。我首选阿里云镜像加速器,登录容器镜像服务控制台就能拿到专属加速地址。修改/etc/docker/daemon.json时记得保留原有配置,完整写法是{"registry-mirrors":["https://xxxx.mirror.aliyuncs.com"]}
。有次误删了逗号导致服务启动失败,幸亏提前备份了原文件。
网易镜像源也很稳定,地址填https://hub-mirror.c.163.com
就行。配置完成后必须执行sudo systemctl daemon-reload && sudo systemctl restart docker
双重生效。测试时用docker pull ubuntu
观察下载速度,从原先的10KB/s飙升到8MB/s的感觉特别爽。定期运行docker info | grep Mirrors
还能验证配置是否持续生效。
4.3 Docker服务启停与自动启动设置
服务器维护时免不了操作服务状态。重启容器引擎就用sudo systemctl restart docker
,比起直接重启主机优雅得多。临时故障排查我会先sudo systemctl stop docker
停服务,修完再sudo systemctl start docker
启动。有次磁盘爆满导致服务异常,就是靠这套操作保住了正在运行的数据库容器。
生产环境必须设置开机自启。执行sudo systemctl enable docker
创建systemd链接,重启后用systemctl is-enabled docker
确认返回"enabled"。测试服务器相反,我会特意加sudo systemctl disable docker
防止自动启动。突发断电后最怕服务没起来,所以每次维护完都顺手敲sudo systemctl status docker | grep Active
看绿色running标识。