如何从另一个容器访问另一个容器,其中两者都在不同的机器上 运行?
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
我对 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