如何从两个都在不同机器上运行的容器访问容器?

时间:2019-01-09 12:16:35

标签: docker networking docker-compose docker-container

我对Docker网络了解不多,其中有2个不同的容器,而它们分别放置在两台不同的计算机上。在这种情况下,我有两个树莓派,其中一个是服务器,另一个是客户端

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

python src/client.py <server_ip> 

我检查了服务器容器,并将私有IP取为-

172.18.0.2

以下是用于服务器和客户端的docker-compose文件-

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守护程序(单独的计算机)中?如果是这样,那我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

永远不要docker inspect容器来找到其IP地址。在很多情况下(包括这种情况),该地址是完全没有用的,并且总是有一种到达容器的更好方法。

答案 1 :(得分:1)

有2种基本方法。

首先-像不使用dockerized应用程序一样工作。公开docker-compose文件中的端口,并指定要连接的主机机器的IP /主机名(注意-在这种情况下,您不使用容器的IP-公开了主机可用的端口之后)。

第二-推荐-使用docker的overlay网络将您的容器全部连接在一起。与bridge模式不同,overlay允许在不同的docker守护程序之间进行连接。这种方法更好,因为它可以将容器与主机隔离。重叠式网络要求您创建docker swarm并将容器连接到它。

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