Docker 网络

Docker 网络

  • 当项目大规模使用 Docker 时 容器通信的问题也就产生了。
  • Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。
  • 然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。
    因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求

Network 网络的常用命令

#查看 Network 帮助
[root@hadoop1 ~]# docker network --help
Usage:  docker network COMMAND
Manage networks
Commands:	
  connect     Connect a container to a network		#将容器连接到网络
  create      Create a network						#创建一个网络
  disconnect  Disconnect a container from a network #断开容器与网络的连接
  inspect     Display detailed information on one or more networks #显示一个或多个网络上的详细信息
  ls          List networks							#网络列表
  prune       Remove all unused networks 			#删除所有未使用的网络
  rm          Remove one or more networks 			#删除一个或多个网络
Run 'docker network COMMAND --help' for more information on a command.

#查看网络列表;
[root@hadoop1 ~]#  docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
59d418f5257a   bridge    bridge    local
8d30fcd98e3b   host      host      local
8ee65d94d1c4   none      null      local
[root@hadoop1 ~]# 

当你安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

网络模式 简介
Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Bridge 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。重点
None 该模式关闭了容器的网络功能。
Container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
自定义网络

我们在使用docker run创建Docker容器时
可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

  • host模式:使用 --net=host 指定。

  • none模式:使用 --net=none 指定。

  • bridge模式:使用 --net=bridge 指定,默认设置。
    直接run 创建容器就是bridhe模式,也可以 --net=bridege指定

  • container模式:使用 --net=container:NAME_or_ID 指定。

Bridge 桥接模式(默认)

Bridge模式

  • 相当于Vmware中的Nat模式 这里不详细介绍:
  • 容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)
  • 此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

代码场景:网络配置

查看当前网络配置
创建容器 在次查看 多次创建进行比较!

#启动docker
[root@hadoop1 ~]# systemctl start docker
#为了方便操作,先删除之前的容器,不然会看到很多网卡信息
[root@hadoop1 ~]# docker rm -f $(docker ps -aq)

