铁犁 發表於 2024-3-9 02:24:00

Ubuntu 安装 Docker Engine

<h2 id="简介">简介</h2>
<p>Docker 有两种版本:Docker Desktop 和 Docker Engine(也称作 Docker CE)。Docker Desktop 是带图形界面的版本,适合在个人 PC 上使用。Docker Engine 则只有命令行接口,适合在没有图形界面的服务器上使用。</p>
<p>这篇文章将介绍在 Ubuntu Server 上安装 Docker Engine 的方法。如果你需要安装 Docker Desktop,请参阅 Ubuntu 安装 Docker Desktop。</p>
<h2 id="安装">安装</h2>
<p>你有两种方式安装 Docker Engine,一种是使用官方的简易安装脚本,另一种是手动配置 APT 源并使用 APT 安装。</p>
<p><strong>使用简易脚本安装</strong></p>
<p>Docker 官方为我们编写了一个脚本,可以快速为我们完成上面的步骤。</p>
<pre><code class="language-sh"># 使用官方源
curl -fsSL https://get.docker.com | sudo sh
# 使用阿里镜像源
curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyun
</code></pre>
<p><strong>使用 APT 安装</strong></p>
<ol start="0">
<li>
<p>如果你安装过非官方版本的 Docker,则需要先清理这些包:</p>
<pre><code class="language-sh">for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
    sudo apt remove $pkg
done
</code></pre>
</li>
<li>
<p>将 Docker 源添加到 APT 源列表:</p>
<pre><code class="language-sh"># 添加 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 https://download.docker.com/linux/ubuntu $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

# 或者使用清华源
echo \
    "deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
