我们在部署 Java 项目的时候,往往会需要访问很多其他的中间件,比如 MySQL、Redis、RabbitMQ等。
但是,容器的 IP 是虚拟 IP,这个虚拟 IP 是不固定的,如果在程序中写死,一旦 IP 发生改变,程序必然无法连接报错。
那么如何解决这种问题呢?
我们必须借助于docker的网络功能来解决这个问题,
1、docker network 常用指令介绍
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | docker network create |
docker network ls | 查看所有网络 | docs.docker.com |
docker network rm | 删除指定网络 | docs.docker.com |
docker network prune | 清除未使用的网络 | docs.docker.com |
docker network connect | 使指定容器连接加入某网络 | docs.docker.com |
docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
docker network inspect | 查看网络详细信息 | docker network inspect |
2、自定义网络(演示实战)
# 1.首先通过命令创建一个网络
docker network create selfnetwork
# 2.然后查看网络
docker network ls
// 下面 selfnetwork 是自定义的网络,而其他的都是默认的网络
// NETWORK ID NAME DRIVER SCOPE
// 9baf95cfc4c8 bridge bridge local
// aeeaeffc993c host host local
// e0215f902f7e none null local
// 2678fec35df6 selfnetwork bridge local
# 3.让 java 应用和 mysql 都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect selfnetworkmysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect selfnetwork docker-demo
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it docker-demo bash
# 4.2.用db别名访问
ping db
// 结果
// PING db (172.18.0.2) 56(84) bytes of data.
// 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
// 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
// 结果:
// PING mysql (172.18.0.2) 56(84) bytes of data.
// 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
// 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms