Ubuntu Proxy, Docker Proxy & Compose Init

新 Ubuntu 服务器初始化时,先分清两类代理:shell 前缀 proxy 只影响当前命令;Docker daemon proxy 专门给 dockerd 拉镜像、构建镜像使用。Docker Compose 又分为 pull、build、container runtime 三层,不能只靠一个 proxy 命令解决全部网络问题。

1. Shell 前缀 proxy / sproxy

这个 proxy 是给当前 shell 命令临时加环境变量。适合 curl、git、wget、普通脚本等 CLI 工具。

bash
cat >> ~/.bashrc <<'SZR_PROXY_EOF'

# Use LAN proxy only for one command.
proxy() {
  http_proxy=http://192.168.112.126:7890   https_proxy=http://192.168.112.126:7890   HTTP_PROXY=http://192.168.112.126:7890   HTTPS_PROXY=http://192.168.112.126:7890   ALL_PROXY=socks5://192.168.112.126:1080   "$@"
}

# Use LAN proxy for commands executed through sudo.
sproxy() {
  sudo     http_proxy=http://192.168.112.126:7890     https_proxy=http://192.168.112.126:7890     HTTP_PROXY=http://192.168.112.126:7890     HTTPS_PROXY=http://192.168.112.126:7890     ALL_PROXY=socks5://192.168.112.126:1080     "$@"
}
SZR_PROXY_EOF

source ~/.bashrc
如果你的代理没有 SOCKS5 1080 端口,就删掉或改掉 ALL_PROXY 那一行。HTTP 代理常见端口是 7890

常用写法

bash
proxy curl -I https://get.docker.com
proxy git clone https://github.com/danny-avila/LibreChat.git
sproxy bash get-docker.sh

2. proxy 命令到底能代理什么?

对象是否被 proxy command 影响说明
curl / wget这类工具会读取 http_proxy / https_proxy 环境变量。
git cloneGit 底层用 libcurl,通常会读代理环境变量。
sudo 后的脚本不一定sudo 可能清掉环境变量,所以用 sproxy
管道右侧命令proxy curl ... | sudo bash 只代理左边 curl,右边 bash 不会自动继承。
docker CLI部分只影响你执行的 docker 命令进程,不等于影响后台的 dockerd
dockerd 拉镜像通常否Docker daemon 是 systemd 服务,需要单独配置 daemon proxy。
容器内部应用运行中的 container 需要在 compose 的 environment 里单独传代理。

3. Docker daemon 专用 proxy

如果 docker pulldocker compose pulldocker compose up 拉镜像失败,通常要给 Docker daemon 配代理,而不是只在命令前加 proxy

bash
sudo mkdir -p /etc/systemd/system/docker.service.d

sudo tee /etc/systemd/system/docker.service.d/proxy.conf > /dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.112.126:7890"
Environment="HTTPS_PROXY=http://192.168.112.126:7890"
Environment="ALL_PROXY=socks5://192.168.112.126:1080"
Environment="NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

验证 Docker daemon 是否吃到代理

bash
systemctl show --property=Environment docker
sudo docker pull alpine
注意:修改 daemon proxy 之后必须 daemon-reload 并重启 Docker。重启 Docker 会影响正在运行的容器。

4. Docker Compose 要分三层看

docker compose up 不是单一网络动作。它可能会拉镜像、构建镜像,也可能启动容器后由容器内部应用访问外网。

阶段发生在哪里推荐代理方式
pull imageDocker daemon配置 /etc/systemd/system/docker.service.d/proxy.conf
build imageBuildKit / build containerdaemon proxy + compose build.args
runtime app运行中的 containercompose environment 传入代理变量

Compose build args 示例

yaml
services:
  app:
    build:
      context: .
      args:
        HTTP_PROXY: http://192.168.112.126:7890
        HTTPS_PROXY: http://192.168.112.126:7890
        ALL_PROXY: socks5://192.168.112.126:1080
        NO_PROXY: localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12

Container runtime environment 示例

yaml
services:
  app:
    environment:
      HTTP_PROXY: http://192.168.112.126:7890
      HTTPS_PROXY: http://192.168.112.126:7890
      ALL_PROXY: socks5://192.168.112.126:1080
      NO_PROXY: localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
proxy docker compose up 可以影响 compose CLI 本身,但不能保证影响 dockerd、build 阶段和容器内部应用。

5. Git 代理和 HTTP/2 报错

如果 clone GitHub 时出现 curl 16 Error in the HTTP2 framing layer,优先把 Git 降级到 HTTP/1.1。

bash
git config --global http.version HTTP/1.1

# Or only for one command:
proxy git -c http.version=HTTP/1.1 clone --depth 1 https://github.com/danny-avila/LibreChat.git
建议不要用 proxy sudo git clone。更稳的方式是普通用户 clone,然后 sudo mv 到目标目录。
bash
cd ~
proxy git -c http.version=HTTP/1.1 clone --depth 1 https://github.com/danny-avila/LibreChat.git
sudo mv LibreChat /opt/
sudo chown -R szrhk:szrhk /opt/LibreChat

6. 新服务器初始化推荐顺序

  1. 确认代理服务器 192.168.112.126:7890 能从新服务器访问。
  2. 添加 proxysproxy~/.bashrc
  3. proxy curl 测试外网。
  4. 安装 Docker 时,下载脚本用 proxy,执行脚本用 sproxy
  5. 安装完成后,给 Docker daemon 配 systemd proxy。
  6. 重启 Docker,并用 sudo docker pull alpine 验证。
  7. 如果使用 Compose,根据需要给 build args 和 runtime environment 传代理。
bash
# 1. Test proxy.
curl -x http://192.168.112.126:7890 https://get.docker.com -I
proxy curl -I https://download.docker.com

# 2. Install Docker.
proxy curl -fsSL https://get.docker.com -o get-docker.sh
sproxy bash get-docker.sh

# 3. Verify.
sudo systemctl enable --now docker
systemctl show --property=Environment docker
sudo docker run hello-world

Quick summary

  • proxy command:只给当前命令加代理,适合 curl / git / wget。
  • sproxy command:给 sudo 执行的命令也传代理。
  • Docker 拉镜像主要靠 dockerd,需要 systemd daemon proxy。
  • Docker Compose 分 pull / build / runtime 三层,必要时三层都要配。
  • GitHub clone 的 HTTP/2 framing 错误,通常用 http.version HTTP/1.1 解决。