8、Docker 网络

2021-08-08  本文已影响0人  chanyi

1、查看网路地址

使用命令ip addr查看网络的基本信息
网络实例

>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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
(虚拟机)
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:07:51:6a brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.80.130/24 brd 192.168.80.255 scope global dynamic noprefixroute ens33
       valid_lft 1386sec preferred_lft 1386sec
    inet6 fe80::d3a5:5223:86fa:9b9/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
(docker内网络地址)
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:7c:1d:c8:07 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:7cff:fe1d:c807/64 scope link 
       valid_lft forever preferred_lft forever
(成对出现的虚拟网络,173对接虚拟机,172对接容器内部)
173: veth72cfa71@if172: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 5e:3a:04:b9:3e:e0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::5c3a:4ff:feb9:3ee0/64 scope link 

docker安装后会有一个docker0网卡,每启动一个docker容器,docker就会通过桥接模式给此容器分配一个ip,使用的技术是evth-pair
evth-pair就是一对虚拟的网络设备,他们都是成对出现的。一段链接协议,一段彼此相连。相当于充当一个桥梁
docker容器之间的链接 ovs的链接都是使用的是evth-pair技术

2、容器之间的网络通信原理

容器之间的网络原理:
安装docker之后会自动有一个docker0,相当于路由器。没有docker容器(图中的tomcat01和tomcat02)创建之后,会通过evth-pair技术,创建一个桥接和docker0链接 ,然后tomcat01要和tomcat02通信时,会通过docker0。在所有的容器都不指定网路(--net指定网络)的情况下,都是docker0路由,docker会给容器默认分配一个可用ip
默认的可用ip段是172.17.0.1/16,后面的16是指前两位为网络号,后面的两位为主机号,则可以有255*255-2个可用的网络地址可以用。
删除之后,对应的网桥就会被删除掉

容器之间的网络通信过程

3、--link指令

在默认的请款下,在容器1中直接ping容器2的名称是ping不同的,只能使用IP地址。但是如果容器重启之后IP地址可能会变化,所以需要通过--link设置一下,可以直接通过容器名来ping通容器,而不是地址

> docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known

使用--link链接连个容器

docker run -d -P --name tomcat03 --link tomcat02 tomcat
然后再tomcat03 ping tomcat02 就可以ping通了
docker exec -it tomcat03 ping tomcat02

其实质就是在hosts文件中增加了对tomcat02的一个地址映射
但是如果tomcat02容器要pingtomcat03还是不行,也需要单独设置一次,所以不推荐使用

3、自定义网络

通过docker network ls查看所有网络

>docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
c1db37cefcbf   bridge    bridge    local
da7fc10660c8   host      host      local
887ff36c6dc8   none      null      local

bridge桥接模式,docker默认使用的网络模式
none不配置网络
host主机模式,和宿主机共享网络
container容器网络联通(少用)

(1)、创建网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
创建成功之后查看

> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
c1db37cefcbf   bridge    bridge    local
da7fc10660c8   host      host      local
3bf8c39536e1   mynet     bridge    local
887ff36c6dc8   none      null      local

> docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "3bf8c39536e1221c76b86502fd8b6764a2b099f88b10909dc334799a93f1a9e7",
        "Created": "2021-08-08T03:48:24.730724726-07:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
(2)、在启动容器的时候使用自定义的网络

设置docker容器使用自定义网络
docker run -d -P tomcat01 --net mynet tomcat
--net mynet 设置自定义网络mynet
docker run -d -P tomcat02 --net mynet tomcat
使用自定义网络的优点是可以直接使用容器名进行通信
即直接使用docker exec -it tomcat01 ping tomcat02是可以ping通的,默认的网络不具有这个功能
默认的网络如果要使用这个功能,还需要通过--link进行设置

4、网络之间的通信

默认网络docker0和自定义网络mynet之间的联通
网络和网络之间是不能直接联通的,但是网络和可以不同网络的容器联通,
使用的命令是docker network connect 网络名 另一个网络中容器名
底层就是将=另一个网络中的容器放在当前网络下

上一篇下一篇

猜你喜欢

热点阅读