</code></pre>
</li>
<li>
<p>安装 Docker Engine:</p>
<pre><code class="language-sh">sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
</code></pre>
<p>至此,Docker Engine 就安装完成了。</p>
</li>
</ol>
<p>参见:</p>
<ul>
<li>Install Docker Engine on Ubuntu | Docker Docs</li>
<li>Install Docker Engine on CentOS | Docker Docs</li>
<li>Docker CE 软件仓库 | 清华大学开源软件镜像站</li>
</ul>
<h2 id="去掉-sudo">去掉 sudo</h2>
<p>目前为止,你需要使用 <code>sudo</code> 来运行 <code>docker</code> 命令,就像这样:</p>
<pre><code class="language-sh">sudo docker run hello-world
</code></pre>
<p>原因是 Docker 守护程序绑定到 Unix socket,而不是 TCP 端口。默认情况下,拥有 Unix socket 的是 root 用户,其他用户只能使用 <code>sudo</code> 访问它。<strong>Docker 守护程序始终以 root 身份运行。</strong></p>
<p>如果你不想每次在命令前加上 <code>sudo</code>,可以使用以下两种方法:</p>
<p><strong>将用户添加到 docker 组</strong></p>
<p>对于单用户环境,推荐这种方法。</p>
<blockquote>
<p>⚠️ 注意:该组为用户授予 root 级别权限。而这可能会影响系统安全。如果你希望让 Docker 在非 root 模式下运行,请参见 rootless mode</p>
</blockquote>
<ol>
<li>
<p>将你的用户添加到 <code>docker</code> 组:</p>
<pre><code class="language-sh">sudo usermod -aG docker $USER
</code></pre>
</li>
<li>
<p>重新登录系统。</p>
</li>
<li>
<p>测试配置是否成功:</p>
<pre><code class="language-sh">docker run hello-world
</code></pre>
<p>命令的输出应该是 <code>Hello from Docker!</code> 以及一大行字符串。</p>
</li>
</ol>
<p>参考:Linux post-installation steps for Docker Engine | Docker Docs</p>
<p><strong>Rootless Mode</strong></p>
<p>Rootless Mode 无需 root 权限,但一些 root 特权功能也会因此受到影响,比如无法暴露 80 特权端口。</p>
<p>安装 Rootless Mode:</p>
<pre><code class="language-sh">sudo apt install -y uidmap docker-ce-rootless-extras
dockerd-rootless-setuptool.sh install# 为当前用户安装 rootless mode
</code></pre>
<p>参考:Run the Docker daemon as a non-root user (Rootless mode) | Docker Docs</p>
<p>卸载 Rootless Mode:</p>
<pre><code class="language-sh">dockerd-rootless-setuptool.sh uninstall   # 删除 Docker 守护程序的 systemd 服务
rootlesskit rm -rf ~/.local/share/docker# 删除数据目录
</code></pre>
<h2 id="修改网桥-ip">修改网桥 IP</h2>
<p>Docker 网桥默认使用的 <code>172.17.0.0/16</code> 网段容易与局域网(如校园网)冲突,因此需要修改 Docker 网桥 IP。</p>
<blockquote>
<p>校园网常用网段:<code>172.17.0.0/16</code> 和 <code>172.18.0.0/16</code></p>
</blockquote>
<ol>
<li>
<p>删除 <code>docker0</code> 网桥:</p>
<pre><code class="language-sh">sudo systemctl stop docker# 停止 docker
sudo ip link del docker0    # 移除 docker0 网桥
</code></pre>
</li>
<li>
<p>编辑 Docker 守护程序配置文件 <code>/etc/docker/daemon.json</code>:</p>
<pre><code class="language-json">{
"bip": "172.16.0.1/16",   // docker0 网桥 IP
"default-address-pools": [// 自定义网络 IP 分配池
    {
      "base": "172.19.0.0/16",
      "size": 24
    }
]
}
</code></pre>
<p>这里设置 <code>docker0</code> 网桥使用 <code>172.16.0.1/16</code> 网段,创建新网桥时从 <code>172.19.0.0/16</code> 地址池中分配大小为 <code>⁠/24</code> 的子网。</p>
</li>
<li>
<p>启动 docker daemon:</p>
<pre><code class="language-sh">sudo systemctl start docker
</code></pre>
</li>
<li>
<p>查看 <code>docker0</code> 网桥 IP:</p>
<pre><code class="language-sh">$ ip -br addr show docker0
docker0          UP             172.16.0.1/16
</code></pre>
</li>
</ol>
<h2 id="换源">换源</h2>
<p>由于在国内无法直接访问 Docker Hub,因此 <code>docker pull</code> 命令可能会失败。需要通过设置代理或换源来解决。</p>
<p>关于 Docker 换源请参考 Docker 代理和换源</p>
<h2 id="卸载">卸载</h2>
<p>卸载 Docker Engine:</p>
<pre><code class="language-sh">sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
</code></pre>
<p>删除残留镜像、容器、卷,以及自定义配置文件:</p>
<pre><code class="language-sh">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
</code></pre>
<h2 id="troubleshooting">Troubleshooting</h2>
<p><strong>systemd not detected</strong></p>
<p>安装 rootless mode 时提示 <code>systemd not detected</code>:</p>
<pre><code class="language-sh">$ sudo -iu ubuntu# 登录 ubuntu 用户
$ dockerd-rootless-setuptool.sh install# 安装 rootless mode
systemd not detected, dockerd-rootless.sh needs to be started manually:

PATH=/usr/bin:/sbin:/usr/sbin:$PATH dockerd-rootless.sh

Creating CLI context "rootless"
Successfully created context "rootless"
Using CLI context "rootless"
Current context is now "rootless"

Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
# WARNING: systemd not found. You have to remove XDG_RUNTIME_DIR manually on every logout.
export XDG_RUNTIME_DIR=/home/ubuntu/.docker/run
export PATH=/usr/bin:$PATH

Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///home/ubuntu/.docker/run/docker.sock
</code></pre>
<p>问题原因:使用 <code>sudo</code> 或 <code>su</code> 切换到另一个用户并不会启动该用户的 systemd 守护进程。</p>
<p>解决方法:使用 <code>ssh</code> 或 <code>machinectl</code> 登录另一个用户:</p>
<pre><code class="language-sh">$ sudo machinectl shell ubuntu@# 登录 ubuntu 用户
$ dockerd-rootless-setuptool.sh install# 安装 rootless mode
</code></pre>
<p>参考:Cannot use `systemctl --user` due to "Failed to get D-bus connection: permission denied" | Server Fault</p><br><br>
来源:https://www.cnblogs.com/Undefined443/p/18062149
頁: [1]
查看完整版本: Ubuntu 安装 Docker Engine