如何从另一个容器访问另一个容器,其中两者都在不同的机器上 运行?

How to access a container from another where both are running on different machine?

我对 docker 网络了解不多,我有 2 个不同的容器,而它们被放置在两台不同的机器上。在这种情况下,我有 两个 raspberry pi,其中一个是 server,另一个是 client.

两者都使用 CoAP 协议来交换消息。无论如何,客户端需要服务器的 ip 作为客户端脚本的参数,如 --

python src/client.py <server_ip> 

我检查服务器容器并得到私有 ip 作为 --

172.18.0.2

这里是docker-为服务器和客户端编写文件--

docker-compose.yml(服务器)

version: '3'

services:
  server:
    build: ./
    image: img_server:v1
    ports: 
      - 5683:5683/udp
    volumes: 
      - ./:/usr/app
    command: ["python", "src/server.py"]

docker-compose.yml(客户端)

version: '3'

services:
  client:
    build: ./
    image: img_client:v1
    environment:
      SERVER_IP: "127.0.0.1"
    ports: 
      - 61616:61616/udp
    volumes: 
      - ./:/usr/app
    command: ["sh", "-c", "python src/client.py $SERVER_IP"]

我无法建立连接,因为容器(服务器和客户端)运行 在不同的机器上。

问题: 是否可以在服务器和客户端之间建立连接,两者都放置在单独的 docker 守护进程(单独的机器)中?如果是这样,那我该怎么做?

这与 Docker 中没有 运行 服务完全相同:使用物理主机的 IP 地址配置客户端 运行 服务。 (确保您已发布适当的 ports: 以便他们可以访问。)

你永远不应该 docker inspect 一个容器来查找它的 IP 地址。有很多常见情况,包括这种情况,该地址完全没用,总有更好的方法到达容器。

对此有两种基本方法。

首先 - 就像您没有使用 docker 化的应用程序一样工作。从你的 docker-compose 文件公开端口并指定 主机 机器的 ip/hostname 连接(注意 - 在这种情况下你不使用容器的 IP - 在公开端口后它们变成可从主机获得)。

其次 - 推荐 - 使用 docker 的 overlay 网络将所有容器连接在一起。与 bridge 模式不同,overlay 允许在不同的 docker 守护进程之间进行连接。这种方式更好,因为它可以将容器与主机隔离开来。覆盖网络要求您创建 docker swarm 并将您的容器连接到它。

快男:https://docs.docker.com/network/network-tutorial-overlay/#walkthrough