docker compose默认情况下会创建虚拟网络,所有的容器/服务都可以通过一个IP地址相互连接。通过使用links、depends_on或网络别名,它们可以通过主机名相互联系。在您的例子中,主机名是服务名,但可以覆盖它。(参见:docs)
根据您的设置,my_common_package容器/服务中的脚本应该连接到3306端口上的mysql。(不是端口localhost上的3306)
还要注意,只有在服务的Dockerfile没有EXPOSE语句时,才需要使用expose。标准的mysql映像已经做到了这一点。在
如果要将容器端口映射到localhost,则需要使用ports,但仅在必要时才这样做。在services:
mysql:
image: mysql:5.6
container_name: test_mysql_container
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=My_Database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
这里我们说的是mysql容器中的端口3306应该映射到端口3306上的localhost。在
现在您可以使用docker外部的localhost:3306连接到mysql。例如,您可以尝试在本地(而不是在容器中)运行testsql.py。在
容器到容器的通信总是使用每个容器的主机名进行的。把容器想象成虚拟机。在
您甚至可以找到使用docker network list创建的网络docker compose:
^{pr2}$
。。然后使用docker network inspect 查看细节。在
分配给容器的IP地址可能是非常随机的,因此容器到容器通信的唯一可行方法是使用主机名。在