无法ping使用docker compose创建的docker容器
我想创建一个PostgreSQL集群,由三个容器中的一个主容器和两个从容器组成。我想用docker compose做这件事。一切正常,但我无法从Mac ping容器 这里是我的docker-compose.yml的代码 在Stackoverflow上,有一个线程处理docker standalone而不是docker compose无法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
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。相反,正如你所说,这根本不可能。