我正在构建两个共享一些通用数据的项目。这两个项目的服务由两个 docker-compose YML 文件构建。我想从另一个堆栈上运行的 Python 脚本访问一个堆栈中指定的 MySQL 服务器。
我通过连接到内部 docker IP 来实现这一点。但是,我发现服务器重启后,IP 会发生变化。我尝试通过容器名称进行连接,或在 docker-compose YML 文件中“链接”容器名称。这两种方法都不起作用。我认为在两个堆栈之间共享一个 docker 网络接口应该可以解决问题。
我可以知道如何在两个 docker-compose YML 文件中指定“网络”吗?
或者,有没有更好的方法来实现这一点?
谢谢。
答案1
在您的撰写文件之外创建一个网络(这避免了对正在部署的撰写文件的顺序的依赖):
$ docker network create dbnet
然后将您想要互相连接的服务放在这个外部网络上。例如,mysql 的 compose 文件可以是:
version: '3.5'
networks:
dbnet:
external: true
name: dbnet
services:
mysql:
networks:
- dbnet
并且您的其他撰写文件将连接到同一网络:
version: '3.5'
networks:
dbnet:
external: true
name: dbnet
services:
pythonapp:
networks:
- dbnet
从 pythonapp,你可以以“mysql”(服务名称)而不是 IP 的形式连接到数据库。只要容器位于同一网络上,Docker 就会为你处理 DNS 解析。
注意我使用了 3.5+ 语法来定义外部网络。在此之前,语法是:
networks:
dbnet:
external:
name: dbnet
有关详细信息,请参阅:https://docs.docker.com/compose/compose-file/#external-1