# Docker 代理配置指南
## 一、临时代理设置(开发/测试时用)
### 命令行设置(仅当前终端有效):
```bash
PROXY_URL="http://127.0.0.1:1087"
export HTTP_PROXY=${PROXY_URL}
export HTTPS_PROXY=${PROXY_URL}
export NO_PROXY="localhost,127.0.0.1,docker.yourcompany.com"
```
### 使用场景:
* 临时测试代理是否可用;
* 用于执行如 `curl`、`docker build` 等命令时;
* 关闭终端或注销 shell 后失效。
### 一、环境变量说明
#### 1. `HTTP_PROXY` / `HTTPS_PROXY`
* **作用**:告诉各种网络工具(如 `curl`、`pip`、`apt`、`docker build` 等)在访问 **HTTP / HTTPS 网络时要通过指定的代理地址转发请求**。
* **格式**:
* `http://ip:port` 例如:`http://127.0.0.1:1087`
* 有用户名密码的写法:`http://username:password@proxy.example.com:8080`
* **支持的协议**:通常是 HTTP 代理,也可能支持 SOCKS(如 `socks5://`,但支持情况有限)
##### 示例:
```bash
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
```
#### 2. `NO_PROXY`
* **作用**:告诉系统 “对这些地址**不要走代理**,直接访问”。
* **格式**:逗号分隔的一组域名/IP 或通配符
##### 示例:
```bash
export NO_PROXY="localhost,127.0.0.1,dockerhub.mycompany.com,.internal"
```
上面的意思是:
* `localhost` 和 `127.0.0.1`(本地回环地址)不会经过代理;
* `dockerhub.mycompany.com` 是公司内网的镜像源,也不走代理;
* `.internal` 代表所有结尾是 `.internal` 的域名(例如 `svc.internal`)都不走代理。
> **重点提示**:
> 如果你不设 `NO_PROXY`,本地访问也会尝试走代理,容易导致访问失败或非常慢。
## 二、全局持久配置(推荐用于开发机)
### 写入 `~/.bashrc` 或 `~/.zshrc`(取决于你用哪个 Shell):
```bash
# ~/.bashrc 或 ~/.zshrc
PROXY_URL="http://127.0.0.1:1087"
export HTTP_PROXY=${PROXY_URL}
export HTTPS_PROXY=${PROXY_URL}
export NO_PROXY="localhost,127.0.0.1,dockerhub.yourcompany.com"
```
保存后执行:
```bash
source ~/.bashrc # 或 source ~/.zshrc
```
### 使用场景:
* 适用于所有命令行工具;
* 所有新的 shell 会话都会继承;
* 但**不会影响 Docker 守护进程后台拉镜像行为**。
## 三、Docker Daemon(后台服务)配置代理
> **适用于 `docker pull`、`docker-compose up` 拉镜像等行为**
### 1. 创建配置目录:
```bash
sudo mkdir -p /etc/systemd/system/docker.service.d
```
### 2. 创建配置文件:
```bash
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
```
内容如下(按需修改):
```ini
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1087"
Environment="HTTPS_PROXY=http://127.0.0.1:1087"
Environment="NO_PROXY=localhost,127.0.0.1,dockerhub.yourcompany.com"
```
### 3. 重启 Docker:
```bash
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
```
### 4. 验证是否生效:
```bash
sudo systemctl show --property=Environment docker
```
## 四、Docker 构建镜像(client)配置代理
### 方式一:写入 `~/.docker/config.json`
```bash
mkdir -p ~/.docker
nano ~/.docker/config.json
```
内容如下:
```json
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:1087",
"httpsProxy": "http://127.0.0.1:1087",
"noProxy": "localhost,127.0.0.1,dockerhub.yourcompany.com"
}
}
}
```
作用:会让 `docker build` 构建过程自动使用代理。
### 方式二:Dockerfile 中设置 ENV(容器构建时用)
```Dockerfile
FROM ubuntu:22.04
ENV HTTP_PROXY=http://127.0.0.1:1087
ENV HTTPS_PROXY=http://127.0.0.1:1087
ENV NO_PROXY=localhost,127.0.0.1
```
### 方式三:运行容器时临时传入
```bash
docker run \
-e HTTP_PROXY=http://127.0.0.1:1087 \
-e HTTPS_PROXY=http://127.0.0.1:1087 \
-e NO_PROXY=localhost,127.0.0.1 \
ubuntu:22.04 curl http://google.com
```
## 总结表格
| 场景 | 配置方法 | 是否推荐 |
| ---------------------- | --------------------------------------------- | ------ |
| 临时测试代理 | `export HTTP_PROXY=...` | ✅ 开发调试 |
| 永久生效(命令行工具) | `.bashrc` / `.zshrc` | ✅ 推荐 |
| Docker 构建镜像时走代理 | `~/.docker/config.json` | ✅ 推荐 |
| Docker 拉取镜像走代理(daemon) | `/etc/systemd/system/docker.service.d/*.conf` | ✅ 必须 |
| Dockerfile 设置代理 | `ENV HTTP_PROXY=...` | ✅ 如需构建 |
| 运行容器时传入代理 | `docker run -e HTTP_PROXY=...` | ✅ 临时使用 |
昵称
0 声望
这家伙太懒,什么都没留下