为什么我能够访问网桥网络之外的容器



我从一个docker容器启动了mysqldb。我很惊讶我可以使用以下命令通过本地主机连接它

mysql-uroot-proot-P306-h localhost

我认为从网桥网络开始的docker容器在该网络之外是不可用的。mysql CLI是如何连接到此实例的

下面是我的docker compose,它运行mysqldb docker实例

version: '3.8'
services:
mysqldb-docker:
image: 'mysql:8.0.27'
restart: 'unless-stopped'
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=reco-tracker-dev
volumes:
- mysqldb:/var/lib/mysql
reco-tracker-docker:
image: 'reco-tracker-docker:v1'
ports:
- "8083:8083"
environment:
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3306/reco-tracker-dev"
depends_on: [mysqldb-docker]
env_file:
- ./.env
volumes:
mysqldb:

您已经发布了端口。这意味着你可以在发布端口的主机系统上访问它们

默认情况下,当您使用docker create或docker run创建或运行容器时,它不会向外部发布任何端口。要使端口可用于Docker之外的服务,或未连接到容器网络的Docker容器,请使用--publish或-p标志。这创建了一个防火墙规则,将容器端口映射到Docker主机上与外部世界的端口。

配置中的关键部分如下。您已将端口密钥添加到服务中。这是发布端口的组合方式。左侧部分是将其发布到主机系统上的端口。正确的部分是容器实际监听的地方。

ports:
- "3306:3306"

还要记住,当您开始撰写时,会创建一个默认网络,连接撰写堆栈中的所有容器。这就是为什么这些容器可以以服务名称和/或容器名称作为主机名来查找彼此。

您不需要像以前那样发布端口以便它们能够通信。我想这就是你这么做的原因。如果可能的话,你可以也可能应该从内部服务中删除任何端口映射。这将为您的设置添加额外的安全性,因为这样它的行为就像您描述的那样。只有同一网络中的容器才能找到彼此。

最新更新