Network 网络
Network(网络)解决的是容器之前的通信问题。
假设我们有两个容器:
Spring Boot
Node.js在没有 Docker 时,它是这样运行的:
Spring Boot
│
localhost:3306
│
MySQL因为他们都运行在一台机器上,所以 java 在访问 MySql 时没有问题。
spring.datasource.url=jdbc:mysql://localhost:3306/demo但是在使用 Docker 后
Container A
Spring BootContainer B
MySQL现在两个服务在不同的 Container 中,那么显然就无法直接连接了。
因为在单个 ContainerA 中,localhost 不是宿主机、不是MySQL,而是 ContainerA 本身,它无法超出自身。
所以
jdbc:mysql://localhost:3306/demo连接的是 ContainerA 自己,而它自己又没有数据库,因此导致失败。
针对上述问题,Docker提供了Network来解决。
Network 连接
创建一个网络 demo-network,然后把两个 Container 放进去。
demo-network
├── springboot
└── mysql这时候 Docker 自动提供 DNS,于是Spring Boot 可以直接连接 Mysql。
以前:
spring.datasource.url=jdbc:mysql://localhost:3306/demo现在:
spring.datasource.url=jdbc:mysql://mysql:3306/demo这里 mysql 就是 Container 的名字(Container B)。
Docker 将自动解析 IP。
为什么不用IP?
因为IP可能会改变,为了不每次都要检查IP,所以才使用自动解析的方式。
宿主机如何访问 Container 中的服务?
bash
docker run -p 3307:3306 mysql以MySQL为例,通过 -p 命令可以映射端口,从而让宿主机访问到 MySQL。
- 3307:宿主机的端口
- 3306:容器的端口
因为要防止端口冲突,所以采用这种方式进行映射。
在宿主机可以直接通过 localhost:3307 访问到 MySQL。