You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Compose在容器间传递IP(Nginx场景)

在Docker Compose中让Nginx获取API服务的IP地址

首先说个更省心的常规方案:其实你完全不需要硬编码IP——Docker Compose默认创建的网络里,服务名本身就是一个可解析的DNS记录。比如直接在Nginx配置里写proxy_pass http://api;,Nginx会自动通过DNS解析到api容器的IP,而且容器重启IP变化时也能自动更新,比硬编码IP靠谱多了。

如果确实有特殊需求必须获取IP并写入Nginx配置,下面给你两种可行方案:

方案一:自定义入口脚本动态生成Nginx配置

这是最常用也最可靠的方式,思路是在Nginx容器启动时,先解析api服务的IP,再替换配置模板里的占位符,最后启动Nginx。

步骤1:准备Nginx配置模板

创建nginx.conf.template文件,用占位符标记需要替换的IP位置:

server {
    listen 80;

    location /api/ {
        proxy_pass http://${API_IP}:8080/; # 用${API_IP}作为IP占位符
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

步骤2:编写自定义入口脚本

创建entrypoint.sh脚本,记得给它加执行权限(chmod +x entrypoint.sh):

#!/bin/sh

# 解析api服务的IP地址(Docker网络内getent可以直接通过服务名查IP)
API_IP=$(getent hosts api | awk '{print $1}')
export API_IP

# 用envsubst替换模板生成实际的Nginx配置
envsubst '${API_IP}' < /etc/nginx/conf.d/nginx.conf.template > /etc/nginx/conf.d/default.conf

# 启动Nginx(保持前台运行,符合容器规范)
exec nginx -g 'daemon off;'

步骤3:修改Docker Compose配置

挂载模板和脚本,指定自定义入口:

version: "3.9"
services:
  webserver:
    image: nginx:alpine
    volumes:
      - ./nginx.conf.template:/etc/nginx/conf.d/nginx.conf.template
      - ./entrypoint.sh:/entrypoint.sh
    entrypoint: ["/entrypoint.sh"]
    ports:
      - "80:80"
    depends_on:
      - api # 确保api服务先启动,避免解析失败

  api:
    image: your-api-image:latest
    # 这里填你的api服务配置,比如端口、挂载等

方案二:提前获取IP传入环境变量(不推荐)

这种方式需要在启动Compose前手动获取api容器的IP,再传给webserver,但缺点很明显:容器重启后IP会变,必须重新执行命令,灵活性很差。

示例命令:

# 先启动api服务
docker-compose up -d api

# 获取api容器的IP
API_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker-compose ps -q api))

# 启动webserver并传入IP环境变量
API_IP=$API_IP docker-compose up -d webserver

还是强烈推荐方案一,它能自动适配容器IP变化,完全不需要手动干预。

内容的提问来源于stack exchange,提问作者Jeanluca Scaljeri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:22:33