我有一个像这样的docker-compose文件。
version '2'
services:
app:
image: myimage
ports:
- "80:80"
networks:
mynet:
ipv4_adress: 192.168.22.22
db:
image: postgres:9.5
ports:
- "6432:5432"
networks:
mynet:
ipv4_adress: 192.168.22.23
...
networks:
mynet:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.22.0/24
我想将我的postgresql和应用程序放在子网中,以避免端口暴露在我的计算机/服务器之外。
从应用程序容器中,我无法连接到192.168.22.23,我安装了使用ifconfig / netstat的net-tools,并且看来容器无法通信。
我认为我有这个问题,因为我正在使用具有静态ipv4地址的子网。
我可以从主机访问两个静态IP(连接到postgres并访问应用程序)
您有什么建议吗,目标是访问另一个容器的端口以与他进行通信,而不必删除对静态ips的使用(至少在应用程序上)。在这里,从应用程序容器连接到postgresql。
答案 0 :(得分:1)
docker run -p
选项和Docker Compose ports:
选项将绑定地址作为可选参数。您可以使用它来使服务可从同一主机访问,但不能从其他主机访问:
services:
db:
ports:
- '127.0.0.1:6432:5432'
(此设置的另一个很好的用途是,如果您的网关计算机同时具有公共和专用网络接口,并且您希望只能从专用网络访问该服务。)
一旦有了此设置,就可以省去所有手动networks:
手动设置。同一主机上的非Docker服务可以通过特殊的主机名localhost
和发布的端口号访问该服务。 Docker服务可以使用容器间网络;在同一docker-compose.yml
文件中,您可以使用服务名称作为主机名以及内部端口号。
host$ PGHOST=localhost PGPORT=6432 psql
services:
app:
environment:
- PGHOST=db
- PGPORT=5432
您应该删除所有手动networks:
设置,并且通常尽量不要考虑Docker内部的IP地址。如果您的Docker是适用于Mac的Docker或Docker Toolbox,则根本无法访问内部IP地址。在多主机环境中,除了容器本身运行的地方以外,它们也将无法从其他主机访问。