我建立了一个包含3个服务的docker-compose:db
,nginx
,selenium
。用nginx托管的应用程序与数据库(nginx
db
)通信,并且硒测试该应用程序(selenium
-> app
)。
version: '3'
services:
nginx:
image: <my_private_repo>/nginx
...
db:
image: <my_private_repo>/db
# nginx cannot communicate with db after I remove exposing port 3306
ports:
- "3306:3306"
...
selenium:
image: joyzoursky/python-chromedriver:3.8-selenium
command: "bash seleniumScript.sh"
depends_on:
- nginx
- db
我用docker-compose run selenium
运行测试暴露数据库端口后一切正常,但是当我停止暴露端口3306时,nginx无法与数据库通信。
我的理解是,一个docker-compose设置中的所有服务都会自动连接,用户不需要创建任何其他网络,但是我显然错了。
我的问题是如何设置服务之间的公开端口而不将其公开给主机?
更新:我的nginx应用已将数据库主机配置为服务名称db
。使用db
主机的Selenium脚本设置填充数据库,并通过https://nginx
网址测试nginx应用。
This question在这里问的内容非常相似。
nginx容器可能无法访问数据库容器,因为您正在通过docker host localhost
访问它。
位于同一网络中的容器可以始终相互访问,而不会暴露任何端口,而是使用主机名。参见:container_name
。使用container_name
,您可以使用container_name
从Nginx容器内部连接到数据库容器。
默认情况下为db:3306
,因此除非您希望阻止某些容器相互通信,否则不必创建任何新网络。