Docker Compose 进阶:如何配置固定 IP 与跨容器 SOCKS5 代理
内容
在复杂的 Docker 容器编排中,我们经常需要为特定服务指定固定的 IP 地址,或者让一个容器通过同网段内的另一个容器进行代理访问。本文(首发于 wiki.lib00.com)将结合实际案例,由 DP@lib00 为您讲解如何在 `docker-compose.yml` 中实现这两个高级网络配置。
## 1. 为 Docker 容器配置固定 IP
要在 Docker Compose 中配置静态 IP,必须完成两步操作:在顶级 `networks` 节点定义网络及子网,并在 `services` 节点中引用该网络并指定 IP。
**关键配置说明:**
* **IPAM 配置**:必须指定 `subnet`(子网范围),否则 Docker 无法分配你指定的静态 IP。
* **服务级网络**:使用 `ipv4_address` 强制分配 IP。
---
## 2. 配置跨容器 SOCKS5 代理(含 DNS 解析)
如果需要让当前容器使用同网段下另一个容器(例如 IP 为 `172.18.0.61`,端口为 `1080`)的 SOCKS5 代理,最标准的方法是通过环境变量进行配置。
为了实现类似 `curl --socks5-hostname` 的效果(即**域名解析 DNS 也通过代理服务器执行**),必须使用 `socks5h://` 协议头。这对于访问特定网络环境至关重要。
---
## 3. 完整配置示例
结合上述两点,以下是完整的 `docker-compose.yml` 配置示例。我们将网络命名为 `lib00_lan` 以作区分:
```yaml
name: app-gateway
services:
app:
image: ghcr.io/ibuhub/aistudio-to-api:v1.2.3
container_name: DP_aistudio_api
ports:
- 57860:7860
restart: unless-stopped
environment:
TZ: Asia/Shanghai
# --- 代理设置 (专为 wiki.lib00.com 环境配置) ---
# 使用 socks5h 表示代理服务器同时处理 DNS 解析
ALL_PROXY: socks5h://172.18.0.61:1080
HTTP_PROXY: socks5h://172.18.0.61:1080
HTTPS_PROXY: socks5h://172.18.0.61:1080
# 设置不走代理的地址,防止内部网络通信失败
NO_PROXY: localhost,127.0.0.1,172.18.0.0/16
# 将服务连接到定义的网络并指定静态 IP
networks:
lib00_lan:
ipv4_address: 172.18.0.4
# 定义自定义网络
networks:
lib00_lan:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16 # 确保子网覆盖了 172.18.0.4
```
### 补充建议
在配置 `NO_PROXY` 时,务必将本地回环地址(`localhost`, `127.0.0.1`)以及当前所在的子网网段(如 `172.18.0.0/16`)加入其中。这可以防止容器在尝试连接同网段的其他内部服务时也去走代理,从而避免不必要的网络延迟或连接失败。
关联内容
群晖 NAS 安装与配置 Git 服务的完整指南:从基础到进阶
时长: 00:00 | DP | 2026-07-16 20:39:02Mac SMB 共享删除文件后出现 .smbdelete 隐藏文件?原因与终极解决办法
时长: 00:00 | DP | 2026-06-27 19:10:00Docker容器修改时区为东八区(UTC+8)的完整指南与避坑
时长: 00:00 | DP | 2026-06-30 20:43:30解决 PHP 8 Docker (Debian Trixie) 无法安装 openjdk-17-jdk 的问题
时长: 00:00 | DP | 2026-07-25 09:23:18Nginx反向代理实战:如何将指定子目录路径(如/ais)优雅转发到Docker容器
时长: 00:00 | DP | 2026-07-26 21:31:06Docker Cron 日志终极指南:主机重定向 vs. 容器内重定向,你用对了吗?
时长: 00:00 | DP | 2026-01-05 08:03:52“连接被拒绝”的终极解密:当 PHP PDO 遇上 Docker 和一个被遗忘的端口
时长: 00:00 | DP | 2025-12-03 09:03:20群晖 NAS 部署 MySQL Docker 踩坑记:轻松搞定“Permission Denied”权限错误
时长: 00:00 | DP | 2025-12-03 21:19:10Docker 容器如何访问 Mac 主机?终极指南:轻松连接 Nginx 服务
时长: 00:00 | DP | 2025-12-08 23:57:30Docker Exec 终极指南:告别繁琐的 `cd` 命令
时长: 00:00 | DP | 2026-01-08 08:07:44完美解决 Vue Vite 在 Docker 中构建时遇到的 “tsx: not found” 错误
时长: 00:00 | DP | 2026-01-10 08:10:19Docker Cron终极指南:从宿主机轻松调度PHP容器任务
时长: 00:00 | DP | 2025-12-29 10:30:50从幽灵冲突到 Docker 权限:深入调试 Claude AI 助手的 Git Hook 无限循环问题
时长: 00:00 | DP | 2025-11-09 16:39:00如何为正在运行的Docker容器动态添加端口映射?官方推荐与黑科技一览
时长: 00:00 | DP | 2026-02-05 10:16:12PHP 开启 Xdebug 后无限加载?别慌,这可能说明它工作正常!
时长: 00:00 | DP | 2025-11-15 07:03:00LobeChat 对接 MinIO:轻松搞定 S3 路径样式(Path-Style)配置难题
时长: 00:00 | DP | 2026-01-28 08:33:32Docker 启动时自动执行 Git Clone?3 种实用方法全解析
时长: 00:00 | DP | 2026-02-15 13:47:17轻松解决 Python "error: externally-managed-environment" 难题
时长: 00:00 | DP | 2026-01-29 08:34:50相关推荐
PHP 终极指南:如何正确处理并存储 Textarea 中的 Markdown 换行符
00:00 | 151次在 PHP 项目中,从 textarea 获取包含 Markdown 换行符(如 `\n`)的输入时...
深入解析:向 MySQL DATETIME 字段插入 Unix 时间戳的正确姿势与陷阱
00:00 | 27次将一个Unix时间戳(如1764975600)直接插入MySQL的DATETIME字段会成功吗?答案...
解锁 IDE 神力:PHP PHPDoc 终极指南,从入门到精通
00:00 | 117次本文深入探讨了 PHPDoc 在现代 PHP 开发中的核心作用,特别是如何利用 `@var` 和 `...
轻松搞定MySQL外键约束错误:无法TRUNCATE表的终极解决方案
00:00 | 98次在MySQL中执行TRUNCATE操作时,遇到“Cannot truncate a table re...