来自其他容器的docker postgresql访问

时间:2019-07-29 12:01:02

标签: docker docker-compose

我有一个像这样的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。

1 个答案:

答案 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地址。在多主机环境中,除了容器本身运行的地方以外,它们也将无法从其他主机访问。