Github开源生信云平台 DEMO
docker pull
docker build
docker run
-e
--build-arg
Docker 的代理配置分为三个层面,分别对应不同的使用场景。下面逐一介绍:
docker pull 时,网络请求由 dockerd 守护进程自身发起,因此需要为守护进程配置代理。在 Linux 上,Docker 通常由 systemd 管理,配置方式如下:
dockerd
sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
sudo systemctl daemon-reload sudo systemctl restart docker
sudo systemctl show --property=Environment docker # 或 docker info | grep -i proxy
⚠️ 注意:如果代理需要认证,特殊字符(如 #、@ 等)需要用 %% 进行双转义,例如 http://user:pass%%40word@proxy:8080。
#
@
%%
http://user:pass%%40word@proxy:8080
通过 ~/.docker/config.json 配置,Docker CLI 会自动将代理环境变量注入到构建和运行的容器中:
~/.docker/config.json
{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:7890", "httpsProxy": "http://127.0.0.1:7890", "noProxy": "localhost,127.0.0.1,.example.com" } } }
配置后,docker build 和 docker run 创建的容器会自动获得 HTTP_PROXY、HTTPS_PROXY 等环境变量。
HTTP_PROXY
HTTPS_PROXY
docker run -e HTTP_PROXY=http://127.0.0.1:7890 \ -e HTTPS_PROXY=http://127.0.0.1:7890 \ -e NO_PROXY=localhost,127.0.0.1 \ your_image
version: '3' services: app: image: your_image environment: - HTTP_PROXY=http://127.0.0.1:7890 - HTTPS_PROXY=http://127.0.0.1:7890 - NO_PROXY=localhost,127.0.0.1
ENV HTTP_PROXY http://proxy.example.com:8080 ENV HTTPS_PROXY http://proxy.example.com:8080
⚠️ 不推荐这种方式,因为代理地址会被固化到镜像中,存在安全风险且缺乏灵活性。
docker build \ --build-arg HTTP_PROXY=http://127.0.0.1:7890 \ --build-arg HTTPS_PROXY=http://127.0.0.1:7890 \ --build-arg NO_PROXY=localhost,127.0.0.1 \ -t your_image .
docker build --network host -t your_image .
这样构建时容器直接使用宿主机的网络栈,无需额外配置代理 IP。
如果只是 docker pull 拉取镜像慢,可以配置国内镜像加速器,编辑 /etc/docker/daemon.json:
/etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.m.daocloud.io" ] }
然后重启 Docker 服务即可。
/etc/systemd/system/docker.service.d/http-proxy.conf
--network host
environment
registry-mirrors
💡 重要提醒:守护进程代理和容器运行时代理是相互独立的,配置了守护进程代理并不会自动传递给容器,需要根据实际需求分别配置。