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.sh2. proxy 命令到底能代理什么?
| 对象 | 是否被 proxy command 影响 | 说明 |
|---|---|---|
| curl / wget | 是 | 这类工具会读取 http_proxy / https_proxy 环境变量。 |
| git clone | 是 | Git 底层用 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 pull、docker compose pull、docker 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 image | Docker daemon | 配置 /etc/systemd/system/docker.service.d/proxy.conf |
| build image | BuildKit / build container | daemon proxy + compose build.args |
| runtime app | 运行中的 container | compose 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/12Container 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/12proxy 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/LibreChat6. 新服务器初始化推荐顺序
- 确认代理服务器
192.168.112.126:7890能从新服务器访问。 - 添加
proxy和sproxy到~/.bashrc。 - 用
proxy curl测试外网。 - 安装 Docker 时,下载脚本用
proxy,执行脚本用sproxy。 - 安装完成后,给 Docker daemon 配 systemd proxy。
- 重启 Docker,并用
sudo docker pull alpine验证。 - 如果使用 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-worldQuick 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解决。