Ubuntu24.04安装docker过程

  • 22025-07-13 23:11:48 星期日
  • 介绍了如何在Ubuntu下安装docker的命令。最关键的是代理问题。

1. 使用 docker desktop(适用个人用户、开箱即用)

能在软件中设置代理

2. 直接使用官方脚本

2.1 安装

# 下载并运行官方脚本(自动适配系统版本)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 安装后查看版本
docker --version
# 添加服务自启动
sudo systemctl enable docker

添加当前用户到 docker 组(避免每次输 sudo),来源:Linux post-installation steps for Docker Engine

sudo groupadd docker # 创建 docker 组(好像安装后会自动创建)
sudo usermod -aG docker $USER # 将当前用户添加到 docker 组中
newgrp docker  # 刷新组权限(或重启终端)
docker run hello-world # 验证是否成功(用 docker ps 命令也可以)

重要:现在 docker hub 限制 pull/push 的次数,可以先登录 docker hub 账号,然后在终端中使用 docker login 在浏览器中输入 device confirmation code 进行绑定,得到 auth 信息。否则就算后面配置好了代理仍会无法下载

2.2 方法一:国内镜像网站

不使用代理,而是更改配置文件,使用国内镜像站。
配置教程:国内可用Docker镜像源加速器/DockerHub镜像汇总、对应的Github链接。注意为了保险需要修改两个文件:

  • 加速镜像拉取的/etc/docker/daemon.json
  • docker底层的containerd服务/etc/containerd/config.toml

目的:确保全链路加速。即使 Docker 客户端配置了镜像站,若 Containerd 未配置,底层拉取时仍可能直接访问 docker.io(例如,当 Docker 客户端与 Containerd 版本不兼容时)。同时配置可确保​​从客户端到运行时的全链路镜像拉取都通过镜像站。

配置方法便不再赘述,和上面保持一致即可。

2.3 方法二:代理

其实如果能直接访问国外镜像站,那么问题就迎刃而解了。
首先我们先了解一下 docker 的“三种环境”

第一个环境是 docker daemon 守护程序,就是运行在我们电脑上的 docker 软件,它负责管理镜像和容器。我们在命令行输入的内容,就是由 docker daemon 来处理的。
第二个环境是 docker build 环境。也是一个容器环境。docker 在 build 镜像时总是要新建一个临时容器,这个容器带了一个环境,build 的过程就在该环境中运行。
第三个环境是容器 container 自己的环境。每个运行的容器拥有的环境不同。

只有有了这个基本认识,才能看懂这个大而全的配置教程:docker 设置代理,以及国内加速镜像设置

(1)拉取/推送阶段

官方文档:Daemon proxy configuration
有两种方法:

  • /etc/docker/daemon.json中设置。
  • /etc/systemd/system/docker.service.d中新建conf文件。
    两种方法在官方文档中都有提及,只是写法不同,我在json中修改的。
{
  "proxies": {
    "http-proxy": "http://xxx:7897",
    "https-proxy": "http://xxx:7897",
    "no-proxy": "localhost,127.0.0.0/8"
  }
}

然后 sudo systemctl daemon-reloadsudo systemctl restart docker 重启。

(2)构建阶段 & 运行阶段

拉取结束后要在本地构建,这个过程可能需要从外网下载相关依赖;运行过程中类似。

docker官方文档Proxy对于这两个阶段的处理方式比较一致,可以通过~/.docker/config.json中进行配置代理。如果不想使用json文件,那么还有几种额外的方法(不能混用):

  • 构建阶段:使用--network host--build-arg参数指定代理(详细见上面知乎那篇文章)
  • 运行阶段:类似地使用--env参数或-p 1080:1080端口映射的方式。

但是要注意, 如果是用--network=host,这样的话使用 -p 参数映射端口就没用了, 即所有端口都是开放和宿主机共享的。


这里在配置上需要注意的是docker的桥接网桥。当 Docker 启动时,会自动创建一个名为 bridge 的桥接网络(默认网络),并执行以下操作:

  1. 创建虚拟网桥:在宿主机内核中创建一个虚拟网络设备 docker0(类型为网桥),负责管理容器的网络通信。
  2. 分配子网:为该网桥分配一个私有子网(默认 172.17.0.0/16),用于容器 IP 的分配。
  3. 设置网关:将 docker0 的 IP 设为该子网的网关(默认 172.17.0.1),作为容器的默认路由出口。

每个连接到 bridge 网络的容器会获得一个该子网内的 IP(如 172.17.0.2),其网络命名空间中的默认路由指向网关 172.17.0.1。

容器通过 172.17.0.1:7897 访问宿主机的代理服务时:

  1. 数据包从容器的网络命名空间发出,目标 IP 是 172.17.0.1(虚拟网桥的 IP)。
  2. 宿主机的 docker0 网桥接收到数据包后,直接将其转发到宿主机的操作系统(无需经过物理网卡)。
  3. 宿主机的操作系统将数据包传递给监听 7897 端口的代理服务,完成本地通信。

总结来说,桥接网络的IP只是个“标识”而已,代表:容器通过该 IP 访问宿主机的服务时,数据包仅在宿主机内核中转发,无需经过物理网络接口。

docker network ls
docker inspect bridge

介绍完网桥后我们就能理解:无论是构建还是运行,这都是从“容器”角度出发的工作,所以代理的IP应该是网关地址。

"proxies": {
  "default": {
    "http-proxy": "http://172.17.0.1:7897",
    "https-proxy": "http://172.17.0.1:7897",
    "no-proxy": "localhost,127.0.0.0/8"
  }
}

3. 参考资料

posted @ 2025-07-13 23:28  7hu95b  阅读(530)  评论(0)    收藏  举报