2

我想在三个容器中创建一个由一个主服务器和两个从服务器组成的 PostgreSQL 集群。我想用 docker-compose 来做到这一点。一切正常,但我无法从我的 Mac ping 容器。

这是我的 docker-compose.yml 的代码。

在 Stackoverflow 上有这个线程How could I ping my docker container from my host that address docker Standalone 而不是 docker-compose。

version: '3.6'

volumes:
    pgmaster_volume:
    pgslave1_volume:
    pgslave2_volume:

services:
    pgmaster:
        container_name: pgmaster

        build:
            context: ../src
            dockerfile: Dockerfile

        image: docker-postgresql:latest

        environment:
            NODE_NAME: pgmaster # Node name

        ports:
            - 5422:5432

        volumes:
            - pgmaster_volume:/home/postgres/data

        networks:
            cluster:
                ipv4_address: 10.0.2.31
                aliases:
                    - pgmaster.domain.com

    pgslave1:
        container_name: pgslave1

        build:
            context: ../src
            dockerfile: Dockerfile

        image: docker-postgresql:latest

        environment:
            NODE_NAME: pgslave1 # Node name

        ports:
            - 5441:5432

        volumes:
            - pgslave1_volume:/home/postgres/data

        networks:
            cluster:
                ipv4_address: 10.0.2.32
                aliases:
                    - pgslave1.domain.com
    pgslave2:
        container_name: pgslave2

        build:
            context: ../src
            dockerfile: Dockerfile

        image: docker-postgresql:latest

        environment:
            NODE_NAME: pgslave2 # Node name

        ports:
            - 5442:5432

        volumes:
            - pgslave2_volume:/home/postgres/data

        networks:
            cluster:
                ipv4_address: 10.0.2.33
                aliases:
                    - pgslave2.domain.com

networks:
  cluster:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.2.1/24

在我的 Mac 上,我有一个 192.168.0.0 本地网络。我希望执行 ping 10.0.2.31 我可以 ping 我的容器,但这是不可能的。我认为这是由于在 Mac 内部创建的 Linux VM 存在容器,并且 IP 在此 VM 之外无法访问。

有人可以帮助我了解如何使上述三个 IP 可达吗?IP 可以从一个容器访问到另一个容器。

这是我的完整代码: https ://github.com/sasadangelo/docker-postgres

4

1 回答 1

2

您应该能够ping从您的主机访问您的容器。

  • 通过公共IP

    只需使用他们的公共IP。(您一直在尝试在 docker 网络中 ping 您的容器本地IP)

    如何找到容器公网 IP?

    • 您可以通过ifconfig在容器内运行来获取它。

    或者

    • 或通过在您的主机上运行docker container inspect <container_id>

      它应该在下面NetworkSettings.<network_name>.IPAddress

  • 通过容器名称/ID

    docker 在您的机器上运行某种 dns,因此您也可以使用容器名称或 id -ping <container_name/id>

笔记

在 docker 网络之外访问容器的方法是通过它们发布的端口。您已将5432docker 网络上的端口绑定到5442主机上的端口,因此容器应在127.0.0.1:5442(即您绑定的端口上的本地主机)侦听并接受流量

于 2019-05-01T08:48:01.247 回答