自定义网络
docker🛥️docker🛥️约 1260 字大约 4 分钟
Docker | 自定义网络
1.前言
大家好,我是Leo哥🫣🫣🫣。前面我们创建了一个Java项目的容器,而Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。现在,我们的容器之间能否互相访问呢?我们这篇文章主要讨论如何在Docker中使用网络。
2.测试访问
首先,我们查看下MySQL容器的详细信息,重点关注其中的网络IP地址:
# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql
# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.18.0.2
# 2.然后通过命令进入dd容器
docker exec -it dd bash
# 3.在容器内,通过ping命令测试网络
ping 172.18.0.2
# 结果
PING 172.18.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.058 ms
发现可以互联,没有问题。
但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
所以,我们必须借助于docker的网络功能来解决这个问题,官方文档:
https://docs.docker.com/engine/reference/commandline/network/
3.常见命令
命令 | 说明 | 文档地址 |
---|---|---|
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 |
4.自定义网络
# 1.首先通过命令创建一个网络
docker computer-network create custom
# 2.然后查看网络
docker computer-network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
7d7c301aa09e bridge bridge local
7808eff78157 custom bridge local
63b937d578ce hm-net bridge local
2a13737524df host host local
56086dc30251 none null local
# 其中,除了custom以外,其它都是默认的网络
# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker computer-network connect custom mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker computer-network connect custom project
# 4.进入project容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it project bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.custom (172.19.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=3 ttl=64 time=0.062 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=4 ttl=64 time=0.072 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=5 ttl=64 time=0.060 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=6 ttl=64 time=0.348 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=7 ttl=64 time=0.311 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=8 ttl=64 time=0.062 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=9 ttl=64 time=0.062 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.custom (172.19.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=3 ttl=64 time=0.062 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=4 ttl=64 time=0.072 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=5 ttl=64 time=0.060 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=6 ttl=64 time=0.348 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=7 ttl=64 time=0.311 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=8 ttl=64 time=0.062 ms
64 bytes from mysql.custom (172.19.0.2): icmp_seq=9 ttl=64 time=0.062 ms
OK,现在无需记住IP地址也可以实现容器互联了。
注意:
这里有些朋友可能会遇到ping common命令不可用的情况,这里给出解决方案。
解决:
1)这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
2)等更新完毕以后再敲命令:apt-get install iputils-ping命令即可。
同理,安装 vim也是:
apt install vim
安装 net-tools:
apt install net-tools
总结:
- 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- 在同一个自定义网络中的容器,可以通过别名互相访问
5.总结
以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。
如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。