安装
参见官方文档。对于Windows,通常直接安装 Docker Desktop,需要注意的是,如果安装后始终显示“Docker Desktop stopped…”,则最简单的解决方法是从 Windows Store 中安装 WSL 系列的 Ubuntu 发行版(比如 Ubuntu 20.04)。可能还需要以下命令更新 WSL:
1
wsl --update
代理
Docker 的代理逻辑一度让我感到十分混乱,理清楚后发现其实很简单:docker 采用的是 C/S 架构,即 client/server 架构,客户端就是docker
命令,服务端就是dockerd
命令,d
即daemon
的缩写,表示后台运行。因此,对于 Docker 的代理主要包括两种,一个是影响客户端的,另一个是影响服务端的。
为了方便说明,官方将客户端称之为 docker cli,服务端称之为 docker daemon。对这两种代理,官方文档中均作出了明确的说明:
- docker cli:Proxy configuration | Docker Docs
- docker daemon:Daemon proxy configuration | Docker Docs
具体而言,docker daemon 的代理决定了 docker pull 时是否通过代理去从 Docker Hub 获取 docker 镜像;而 docker cli 的代理决定了 docker 容器内部的 HTTP_PROXY、HTTPS_PROXY 等环境变量是否设置,如果设置,则 curl、wget 等命令均会走这些环境变量指定的代理,而许多命令(如 PHP 的 composer 命令)底层访问 HTTP/HTTPS 时使用的即是 curl,所以会根据 HTTP_PROXY 等环境变量决定是否走代理。
对于每种代理,又有命令行选项和配置文件两种方式可以设置。此外,对于 daemon,如果安装了 Docker Desktop,则其代理又以界面配置为准,会忽略配置文件中的设置。下面具体说明
docker daemon
use docker desktop
Docker Desktop 是 docker 官方现在主推的 docker 使用方式,安装好后会自动安装 docker,dockerd,docker-compose 等相关命令,且能直观简单地管理容器、镜像、卷等。当然如果系统资源有限,或者不支持图形界面,则 Docker Desktop 就没有多大优势了。
如果使用了 Docker Desktop,则直接使用该 GUI 软件中的代理设置功能即可,具体位置在:Settings->Resources->Proxies
。
Docker Desktop 官方相关文档:
- https://docs.docker.com/desktop/networking/?uuid=93CAAB76-FC9E-4F21-87E6-9604732B7EC8#httphttps-proxy-support
- https://docs.docker.com/desktop/settings/windows/#proxies
需要注意的是:代理地址 locahost
或者 127.0.0.1
可能不起效果,这时可使用网卡上设置的 IP 地址(虚拟网卡上设置的也可,例如vEthernet (WSL (Hyper-V firewall))
)。当然如果该地址是通过 DHCP 获得的,那么需要注意它可能会改变,需要即时更新。
not use docker desktop
如果未使用 Dockers Desktop,则可通过dockerd
的命令行参数传入代理配置或者通过其配置文件设置代理。当然,用得比较多的还是配置文件,其默认配置文件为 daemon.json
,添加如下内容即可使用代理:
1
2
3
4
5
6
7
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
命令参数为--http-proxy
和--https-proxy
。由于使用不多,且官方也不推荐,就不举例了。
除了这两种方式外,还有个环境变量方式。即dockerd
也会按照环境变量HTTPS_PROXY
、HTTP_PROXY
等进行代理配置。通常dockerd
的启动是在开机时自动进行的,这时可能还未设置环境变量,那我们如何使其生效呢?对于使用systemctl
的系统,可以通过 systemd unit file 来达到我们的目的。详见 Daemon proxy configuration | Docker Docs。也可参考 https://blog.csdn.net/omage/article/details/139560401
docker cli
Docker Desktop 中的设置不会影响 docker cli,docker cli 还是根据其配置文件或者命令行参数来设置代理的。其默认配置文件为~/.docker/config.json
,故而直接在该文件中添加如下配置即可实现代理:
1
2
3
4
5
6
7
8
9
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
例如 Windows 中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"auths": {},
"credsStore": "desktop",
"proxies": {
"default": {
"httpProxy": "http://192.168.56.200:7890",
"httpsProxy": "https://192.168.56.200:7890",
"noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
},
"currentContext": "default",
"plugins": {
"-x-cli-hints": {
"enabled": "true"
}
}
}
设置好后,执行docker run
或者docker build
时会自动设置容器中的相关环境变量,包括HTTP_PROXY
等,从而实现容器内部的代理,使内部执行 HTTP/HTTPS 相关命令时走代理,包括apt
命令、composer
命令等。
也可在执行docker run
和docker build
时手动在命令行配置代理,例如:
1
2
docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis
compose
Compose file version 3 reference | Docker Documentation
遇到过的问题
- Some way to clean up / identify contents of /var/lib/docker/overlay - General Discussions / General - Docker Community Forums
- docker network connect | Docker Documentation
- How to save a Docker container state - Stack Overflow
- 进入容器 - Docker —— 从入门到实践
- How does compose chooses subnet for default network?
- 如果virtualbox休眠,则再使用时可能存在以下问题:
1
compose.cli.errors.log_api_error: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-71736a739085 -j RETURN: iptables: No chain/target/match by that name.
此时应该重启docker,详情见Unable to enable SKIP DNAT rule · Issue #211 · wodby/docker4drupal
修订记录
修订时间 | 修订人 | 版本 | 说明 |
---|---|---|---|
2025-03-07 | wsxq2 | 1.0 | 初稿 |