Ubuntu 安装 Docker Engine
简介
Docker 有两种版本:Docker Desktop 和 Docker Engine(也称作 Docker CE)。Docker Desktop 是带图形界面的版本,适合在个人 PC 上使用。Docker Engine 则只有命令行接口,适合在没有图形界面的服务器上使用。
这篇文章将介绍在 Ubuntu Server 上安装 Docker Engine 的方法。如果你需要安装 Docker Desktop,请参阅 Ubuntu 安装 Docker Desktop。
安装
你有两种方式安装 Docker Engine,一种是使用官方的简易安装脚本,另一种是手动配置 APT 源并使用 APT 安装。
使用简易脚本安装
Docker 官方为我们编写了一个脚本,可以快速为我们完成上面的步骤。
# 使用官方源
curl -fsSL https://get.docker.com | sudo sh
# 使用阿里镜像源
curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyun
使用 APT 安装
-
如果你安装过非官方版本的 Docker,则需要先清理这些包:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg done
-
将 Docker 源添加到 APT 源列表:
# 添加 Docker 源的 GPG 公钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc sudo chmod 644 /etc/apt/keyrings/docker.asc # 将 Docker 源添加到 APT 源列表 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 或者使用清华源 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
安装 Docker Engine:
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
至此,Docker Engine 就安装完成了。
参见:
- Install Docker Engine on Ubuntu | Docker Docs
- Install Docker Engine on CentOS | Docker Docs
- Docker CE 软件仓库 | 清华大学开源软件镜像站
去掉 sudo
目前为止,你需要使用 sudo
来运行 docker
命令,就像这样:
sudo docker run hello-world
原因是 Docker 守护程序绑定到 Unix socket,而不是 TCP 端口。默认情况下,拥有 Unix socket 的是 root 用户,其他用户只能使用 sudo
访问它。Docker 守护程序始终以 root 身份运行。
如果你不想每次在命令前加上 sudo
,可以使用以下两种方法:
将用户添加到 docker 组
对于单用户环境,推荐这种方法。
⚠️ 注意:该组为用户授予 root 级别权限。而这可能会影响系统安全。如果你希望让 Docker 在非 root 模式下运行,请参见 rootless mode
-
将你的用户添加到
docker
组:sudo usermod -aG docker $USER
-
重新登录系统。
-
测试配置是否成功:
docker run hello-world
命令的输出应该是
Hello from Docker!
以及一大行字符串。
参考:Linux post-installation steps for Docker Engine | Docker Docs
Rootless Mode
Rootless Mode 无需 root 权限,但一些 root 特权功能也会因此受到影响,比如无法暴露 80 特权端口。
安装 Rootless Mode:
sudo apt install -y uidmap docker-ce-rootless-extras
dockerd-rootless-setuptool.sh install # 为当前用户安装 rootless mode
参考:Run the Docker daemon as a non-root user (Rootless mode) | Docker Docs
卸载 Rootless Mode:
dockerd-rootless-setuptool.sh uninstall # 删除 Docker 守护程序的 systemd 服务
rootlesskit rm -rf ~/.local/share/docker # 删除数据目录
修改网桥 IP
Docker 网桥默认使用的 172.17.0.0/16
网段容易与局域网(如校园网)冲突,因此需要修改 Docker 网桥 IP。
校园网常用网段:
172.17.0.0/16
和172.18.0.0/16
-
删除
docker0
网桥:sudo systemctl stop docker # 停止 docker sudo ip link del docker0 # 移除 docker0 网桥
-
编辑 Docker 守护程序配置文件
/etc/docker/daemon.json
:{ "bip": "172.16.0.1/16", "default-address-pools": [{ "base": "172.19.0.0/16", "size": 24 }] }
这里设置
docker0
网桥使用172.16.0.1/16
网段,创建新网桥时从172.19.0.0/16
地址池中分配大小为/24
的子网。 -
启动 docker daemon:
sudo systemctl start docker
-
查看
docker0
网桥 IP:$ ip addr show docker0 8: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 76:e8:e7:5b:28:16 brd ff:ff:ff:ff:ff:ff inet 172.16.0.1/16 brd 172.16.255.255 scope global docker0 valid_lft forever preferred_lft forever
换源
由于在国内无法直接访问 Docker Hub,因此 docker pull
命令可能会失败。需要通过设置代理或换源来解决。
关于 Docker 换源请参考 Docker 代理和换源
卸载
卸载 Docker Engine:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
删除残留镜像、容器、卷,以及自定义配置文件:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker
rm -rf ~/.config/docker
rm -rf ~/.docker/config.json
rm -rf ~/.config/systemd/user/docker.service.d