【Docker】在Ubuntu22.04上安装Docker

目录

一.Docker版本

二.在Ubuntu22.04上安装Docker-CE

2.1.卸载旧版本(如果有的话)

2.2.配置docker下载源

2.3.安装Docker-CE

2.4.实战经验

2.4.1.Docker镜像源修改

[2.4.2.Docker 目录修改](#2.4.2.Docker 目录修改)


一.Docker版本

在 Docker 的发展与演进过程中,为了适应不同的技术需求和商业模式,衍生出了多个重要版本和关联项目。理解这些版本之间的关系,有助于更清晰地把握 Docker 的技术脉络。目前,我们日常学习和使用的主要是 Docker-CE

1. LXC

LXC 是早期 Linux 容器技术的实现,为 Docker 的诞生奠定了技术基础。最初版本的 Docker 直接使用 LXC 作为其底层容器运行时来管理内核的命名空间和控制组。尽管现在直接使用 LXC 的用户相对较少,但作为一个基础项目,它仍在持续开发和维护中。

2. Libcontainer

为了掌握发展的主动权,实现更深度的优化和跨平台一致性,Docker 从 0.9 版本开始引入了自研的 libcontainer 项目,用以替代 LXC。这是一个用 Go 语言编写的库,它直接操作内核的容器化功能,不再依赖外部工具。到 1.10 版本,Docker 彻底移除了对 LXC 的依赖。在后续的 1.11 版本中,Docker 将 libcontainer 的核心功能拆分并捐赠给了开放容器倡议(OCI),从而催生了 runC。如今,libcontainer 已成为 runC 的底层核心,而 runC 则发展成了容器运行时的行业标准参考实现。

3. Moby Project

Moby 是 Docker 公司发起的一个开源项目,旨在为容器生态系统提供一个模块化的基础组件库。它可以被理解为一个"乐高套件",开发者可以从中选取所需组件来组装自己的容器化系统。当前 Docker 引擎(即 dockerd)的开源版本正是从 Moby 项目中的同名组件衍生而来,并使用 containerd 作为其标准的容器运行时。Moby 代表了 Docker 技术的上游开源核心。

4. Docker Community Edition (CE)

Docker-CE 是 Docker 公司提供的免费开源版本,CE 即社区版。其核心组件(如 Docker 引擎、CLI 工具)均来源于 Moby 等上游开源项目。Docker-CE 面向广大开发者和爱好者,提供了体验 Docker 全部核心功能的免费途径,是我们目前学习和使用的标准版本。

5. Docker Enterprise Edition (EE)

Docker-EE 是 Docker 的企业版,是一个需要付费的商业化产品。它在 Docker-CE 的组件基础之上,额外集成了诸如高级镜像管理、安全扫描、图形化管理界面等企业级功能,并提供了由官方保障的商业技术支持与服务,旨在满足大规模企业生产环境对安全、合规和运维的更高要求。

总而言之,从最初的 LXC 到自研的 libcontainer,再到推动行业标准的 runC 和模块化的 Moby 项目,最终衍生出面向社区的 Docker-CE 和面向企业的 Docker-EE,这一过程清晰地展现了 Docker 从依赖外部技术到实现完全自主,并最终走向全面开源和商业化的发展路径。

二.在Ubuntu22.04上安装Docker-CE

确定CPU,可以看到我们的是X86_64,是支持的,如果是arm一般会显示 aarch64,确定操作系统版本,本次我们使用的是Ubuntu 22.04.3 LTS

2.1.卸载旧版本(如果有的话)

卸载旧版本,如果是新购买的云服务器是没有的,比如输入docker并没有这个命 令,就不需要卸载

如果有的话,就需要删除

复制代码
sudo apt-get remove docker docker-engine docker.io containerd runc

当然卸载历史版本

复制代码
#卸载软件 
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y 
 
#删除目录 
sudo rm -rf /var/lib/docker 
sudo rm -rf /var/lib/containerd 
 
#这个是老师修改后的目录,根据实际情况设置 
sudo rm -rf /data/var/lib/docker 
sudo rm -rf  /etc/docker/daemon.json 

1. 卸载 Docker 软件包

复制代码
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
  • 目的 :使用 apt-get purge 命令(而不仅仅是 remove)来卸载软件包并删除它们所有的配置文件。

  • 包含组件

    • docker-ce: Docker 社区版引擎的核心包。

    • docker-ce-cli: Docker 命令行工具。

    • containerd.io: 容器运行时,Docker 依赖它来管理容器生命周期。

    • docker-buildx-plugin: 用于支持多平台镜像构建的插件。

    • docker-compose-plugin: 官方提供的 Docker Compose 插件(通过 docker compose 命令使用)。

    • docker-ce-rootless-extras: 允许以非 root 用户身份运行 Docker 守护进程的扩展包。

  • -y 参数:自动确认操作,避免需要手动输入 "yes"。

2. 删除默认的 Docker 数据和运行时目录

复制代码
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
  • 目的 :这是最关键的一步,用于彻底删除 Docker 和 Containerd 的所有持久化数据

  • 删除的内容包括

    • 所有下载的镜像。

    • 所有创建过的容器(即使已停止,其可写层也存储在这里)。

    • 所有的卷、网络配置、构建缓存等。

    • 如果不删除这些目录,未来重新安装 Docker 时,可能会看到旧的数据和镜像。

3. 删除自定义的数据目录和配置文件(根据实际情况)

复制代码
sudo rm -rf /data/var/lib/docker
sudo rm -rf /etc/docker/daemon.json
  • 目的:清理非默认路径的残留文件。

  • /data/var/lib/docker :如果您之前通过修改 /etc/docker/daemon.json 中的 data-root 配置项,将 Docker 的默认数据目录更改到了这个位置,那么就必须手动删除它。这是完全卸载的关键

  • /etc/docker/daemon.json:删除 Docker 守护进程的配置文件。如果您曾在此文件中进行过自定义配置(如设置镜像加速器、修改默认存储目录等),下次全新安装时需要重新配置。

2.2.配置docker下载源

  1. 安装 curl 工具
复制代码
sudo apt install curl -y
  • 作用 :安装一个名为 curl 的命令行工具。

  • 解释curl 用于通过各种网络协议(如 HTTP、HTTPS)在服务器之间传输数据。后续的命令需要用它来从 Docker 官网下载加密密钥(GPG key)。-y 参数表示自动确认安装,省去手动输入 "yes"。

  1. 创建gpg key目录
复制代码
sudo mkdir -m 0755 -p /etc/apt/keyrings
  • 作用:创建一个用于存储软件源认证密钥的目录。

  • 解释

    • sudo mkdir:以管理员权限创建目录。

    • -p:确保如果父目录不存在,则一并创建。

    • -m 0755:设置新目录的权限为 0755(所有者可读可写可执行,其他用户可读可执行),这是一个存放重要密钥的标准且安全的权限。

    • /etc/apt/keyrings:这是 Ubuntu 系统标准存放 APT 软件源 GPG 密钥的目录。

  1. 下载并导入 Docker 的 GPG 密钥
复制代码
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
  • 作用:从 Docker 官网下载加密密钥,并将其转换为 APT 包管理器能够识别的格式,然后保存到上一步创建的目录中。

  • 解释

    • curl -fsSL

      • -f: 静默失败(不输出错误页面)。

      • -s: 静默模式(不显示进度或错误信息)。

      • -S: 与 -s 配合,在失败时显示错误。

      • -L: 如果请求的页面发生了重定向,自动跟随重定向。

        这些参数保证了下载过程安静且可靠。

    • https://download.docker.com/linux/ubuntu/gpg:Docker 官方为 Ubuntu 系统提供的 GPG 公钥下载地址。

    • |:管道符,将 curl 下载的内容传递给后面的 gpg 命令处理。

    • sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

      • gpg:用于处理加密密钥的工具。

      • --dearmor:将可读的 ASCII 格式密钥(armored)转换为二进制格式(de-armored),这是 APT 所要求的格式。

      • --yes:自动确认操作。

      • -o ...:指定输出文件的位置和名称(/etc/apt/keyrings/docker.gpg)。

为什么需要这一步?

GPG 密钥用于验证从 Docker 源下载的软件包是否确实由 Docker 官方签名发布,且未被篡改。这是系统安全的重要保障。

  1. 创建 Docker 软件源列表文件
复制代码
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
  • 作用:生成一个文件,其中包含了 Docker 官方软件源的地址信息。

  • 解释

    • echo:输出一段文本。

    • deb ...:这是一个标准的 Debian/Ubuntu 软件源格式定义。

      • [arch=$(dpkg --print-architecture):动态获取当前系统的架构(如 amd64, arm64),确保源地址与您的系统架构匹配。

      • signed-by=/etc/apt/keyrings/docker.gpg:明确指定用于验证此软件源的密钥文件位置,这是最新版本 Ubuntu 的安全要求。

      • https://download.docker.com/linux/ubuntu:Docker 为 Ubuntu 提供的官方软件源地址。

      • $(lsb_release -cs):动态获取当前系统的 Ubuntu 代号(如 jammy, focal),确保源地址与您的系统版本匹配。

      • stable:指定使用 Docker 的稳定版发布通道。

    • | sudo tee /etc/apt/sources.list.d/docker.list:将 echo 输出的内容通过管道传递给 tee 命令,该命令以管理员权限将内容写入到 /etc/apt/sources.list.d/docker.list 文件中。

    • > /dev/null:将 tee 命令在标准输出(屏幕)上的显示重定向到"黑洞",让命令行界面保持干净。

为什么单独创建 docker.list 文件?

将 Docker 的源配置放在独立的文件(/etc/apt/sources.list.d/docker.list)中是一个非常好的实践,便于管理(启用、禁用、删除)而不会弄乱系统默认的 sources.list 文件。

5.更新本地的软件包列表

执行完以上所有命令后,您就已经成功地:

  1. 安装了必要的工具。

  2. 下载并信任了 Docker 的官方加密密钥。

  3. 添加了 Docker 的官方软件源地址。

要完成整个配置,您还必须执行以下命令来更新本地的软件包列表:

复制代码
sudo apt-get update

这个命令会让 APT 包管理器去读取新添加的 Docker 软件源,获取可用软件包及其版本信息。之后,您就可以使用 sudo apt-get install docker-ce 来安装 Docker 了。

2.3.安装Docker-CE

复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y 

安装时间还是有一点小长的,我们耐心等待即可。

如果这个安装过程中出现报错,我们可以去查看日志

bash 复制代码
#journalctl 是操作系统日志查看命令 
#-e 表示从末尾看 
#-u 表示看哪个系统组件的,我们的组件是docker 
journalctl -eu docker 

然后可以执行下面两个命令进行修复

bash 复制代码
systemctl daemon-reload 
systemctl start docker 

我们现在可以查看一下docker的运行状况

bash 复制代码
systemctl status docker

如果没有启动,那么就需要手动启动一下

bash 复制代码
sudo systemctl start docker

接下来我们还需要配置Docker自启动

bash 复制代码
# 设置开机⾃启动
sudo systemctl enable docker
# 查看是否开机启动
sudo systemctl list-unit-files|grep docker.service

查看版本

bash 复制代码
docker version

更详细查看docker 信息

bash 复制代码
docker info

2.4.实战经验

2.4.1.Docker镜像源修改

为什么要修改 Docker 镜像源?

默认情况下,Docker 从它的官方镜像仓库 Docker Hub 拉取镜像。对于位于中国大陆的用户来说,由于网络原因,直接从 Docker Hub 拉取镜像可能会非常慢,甚至经常失败。

为了解决这个问题,国内许多高校和云服务提供商设立了 Docker 镜像源(或称镜像加速器)。镜像源就是一个代理缓存服务,它会定期从 Docker Hub 同步常用的公共镜像。当你配置了镜像源后:

  1. 你的 Docker 客户端不会直接请求 docker.io (Docker Hub)。

  2. 而是去请求你配置的镜像源服务器(例如 https://docker.mirrors.ustc.edu.cn/)。

  3. 如果该镜像源上有你需要的镜像,它会直接返回给你,速度极快。

  4. 如果它没有(比如是一个很冷门的镜像),它会自动去 Docker Hub 拉取,缓存到本地,再返回给你。

这样可以极大地提升在国内拉取 Docker 镜像的速度和稳定性。

修改镜像源的过程

第 1 步:编辑配置文件 /etc/docker/daemon.json

这个文件是 Docker 守护进程(dockerd)的主要配置文件。Docker 在启动时会读取这个文件来应用各种自定义配置。

  • 命令 :你需要使用文本编辑器(如 vim, nano)来创建或修改这个文件。通常需要使用 sudo 来获得 root 权限。

    bash 复制代码
    sudo vim /etc/docker/daemon.json
  • 内容:往sudo vim /etc/docker/daemon.json里面写入下面这些内容。

    bash 复制代码
    {
      "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.mybacc.com",
        "https://dytt.online",
        "https://lispy.org",
        "https://docker.xiaogenban1993.com",
        "https://docker.yomansunter.com",
        "https://aicarbon.xyz",
        "https://666860.xyz",
        "https://docker.zhai.cm",
        "https://a.ussh.net",
        "https://hub.littlediary.cn",
        "https://hub.rat.dev",
        "https://docker.m.daocloud.io"
      ]
    }
    • registry-mirrors:这是一个键,它的值是一个数组,意味着你可以配置多个镜像源,Docker 会按顺序尝试(但通常一个就足够了)。

    • 这里给了大量的Docker镜像源

第 2 步:重新启动 Docker 守护进程

仅仅修改配置文件是不够的,需要让 Docker 守护进程重新加载这个配置文件才能生效。

bash 复制代码
sudo systemctl restart docker

重启后,所有新拉取镜像的请求都会通过你配置的镜像源进行。


如何验证配置是否成功?

运行以下命令来检查当前的 Docker 配置:

bash 复制代码
sudo docker info

在输出的信息中,你应该能找到类似下面这样子的几行:

如果看到了你配置的镜像源地址,就说明配置成功了!

2.4.2.Docker 目录修改

为什么需要修改 Docker 目录?

Docker 的所有核心数据,包括:

  • 镜像(Images)

  • 容器(Containers)

  • 卷(Volumes)

  • 网络配置(Networks)

  • 容器运行时数据

默认都存储在 /var/lib/docker 目录下。随着你拉取的镜像和创建的容器越来越多,这个目录会变得非常庞大,很容易耗尽系统根分区(/)的磁盘空间,导致系统问题。

因此,在安装 Docker 之前或之后,将其数据目录规划到一个足够大的独立分区或磁盘上,是一个非常重要的运维操作。

修改 Docker 配置文件 daemon.json

我们通过配置文件来修改Docker的数据目录

1.创建新目录

bash 复制代码
mkdir -p /data/var/lib/docker
  • -p:确保如果 /data/var/lib 路径不存在,也会被一并创建。

  • 这里你创建的新目录是 /data/var/lib/docker,这很好,因为它保持了路径的一致性,便于管理。你也可以简单地创建为 /data/docker

2.编辑 Docker 配置文件

bash 复制代码
sudo vim /etc/docker/daemon.json
  • 这个文件是 Docker 守护进程(dockerd)的核心配置文件。如果文件不存在,直接创建它。

3.添加 data-root 配置

bash 复制代码
{
  "data-root": "/data/var/lib/docker"
}

非常重要:JSON 格式必须正确!键和字符串必须用双引号,末尾不能有逗号。格式错误会导致 Docker 无法启动。

  • data-root:这个配置项明确指定了 Docker 守护进程用来存储所有数据的根目录路径。修改它就意味着告诉 Docker:"你以后别再用 /var/lib/docker 了,把所有东西都放到 /data/var/lib/docker 这里来。"

4.重新加载 systemd 和重启 Docker

bash 复制代码
sudo systemctl daemon-reload    # 让 systemd 重新读取某个服务的配置文件
sudo systemctl restart docker   # 重启 Docker 服务以应用新的配置
  • systemctl daemon-reload:当你修改了某个服务的配置文件(比如 Docker 的 docker.service 文件)时,需要运行这个命令来重新加载。但请注意 :仅仅修改 /etc/docker/daemon.json 通常不需要这一步,直接 restart 即可。restart 操作本身会重新加载 daemon.json。不过执行一下更保险,是一个好习惯。

5.检查 Docker 状态

bash 复制代码
sudo systemctl status docker
  • 这是至关重要的一步 !你必须确保 Docker 服务成功重启。如果 daemon.json 格式有误,这里会显示失败(failed)。如果失败,需要查看日志 journalctl -xe -u docker 来排查错误。

6.修改前后的变化:

  • 修改前docker info 命令输出中,Docker Root Dir: /var/lib/docker

  • 修改后docker info 命令输出中,Docker Root Dir: /data/var/lib/docker

这个时候我们再去查看这个目录,发现里面多了一些东西

到这里我们的Docker就算是彻底安装完成了。