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-reload 和 sudo systemctl restart docker 重启。
(2)构建阶段 & 运行阶段
拉取结束后要在本地构建,这个过程可能需要从外网下载相关依赖;运行过程中类似。
docker官方文档Proxy对于这两个阶段的处理方式比较一致,可以通过~/.docker/config.json中进行配置代理。如果不想使用json文件,那么还有几种额外的方法(不能混用):
- 构建阶段:使用
--network host或--build-arg参数指定代理(详细见上面知乎那篇文章) - 运行阶段:类似地使用
--env参数或-p 1080:1080端口映射的方式。
但是要注意, 如果是用--network=host,这样的话使用 -p 参数映射端口就没用了, 即所有端口都是开放和宿主机共享的。
这里在配置上需要注意的是docker的桥接网桥。当 Docker 启动时,会自动创建一个名为 bridge 的桥接网络(默认网络),并执行以下操作:
- 创建虚拟网桥:在宿主机内核中创建一个虚拟网络设备 docker0(类型为网桥),负责管理容器的网络通信。
- 分配子网:为该网桥分配一个私有子网(默认 172.17.0.0/16),用于容器 IP 的分配。
- 设置网关:将 docker0 的 IP 设为该子网的网关(默认 172.17.0.1),作为容器的默认路由出口。
每个连接到 bridge 网络的容器会获得一个该子网内的 IP(如 172.17.0.2),其网络命名空间中的默认路由指向网关 172.17.0.1。
容器通过 172.17.0.1:7897 访问宿主机的代理服务时:
- 数据包从容器的网络命名空间发出,目标 IP 是 172.17.0.1(虚拟网桥的 IP)。
- 宿主机的 docker0 网桥接收到数据包后,直接将其转发到宿主机的操作系统(无需经过物理网卡)。
- 宿主机的操作系统将数据包传递给监听 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"
}
}

浙公网安备 33010602011771号