如何让Docker容器间通过localhost访问?(配置限制场景)
让Docker容器通过localhost访问另一个容器的解决方案
问题背景
我有两个Docker运行配置:
配置1(PostgreSQL容器):
docker run \ --name webapp_postgres \ -e POSTGRES_PASSWORD='abc123' \ -e POSTGRES_DB="webapp" \ -p5432:5432 \ -d postgres
配置2(Web应用容器):
docker run \ --name webapp \ -p8080:8443 \ appname/webapp
需求是让webapp容器内的应用通过localhost访问postgres容器,但目前无法修改应用的访问地址。尝试过自定义网络(通过--net加入同一网络)但无效,使用--net host虽然能访问5432端口,但导致无法正常访问web应用。
可行解决方案
方法1:自定义网络+--add-host映射localhost到PostgreSQL容器
这种方法既保留端口映射功能,又能让webapp容器内的localhost指向postgres容器:
- 创建自定义Docker网络:
docker network create webapp-network
- 重新启动PostgreSQL容器并加入该网络:
docker run \ --name webapp_postgres \ -e POSTGRES_PASSWORD='abc123' \ -e POSTGRES_DB="webapp" \ -p 5432:5432 \ --network webapp-network \ -d postgres
- 启动webapp容器时,加入同一网络,并通过
--add-host将localhost映射到postgres容器的名称(自定义网络中容器名可直接解析为对应IP):
docker run \ --name webapp \ -p 8080:8443 \ --network webapp-network \ --add-host localhost:webapp_postgres \ appname/webapp
原理:--add-host会在webapp容器的/etc/hosts文件中添加一条记录,将localhost指向webapp_postgres容器的IP。这样应用访问localhost:5432时,实际会连接到postgres容器,同时web应用的端口映射8080:8443仍正常生效。
方法2:调整host模式的访问方式(可选)
如果选择使用--net host模式,容器会共享宿主机的网络栈,此时不需要端口映射,直接通过宿主机的8443端口访问web应用即可:
确保postgres容器已启动(保留原端口映射
-p5432:5432)。启动webapp容器:
docker run \ --name webapp \ --net host \ appname/webapp
此时web应用可通过http://<宿主机IP>:8443访问,同时容器内的localhost指向宿主机,能直接访问宿主机映射的5432端口(即postgres容器)。但这种方法需要调整web应用的访问端口,适合能接受端口变更的场景。
内容的提问来源于stack exchange,提问作者9 Guy
相关产品推荐
相关产品推荐

