如何解决同一网络上的两个容器无法使用容器名称进行通信,但可以使用 IP 地址进行通信
我在同一个网络上有两个容器(flask 应用程序)。就我而言,这两个容器可以通过 IP 地址进行通信,但是对于容器名称却无法正常工作。
我在文档中读到容器不仅可以通过 IP 地址进行通信,还可以将容器名称解析为 IP 地址。此功能称为自动服务发现。
我不明白我错过了什么。
感谢您的回复。
编辑:
我如何运行容器:docker run -p 5001:5001 --net testnetwork --rm
docker run -p 5000:5000 --net testnetwork --rm
解决方法
如果你正在运行多个 docker 容器,我会推荐使用 docker-compose,因为默认情况下它们是在同一个网络中创建的,你可以使用你给它们的名字在它们之间进行通信。例如,假设您有一个 docker-compose 文件,如下所示
version: '3.1'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
ports:
- 8081:80
volumes:
db:
如果你启动它,你会发现你可以从 PhpMyAdmin 与 MySQL 通信,只需输入它的名称(“db”),不需要 IP。
关于使用 IP 的事情是,除非您手动分配它们,否则它们会发生变化,您可以在 Assign static IP to Docker container
中找到有关如何执行此操作的更多信息 ,基于没有通过容器名称进行通信的文档,它们必须被链接
默认情况下,容器可以通过其 IP 地址进行通信。要按名称进行通信,必须将它们链接起来。
参考:https://docs.docker.com/engine/reference/commandline/run/
,根据我所拥有的found,您需要明确命名自动服务发现在用户定义的网络中工作的容器。尝试在启动容器时添加 --name containername1
和 --name containername2
。
您还可以使用主机名使容器在同一网络中进行通信。 link
容器的主机名默认是容器在 Docker 中的 ID。您可以使用 --hostname 覆盖主机名。使用 docker network connect 连接到现有网络时,您可以使用 --alias 标志为该网络上的容器指定额外的网络别名。
使用 Docker ps
查找容器 ID。这是第一列。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。