#查看docker 网络配置
[root@hadoop1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5af00ba46ade   bridge    bridge    local
8d30fcd98e3b   host      host      local
8ee65d94d1c4   none      null      local

#查看当前虚拟机 网关;
	#Windows上查看IP地址是ipconfig, Linux上是ifconfig,但是Linux上还有一个命令叫ip addr可以查看IP地址。
	#显示了机器上的所有网卡,大部分网卡都有一个IP地址,也存在特殊情况没有IP地址。
[root@hadoop1 ~]# ip addr
#环回地址,就是默认本机自己提供给自己一个 本地地址 1270.0.1
1: lo: ,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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
#虚拟机上系统 与 宿主机之间的 net模式网卡!
2: ens33: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
#docke虚拟机 与 宿主机 的网卡
3: docker0: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:21:3e:aa:6b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: br-ecd82fef5194: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:2f:79:87:9c brd ff:ff:ff:ff:ff:ff
    inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
       valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:be:72:9c:dd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
       valid_lft forever preferred_lft forever

#查看镜像文件
[root@hadoop1 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
test2_kafkademo          latest    ed4ebc0ed41c   5 months ago    672MB
app                      1.0       02094c567c02   5 months ago    672MB
tomcat                   8.5       d5ef56581444   7 months ago    530MB
wurstmeister/kafka       latest    40094a582680   8 months ago    435MB
centos                   7         7e6257c9f8d8   8 months ago    203MB
logstash                 7.6.2     fa5b3b1e9757   12 months ago   813MB
kibana                   7.6.2     f70986bc5191   12 months ago   1.01GB
elasticsearch            7.6.2     f29a1ee41030   12 months ago   791MB
wurstmeister/zookeeper   latest    3f43f72cb283   2 years ago     510MB
java                     8         d23bdf5b1b1b   4 years ago     643MB

#根据Tomcat 镜像生成一个,Tomcat容器
[root@hadoop1 ~]# docker run -d -P --name tomcat1 tomcat:8.5
23e303c70c1a128c5ca6f05f76fa7260445ee6a27e9fd7728e7b4871d37f0dc6
#再次查看所有的网关,发现系统中又多个一个网卡!
	#每生成一个Docker 容器,就相当于一新的操作系统环境. 与主宿主机进行连接...网卡
	5: veth085e9c6@if4,这是因为docker使用的是 veth-pair技术,容器的网卡和宿主机的网卡会成对出现
[root@hadoop1 ~]# ip addr
1: lo: ,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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:21:3e:aa:6b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:21ff:fe3e:aa6b/64 scope link 
       valid_lft forever preferred_lft forever
4: br-ecd82fef5194: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:2f:79:87:9c brd ff:ff:ff:ff:ff:ff
    inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
       valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:be:72:9c:dd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
       valid_lft forever preferred_lft forever
7: veth38cad7c@if6: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 76:f8:99:43:af:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::74f8:99ff:fe43:af96/64 scope link 
       valid_lft forever preferred_lft forever
[root@hadoop1 ~]# 

#查看所有的运行容器
[root@hadoop1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS                                         NAMES
ee78a1d4dce4   tomcat:8.5   "catalina.sh run"   10 minutes ago   Up 10 minutes   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1

#docker exec 进入正在运行的容器并以命令行交互
	#ip addr 查看容器内的网卡
[root@hadoop1 ~]# docker exec -it ee78a1d4dce4 ip addr
1: lo: ,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
6: eth0@if7: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

#宿主机尝试与 宿主机进行连接...连接成功!
[root@hadoop1 ~]#  ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.219 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.099 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.124 ms

#在宿主机检查网卡信息
	#发现 7: veth38cad7c@if6,这是因为docker使用的是 veth-pair技术,容器的网卡和宿主机的网卡会成对出现
	
	
#再次测试生成:
[root@hadoop1 ~]# docker run -d -P --name tomcat2 tomcat:8.5
21ebba1d58433d680a2fbb463ad6e595780c2402e4ef17074f7a62a04b3588c1
#又新增了一个 	9: veth82e9efa@if8:
[root@hadoop1 ~]# ip addr
1: lo: ,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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:79:07:c6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::96ac:9f1:e210:7f96/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:87:eb:73:ec brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:87ff:feeb:73ec/64 scope link 
       valid_lft forever preferred_lft forever
4: br-ecd82fef5194: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:24:49:3a:8d brd ff:ff:ff:ff:ff:ff
    inet 192.169.8.1/16 brd 192.169.255.255 scope global br-ecd82fef5194
       valid_lft forever preferred_lft forever
5: br-f25721ed3cf8: -CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:6d:1c:4b:99 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/16 brd 192.168.255.255 scope global br-f25721ed3cf8
       valid_lft forever preferred_lft forever
7: veth38cad7c@if6: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 76:f8:99:43:af:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::74f8:99ff:fe43:af96/64 scope link 
       valid_lft forever preferred_lft forever
9: veth82e9efa@if8: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 22:2d:c6:17:cf:bf brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::202d:c6ff:fe17:cfbf/64 scope link 
       valid_lft forever preferred_lft forever
       
#查看 tomcat2的 容器ip
[root@hadoop1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED             STATUS             PORTS                                         NAMES
21ebba1d5843   tomcat:8.5   "catalina.sh run"   4 minutes ago       Up 4 minutes       0.0.0.0:49154->8080/tcp, :::49154->8080/tcp   tomcat2
ee78a1d4dce4   tomcat:8.5   "catalina.sh run"   About an hour ago   Up About an hour   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1
[root@hadoop1 ~]# docker exec -it 21ebba1d5843 ip addr
1: lo: ,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
8: eth0@if9: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@hadoop1 ~]# 
#Tomcat2 的容器暴漏的ip是172.17.0.3
  • 我们发现,首先系统中默认存在几个网卡
    lo回环默认本地127.0.0.1
    ens33 阿里云内网地址...
    docker0 docke虚拟机 与 宿主机 的网卡安装了docker,就会有一个网卡docker0桥接模式
  • 每启动一个docker容器,docker就会给docker容器分配一个ip 使用的技术是evth-pair技术
    Docker 网络_第1张图片
  • 当Docker server服务启动时,会在主机上创建一个名为docker0的虚拟网桥 此主机上启动的Docker容器会连接到这个虚拟网桥上。
  • 虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  • 接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,
    选择一个和宿主机不同的IP地址和子网分配给docker0 表现:
    Docker0 ip 172.17.0.1 /24网段\16网段
    容器 172.17.0.2 172.17.0.3 分配方式, 根据启动顺序而,给容器划分ip存在缺陷:

Docker完成以上网络配置的过程大致是这样的:

  • 在主机上创建一对虚拟网卡veth pair设备。
    veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。
    因此,veth设备常用来连接两个网络设备。 宿主机 和 容器上都会生成一个网卡

  • Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。
    另一端放在主机中,以veth65f9这样类似的名字命名,
    并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

总结:

改模式下:

  • 容器与容器之间的通信,是通过Docker主机进行通信的!
    Tomcat01 和 Tomcat02 使用公用的一个路由器,docker0
  • 多有的容器不指定网络情况下, 都是docker0路由的,docker会给我们容器分配一个默认的可用ip
  • Docker 容器删除,对应网桥一对就没了

测试:宿主 容器 容器 通信:

  • 声明因为,某些意味,本人重新生成了容器,不对的ip id请忽略看过程为主!
#删除所有容器
[root@hadoop1 ~]# docker rm -f $(docker ps -aq)
543634f70d49
de2960e75d09
f0c0ffb7d2a0
3b7b2be745d4
4ef1549eafef
d3b00eb8c65d
98b0862a0f33
4ff4dbbc8603
#查看镜像
[root@hadoop1 ~]# docker images

#生成两个容器: 	指定Network网络配置
[root@hadoop1 ~]#  docker run -d -P --name tomcat1 --net bridge  tomcat:8.5
53384a40e17bd80c1419fa1ed7c2da18140fd89d58ff42c3a92ab1cb851b3b15
[root@hadoop1 ~]#  docker run -d -P --name tomcat2 --net bridge  tomcat:8.5
563155f4b637d32be229491c0ad48cf55f53b9b944ec1225e9c35d4bed4838c7

#查看宿主机网卡
[root@hadoop1 ~]# ip addr

#尝试连接:
#主机ping 连接容器:
[root@hadoop1 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.409 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.157 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.348 ms
#成功! 可以理解,因为...默认情况下容器会在宿主机中创建一个网卡,而且如果这都不可以,那么 宿主如何run 指定端口...


#容器尝试 ping 容器:
[root@hadoop1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED         STATUS         PORTS                                         NAMES
563155f4b637   tomcat:8.5   "catalina.sh run"   3 minutes ago   Up 3 minutes   0.0.0.0:49154->8080/tcp, :::49154->8080/tcp   tomcat2
53384a40e17b   tomcat:8.5   "catalina.sh run"   4 minutes ago   Up 4 minutes   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1

[root@hadoop1 ~]#  docker exec -it 53384a40e17b ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.295 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.108 ms
#成功!同一个网段当然可以ping 通,
#当然本质上,容器不是直接与容器进行通信,中间通过Docker0 进行的交换...

–Link

  • 通过容器名称ping另一个容器,在docker0的情况下 无法通过容器名或容器id ping 通

  • Docker 默认会根据容器启动的顺序,给容器分配ip ,这样的话…
    如果 A B C 三个容器之间互相通信,内部访问ip 是写死了…
    A第一次启动就是 172.17.0.2 第二次启动就是 172.17.0.3
    这样的话,需要注意容器启动的顺序 而且会因为容器启动成功时间影响到容器的ip 并不好影响容器的使用!

  • 如果想让双方通过容器名ping同可以在创建容器时使用–link命令

#创建一个新的容器,并指定tomcat2 的内部连接...
[root@hadoop1 ~]# docker run -d -P --name tomcat03 --link tomcat2 tomcat:8.5
a7306c2bd6d22b49fba2c46a99b943ef1637b50fdbaeea42e0a4144853a5ba8e
[root@hadoop1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS                                         NAMES
a7306c2bd6d2   tomcat:8.5   "catalina.sh run"   7 seconds ago    Up 6 seconds    0.0.0.0:49155->8080/tcp, :::49155->8080/tcp   tomcat03
563155f4b637   tomcat:8.5   "catalina.sh run"   25 minutes ago   Up 25 minutes   0.0.0.0:49154->8080/tcp, :::49154->8080/tcp   tomcat2
53384a40e17b   tomcat:8.5   "catalina.sh run"   26 minutes ago   Up 26 minutes   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1
[root@hadoop1 ~]#  docker exec -it tomcat03 ping tomcat2
PING tomcat2 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from tomcat2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.144 ms
64 bytes from tomcat2 (172.17.0.3): icmp_seq=3 ttl=64 time=0.126 ms
  • 就可以实现,通过容器名进行ping 访问了

因为: tomcat03内部配置了tomcat2的连接信息

[root@hadoop1 ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	tomcat2 563155f4b637
172.17.0.4	a7306c2bd6d2

创建自定义网络,可参照 docker network create --help

自定义网络

创建网络,指定子网、网关、网络名称

  • 请注意 --subnet 192.168.0.0/16 指定子网,16代表子网掩码
  • 255.255.0.0,如果是24则表示:255.255.255.0
[root@hadoop1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
19bf33dbe3d4   bridge    bridge    local
8d30fcd98e3b   host      host      local
8ee65d94d1c4   none      null      local

[root@hadoop1 ~]# docker network create --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
c495a7418874c9295ae2030fd8a37f4f0f2371cf0dfb0f5af49b55839a0fe185
[root@hadoop1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
19bf33dbe3d4   bridge    bridge    local
8d30fcd98e3b   host      host      local
c495a7418874   mynet     bridge    local
8ee65d94d1c4   none      null      local

#查看网络详细信息
[root@hadoop1 ~]# docker network inspect mynet
[
    {
     
        "Name": "mynet",
        "Id": "c495a7418874c9295ae2030fd8a37f4f0f2371cf0dfb0f5af49b55839a0fe185",
        "Created": "2021-04-20T15:58:41.181893235+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
     
            "Driver": "default",
            "Options": {
     },
            "Config": [
                {
     
                    "Subnet": "192.168.0.0/16",		#网段
                    "Gateway": "192.168.0.1"		#网关ip 
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
     
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
     },
        "Options": {
     },
        "Labels": {
     }
    }
]
#创建容器时使用 --net 指定所属网络
[root@hadoop1 ~]# docker run -d -P --name tomcatnet1 --net mynet  tomcat:8.5
6ef9985e72d4c4c9f3453287c3075ff6c8b618e3c82891f5559d21d6dd6bdac2
[root@hadoop1 ~]# docker run -d -P --name tomcatnet2 --net mynet  tomcat:8.5
b3d19110b1ea97b90183f52676b6fe1710b60ba9b4d06e08585d93b675b3e94d
^[[A[root@hadoop1 docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS                                         NAMES
b3d19110b1ea   tomcat:8.5   "catalina.sh run"   7 seconds ago    Up 6 seconds    0.0.0.0:49157->8080/tcp, :::49157->8080/tcp   tomcatnet2
6ef9985e72d4   tomcat:8.5   "catalina.sh run"   18 seconds ago   Up 17 seconds   0.0.0.0:49156->8080/tcp, :::49156->8080/tcp   tomcatnet1
a7306c2bd6d2   tomcat:8.5   "catalina.sh run"   18 minutes ago   Up 18 minutes   0.0.0.0:49155->8080/tcp, :::49155->8080/tcp   tomcat03
563155f4b637   tomcat:8.5   "catalina.sh run"   44 minutes ago   Up 44 minutes   0.0.0.0:49154->8080/tcp, :::49154->8080/tcp   tomcat2
53384a40e17b   tomcat:8.5   "catalina.sh run"   44 minutes ago   Up 44 minutes   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1

#最重要的是可以直接通过 容器名进行通信了
[root@hadoop1 ~]# docker exec -it tomcatnet1 ping tomcatnet2
PING tomcatnet2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.101 ms

好处:

  • 集群情况下不同集群使用不同的网段, 实现集群!
    不在是同一个网段下的伪集群!

  • Redis-不同的集群使用不同的网络, 保证集群是安全和监控的

自定义网络容器 与 默认容器之间通信:

Docker 网络_第2张图片

  • 默认情况下,不同网络间的容器是无法通信的
  • 比如说docker0 和mynet就是不同的2个网段, tomcat2 和 tomcatnet2无法ping通
#默认容器 与 自定义容器之间的通信... 通信失败!
[root@hadoop1 ~]# docker exec -it tomcat2 ping tomcatnet2
ping: tomcatnet2: Name or service not known

#使用connect建立连接
#指定mynet网络去联通tomcat2,相当于会给tomcat2再分配一个属于mynet网络的ip地址
[root@hadoop1 ~]# docker network connect mynet tomcat2
[root@hadoop1 ~]# docker exec -it tomcat2 ping tomcatnet2
PING tomcatnet2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.115 ms
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.218 ms
64 bytes from tomcatnet2.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.123 ms

查看 tomcat2的网卡:

Docker 网络_第3张图片

这一篇,内容有点不适合初学者,可能结束了…还是云里雾里…

  • 这需要有,计算机网络的基础才可以的… 后面有空要搞一搞计算机网络通信... 加油

你可能感兴趣的:(开发工具学习,Docker,网络,docker,网络,java,linux)