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

无法ping使用docker compose创建的docker容器,docker,docker-compose,Docker,Docker Compose,我想创建一个PostgreSQL集群,由三个容器中的一个主容器和两个从容器组成。我想用docker compose做这件事。一切正常,但我无法从Mac ping容器 这里是我的docker-compose.yml的代码 在Stackoverflow上,有一个线程处理docker standalone而不是docker compose version: '3.6' volumes: pgmaster_volume: pgslave1_volume: pgslave2_vo

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

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

在Stackoverflow上,有一个线程处理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我的容器,但这是不可能的。我认为这是因为Linux虚拟机是在Mac内部创建的,容器所在的位置,并且在这个虚拟机之外无法访问IP

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

以下是我的完整代码:

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

  • 通过公共ip

    只要使用他们的公共ip。(你一直在试着打你的电话 容器本地ip(docker网络内)

    如何找到容器公共IP

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

    • 或者在主机上运行
      docker container inspect

      它应该在
      网络设置..IPAddress

  • 通过容器名称/id

    docker正在您的计算机上运行某种dns,因此您也可以使用 容器名称或id-
    ping

注意


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

您好,尽管我无法深入解释问题的技术细节,我可以告诉你,它的工作原理应该是这样的,你不应该以这种方式到达容器。它们是隔离工作的,只能在主机上公开的端口上访问。如果您希望以这种方式访问容器,您可以始终创建主机网络,然后可以从网络上的任何位置ping容器。简短答案的可能重复通常是“根本不考虑容器专用IP地址”。例如,在Docker Compose文件中,我将删除所有
网络:
块。但是,您可以将容器配置为相互通信,它们可以使用块名,如
pgmaster
,作为主机名。David Maze,它不重复,因为我说的是docker compose,而不是docker standalone。在旧版本的代码中,我没有使用docker compose,只是使用docker。我有一个脚本来定义我的网络和容器:通过这个定义,我可以ping我的容器。在我的旧版本代码中,我没有使用docker compose,而只是使用docker。我有一个脚本来定义我的网络和容器:通过这个定义,我可以ping我的容器。我不明白为什么它只使用docker而不是docker-compose工作。这里容器中ifconfig的输出:eth0 Link encap:Ethernet HWaddr 02:42:0a:00:02:1f inet addr:10.0.2.31 Bcast:10.0.2.255掩码:255.255.255.0向上广播运行多播MTU:1500度量:1 RX数据包:63错误:0丢弃:0溢出:0帧:0发送数据包:38错误:0丢弃:0溢出:0载波:0冲突:0 txqueuelen:0接收字节:5136(5.1 KB)发送字节:10442(10.4 KB)docker compose正在为其服务创建一个私有子网,此时
docker run
将容器抛出默认docker网络。这就是它不同的原因。如果您无法通过ifconfig获得公共ip,请选择第二种方式。运行
docker container inspect
以获取
NetworkSettings..IPAddress
,或者简单地ping容器名,我就这么做了
docker container inspect
NetworkSettings..IPAddress
中我得到了无法ping的10.0.2.31 IP。我理解我的问题。在我的旧代码(没有docker compose)中,我使用ssh从我的Mac访问10.0.2.31,但我在.ssh/config中定义了一个条目,其中IP由localhost和映射到22的给定端口解决。所以我没有访问真正的IP,只是访问本地主机。我完全忘记了这个配置,我认为我的旧代码能够ping这个IP。相反,正如你所说,这根本不可能。