无法ping使用docker-compose创建的docker容器

时间:2019-05-01 07:12:06

标签: docker docker-compose

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

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

在Stackoverflow上,有一个线程How could I ping my docker container from my host用于独立处理docker而非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,容器中存在容器,并且在此VM之外无法访问IP。

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

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

1 个答案:

答案 0 :(得分:1)

您应该能够从主机上ping装载容器。

  • 通过公共IP

    只需使用其 public IP。 (您一直在尝试ping您的 容器 local ip,在docker网络内部)

    如何找到容器的公共IP?

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

    • ,或者通过在主机docker container inspect <container_id>上运行。

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

  • 通过容器名称/ ID

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

注释

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