如何通过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
相关产品推荐
相关产品推荐

