Docker Compose中修改容器内部端口且不暴露给主机的方法
解决Docker Compose中修改容器内部端口且不暴露给主机的问题
没问题,这个需求我刚好处理过,核心是让superservice在容器内部改用8081端口,同时完全不对外暴露端口,以下是两种可行方案:
方案一:利用镜像支持的环境变量配置端口
大部分规范的Docker镜像都会提供环境变量来调整服务监听的端口(比如常见的PORT、SERVICE_PORT),你可以直接在Compose配置里添加环境变量:
services: api: build: . ports: - "8080:8080" superservice: image: superservice # 设置环境变量让服务监听8081端口 environment: - PORT=8081 # 注意:这里要换成镜像实际支持的环境变量名,比如有些镜像用SERVICE_PORT # 不要添加ports字段!这样主机无法直接访问该服务
说明:
- 没有
ports配置的情况下,superservice的8081端口只能被同一个Docker Compose网络内的其他服务(比如你的api服务)访问,访问地址是superservice:8081(Compose默认会给每个服务分配一个对应服务名的域名)。 - 如果不确定镜像支持哪个环境变量,可以先在本地跑一下容器查看:
docker run --rm superservice env,或者查看镜像的启动脚本内容。
方案二:覆盖容器的启动命令指定端口
如果镜像不支持环境变量配置端口,你可以直接修改容器的启动命令,传入端口参数:
services: api: build: . ports: - "8080:8080" superservice: image: superservice # 覆盖默认启动命令,指定监听8081端口 command: ["--port", "8081"] # 根据镜像实际的启动参数调整,比如有些用-p 8081 # 同样不要添加ports字段
说明:
- 要确认镜像的启动命令格式,可以先运行
docker inspect superservice查看Cmd字段,再调整参数。
关键注意点
绝对不要配置ports字段,ports是用来做主机到容器的端口映射,一旦配置就会让主机能访问该服务,完全不符合你的需求。只要不配置ports,容器内的端口就只会在Compose的内部网络中可见。
内容的提问来源于stack exchange,提问作者phil294
相关产品推荐
相关产品推荐

