跳至主要內容

自定义网络

Leodocker🛥️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/open in new window

3.常见命令

命令说明文档地址
docker network create创建一个网络docker network createopen in new window
docker network ls查看所有网络docs.docker.comopen in new window
docker network rm删除指定网络docs.docker.comopen in new window
docker network prune清除未使用的网络docs.docker.comopen in new window
docker network connect使指定容器连接加入某网络docs.docker.comopen in new window
docker network disconnect使指定容器连接离开某网络docker network disconnectopen in new window
docker network inspect查看网络详细信息docker network inspectopen in new window

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

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

公众号封面
公众号封面