自定义网络格式

[toc]

这个是一个过时的东西了

before

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

上述成功启动并用docker exec进入各自容器实例内部

在tomcat82中ping tomcat81

root@ubuntu:/home/smile# docker exec -it tomcat82 bash
root@518bce78283a:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@518bce78283a:/usr/local/tomcat# ping 172.17.0.5
PING 172.17.0.5 (172.17.0.5) 56(84) bytes of data.
64 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=2.56 ms
64 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.110 ms
64 bytes from 172.17.0.5: icmp_seq=3 ttl=64 time=0.106 ms
^C
--- 172.17.0.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2018ms
rtt min/avg/max/mdev = 0.106/0.927/2.565/1.158 ms

能ping通

同样反也能通

问题

在docker中ip是变化的,所以我们选择用容器名称去ping通

root@98ec1a7378a7:/usr/local/tomcat# ping tomcat82
ping: tomcat82: Name or service not known
root@98ec1a7378a7:/usr/local/tomcat# ping tomcat81
ping: tomcat81: Name or service not known

或者可以选择添加hosts映射,但是注意,映射的时候ip也是写死的,所以我们必须要按照服务名去ping

after自定义网络引入

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

新建自定义网络

docker network create xiongxinwei@mail_network

查看网络:

root@ubuntu:/text# docker network ls
NETWORK ID     NAME                       DRIVER    SCOPE
ec8278ac6963   bridge                     bridge    local
c68651290784   host                       host      local
5e7ee4274242   none                       null      local
6c8b594b19ad   xiongxinwei@mail_network   bridge    local

我们需要把tomcat81和tomcat81统统加入到自定义网络来保证服务名互相通信

新建容器加入自定义网络

docker run -d -p 8081:8080 --network xiongxinwei@mail_network  --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network xiongxinwei@mail_network  --name tomcat82 billygoo/tomcat8-jdk8

image-20220515124337089

已经存在的容器修改为自定义网络

创建容器时不指定网络时默认是桥接网络,后续更改容器的网络有两种方式:

第一种:停止并删掉容器,重新创建容器指定网络连接(不建议)

第二种:直接修改容器的网络

  1. 创建自定义网络
docker network create 网络名称
  1. 解除容器所绑定的现有网络
docker network disconnect 网络名称 容器名称
  1. 容器重新指定网络连接
docker network connect 网络名称 容器名称
  1. 重启容器
docker restart 容器名称
  1. 查看容器详细信息
docker inspect 容器名称

docker 下创建自定义网络,并在运行容器时绑定网络和ip

Docker安装后,默认会创建三种网络类型,bridge、host和none,可通过如下命令查看

  docker network ls 

img

bridge:网络桥接

默认情况下启动、创建容器都是用该模式,所以每次Docker容器重启时会按照顺序获取对应ip地址,这就导致容器每次重启,ip都发生变化

none:无指定网络

启动容器时,可以通过–network=none,Docker容器不会分配局域网ip

host:主机网络

Docker容器的网络会附属在主机上,两者是互通的。

创建自定义网络和固定ip

创建自定义网络类型,并且指定网段

docker network create --driver=bridge --gateway=192.168.0.1 --subnet=192.168.0.0/16 mynetwork
  • --driver:驱动程序类型
  • --subnet:代表网段的CIDR格式的子网
  • --gateway:主子网的IPV4和IPV6的网关
  • mynetwork:是自定义网络名称

通过docker network ls可以查看到网络类型中多了一个mynetwork

docker network ls
docker network inspect mynetwork

使用docker network inspect mynetwork 查看网络信息

img

使用新的网络类型创建并启动容器

docker run -d --name=consul -p 8500:8500 \
--net=mynetwork --ip=192.168.0.2 \
-e CONSUL_BIND_INTERFACE=eth0 \
--restart=always consul agent \
--server=true --bootstrap-expect=1 --client=0.0.0.0 -ui

自定义网络命令和介绍

自定义网络命令说明
docker network create创建自定义网络
docker network inspect查看自定义网络详情
docker network ls查看网络列表
docker network connect不同的自定义网络互相连接
docker network rm删除自定义网络

我们尝试查看一下自定义网络详情

image-20220916205821816

查看tomcat81的ip

root@ubuntu:/text# docker exec -it tomcat81 bash
root@83cabf17ff0b:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
33: eth0@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

登陆tomcat82并ping tomcat81

root@ubuntu:/home/smile# docker exec -it tomcat82 bash
root@394fa3fe7ecc:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@394fa3fe7ecc:/usr/local/tomcat# ping tomcat81
PING tomcat81 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2 (172.18.0.2): icmp_seq=1 ttl=64 time=1.21 ms
64 bytes from 172.18.0.2 (172.18.0.2): icmp_seq=2 ttl=64 time=0.110 ms
^C
--- tomcat81 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.110/0.660/1.211/0.551 ms

可以ping通了

所以我们做多个容器的规划,一定要走容器名

结论

  • 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

  • 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

  • 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

自定义网络可以在容器之间提供自动的DNS解析