Docker | 自定义网络

176 阅读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的网络功能来解决这个问题,官方文档:

docs.docker.com/engine/refe…

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 network create custom

# 2.然后查看网络
docker 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 network connect custom mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker 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

image-20231211204208746

image-20231211204233248

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,后面文章会首先同步至公众号。

公众号封面

本文由博客一文多发平台 OpenWrite 发布!