zoukankan      html  css  js  c++  java
  • 3--Docker网络 ; Docker图形化界面

    一、网络基础

    其中 Docker 使用到的与 Linux 网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。

    1.网络名称空间介绍

    为了支持网络协议栈的多个实例,Linux 在网络协议栈中引入了网络名称空间(Network Namespace),这些 独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行 网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环 境,而 Docker 正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在 Linux 的网络命名空间 内可以有自己独立的 Iptables 来转发、NAT 及 IP 包过滤等功能。
    
    Linux 的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。 最好的办法就是让这些全局变量成为一个 Net Namespace 变量的成员,然后为了协议栈的函数调用加入一个 Namespace 参数。这就是 Linux 网络名称空间的核心。所以的网络设备都只能属于一个网络名称空间。当然, 通常的物理网络设备只能关联到 root 这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空 间中,而且可以在这些名称空间之间移动
    

    2.创建一个命名空间

    # 新建一台新机器
    [root@docker1 ~]# ip netns add tes1
    [root@docker1 ~]# ip netns add tes2
    [root@docker1 ~]# ip netns ls #或者 ip netns  list
    tes2
    tes1
    

    1)Veth设备

    引入 Veth 设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间连接起来。
    由于要连接的两个网络命名空间,所以 Veth 设备是成对出现的,很像一对以太网卡,并且中间有一根直连 的网线。
    既然是一对网卡,那么我们将其中一端称为另一端的 peer。在 Veth 设备的一端发送数据时,它会将数 据直接发送到另一端,并触发另一端的接收操作
    

    2)Veth设备操作

    先打通tes01与root命名空间的网络

    1> 创建Veth设备对

    [root@docker1 ~]# ip link add veth type veth peer name veth001
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     ...
     
    4: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 1a:68:da:4d:bb:d8 brd ff:ff:ff:ff:ff:ff
    5: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 0a:aa:b5:dd:14:f0 brd ff:ff:ff:ff:ff:ff
    ···
    # ip link add : 增加网络虚拟设备资源
    # veth type :类型是veth
    # veth : 名字设置成veth
    # peer name veth001 :另一半的名字是veth001
    

    2> 绑定命名空间

    将veth设备对一端添加到tes01命名空间内
    veth另一端留给root命名空间

    [root@docker ~]# ip link set veth001 netns test01
    [root@docker ~]# ip link show | grep veth
    8: veth@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    
    # 此时查看不到veth001,进入tes01命名空间后,即可查看到
    [root@docker1 ~]# ip netns exec tes01 bash
    [root@docker1 ~]# ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4: veth001@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 1a:68:da:4d:bb:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    # 因为进入与退出命名空间的主机名是一样的,记得退出到root名称空间
    [root@docker1 ~]# exit
    exit
    

    3> 给tes01内的Veth分配一个IP

    # 分配一个IP
    [root@docker ~]# ip netns exec test01 ip addr add 172.16.0.11/20 dev veth001
    
    # 绑定veth到test01,属重启
    [root@docker ~]# ip netns exec test01 ip link set dev veth001 up
    
    # 查看,绑定+分配成功
    [root@docker1 ~]# ip netns exec test01 ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4: veth001@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 1a:68:da:4d:bb:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.16.0.11/20 scope global veth001
           valid_lft forever preferred_lft forever
    

    4> 为对端Veth设备分配IP

    对端为root命名空间

    # 查看,发现此时无IP
    [root@docker ~]# ip a
    	···
    8: veth@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 66:ac:b6:d2:81:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        
    # 为其分配IP
    [root@docker ~]# ip addr add 172.16.0.12/20 dev veth
    
    # 再次查看发现IP已分配成功
    [root@docker ~]# ip a
    	···
    8: veth@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 66:ac:b6:d2:81:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.16.0.12/20 scope global veth
           valid_lft forever preferred_lft forever
    

    5> 测试互ping

    # 此时测试双方可以相互ping通!
    
    - 宿主机vethip的为172.16.0.12
    - tes01内veth的ip为172.16.0.11
    
    1.在宿主机ping test01
    [root@docker ~]# ping 172.16.0.11
    PING 172.16.0.11 (172.16.0.11) 56(84) bytes of data.
    64 bytes from 172.16.0.11: icmp_seq=1 ttl=64 time=0.052 ms
    64 bytes from 172.16.0.11: icmp_seq=2 ttl=64 time=0.057 ms
    ^C
    --- 172.16.0.11 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 999ms
    rtt min/avg/max/mdev = 0.052/0.054/0.057/0.007 ms
    
    
    2.在tes01命名空间内ping宿主机
    [root@docker ~]# ip netns exec test 01 bash
    [root@docker ~]# ping 172.16.0.12
    PING 172.16.0.12 (172.16.0.12) 56(84) bytes of data.
    64 bytes from 172.16.0.12: icmp_seq=1 ttl=64 time=0.103 ms
    64 bytes from 172.16.0.12: icmp_seq=2 ttl=64 time=0.068 ms
    ^C
    --- 172.16.0.12 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1012ms
    rtt min/avg/max/mdev = 0.068/0.085/0.103/0.019 ms
    
    

    6> 补充概念

    每run起一个容器,则会在ip a内生成一个veth设备,容器清除后,veth设备则会随之清除

    3.网桥介绍

        Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。 网桥是二层的虚拟网络设备, 它是把若干个网络接口“连接”起来,从而报文能够互相转发。
    
        网桥能够解析收发的报文,读取目标 MAC 地 址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。 网桥设备 brO 绑定了 eth0、 eth1 。对于网络协议的上层来说,只看得到 brO 。
        因为桥接是在数据链 路层实现的 ,上层不需要关心桥接的细节,于是协议枝上层需要发送的报文被送到 brO ,网桥设备的处理代 码判断报文该被转发到 ethO 还是 ethl ,或者两者皆转发。反过来,从 ethO 或从 ethl 接收到的报文被提交 给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议上层。 而有时 ethl 也可能会作为 报文的源地址或目的地址 直接参与报文的发送与接收,从而绕过网桥。
        
    # 网桥  ----------> 相当于     交换机
    

    网桥

    docker network [cmd]
    
    # 查看网桥
    	docker network ls
    	
    # 创建网桥
    	docker network create [网桥名称]
    	
    # 查看网桥信息
    	docker network inspect [网桥的名称|ID]
    
    # 连接一个容器
    	docker network connect [网络名称] [容器名称]
    
    # 断开一个连接
    	docker network disconnect [网络名称] [容器名称]
    
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
    cf263ab4f7c0   nginx     "/docker-entrypoint.…"   19 minutes ago   Up 19 minutes   80/tcp    boring_poincare
    60b5ca330f76   nginx     "/docker-entrypoint.…"   24 minutes ago   Up 24 minutes   80/tcp    silly_chatelet
    [root@docker ~]# docker network cnnect mm boring_poincare #创建
    [root@docker ~]# docker network disconnect mm boring_poincare #删除
    
    # 删除一个网桥
    	docker network rm [网桥名称]
    
    # 清除所有网桥(清除除了默认的三个网桥之外和正在使用的)
    	docker network prune
    [root@docker ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    ca6024e1565b   bridge    bridge    local
    78c7eb1884a2   host      host      local
    55fea18f04d0   mm        bridge    local
    442fc1b858a6   none      null      local
    9263d05caf7a   ping      bridge    local
    [root@docker ~]# docker rm -f 9263d05caf7a 
    Error: No such container: 9263d05caf7a
    [root@docker ~]# docker network rm 9263d05caf7a 
    9263d05caf7a
    

    4.iptables

     我们知道, Linux 络协议樵非常高效,同时比较复杂,如果我们希望在数据的处理过程中对关心的数据进行 一些操作该怎么做呢?
    
         Linux 提供了一套机制来为用户实现自定义的数据包处理过程。在 Linux 网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在 Linux 网络棋处理数 据包的过程中对数据包进行一些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux 网络协议战中灵活的数据包处理 机制。
    

    5.总结

    二、Docker四种网络模式(模型)

    简介

         当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚 拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。 虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器 就通过交换机连在了一个二层网络中。(默认为该模式)
    
         Docker 使用 Linux 桥接的方式,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址,称为 Container-IP,同时 Docker 网桥是每个容器的默认网关。 因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
    
       Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外 部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到 宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主 机 IP]:[容器端口]访问容器。
       
    # HOST模式
    –-network=host
    容器和宿主机共享 Network namespace
    
    # Container模式
    –network=container:ID
    容器和另外一个容器共享 Network namespace。 kubernetes 中的 pod 就是多个容器共享一个 Network namespace
    
    # none模式
    –network=none
    容器有独立的 Network namespace,但并没有对其进行任何网 络设置,如分配 veth pair 和网桥连接,配置 IP 等
    
    # bridge模式
    –network=bridge (默认为该模式)
    

    1.HOST模式(主机)

        如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。
    
        容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
    
        使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了,网络的隔离性不好。
    

    1)案例

    # 运行容器,指定为host模式
    [root@docker ~] docker run -d --name my-web --network=host nginx
    
    # 查看启动
    [root@docker ~] docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
    d7b23542ced3   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute             my-web
    
    # 容器与宿主机主机名一致,是因为得到了host解析的缘故,自己要区分好,内部内容不同
    # 容器与宿主机ip a内容也是一样的
    [root@docker ~] docker exec -it my-web bash
    root@docker:/ ls
    bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
    boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr
    
    # 通过本机ip+端口可直接访问到容器内部
    [root@docker ~] curl 127.0.0.1
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    # 若再次启动一个nginx并指定为host模式,则会端口冲突
    [root@docter ~]# docker run -d --network=host nginx
    316516cf07cebc462c4c2ef6ec2887c207dc4e0e161d6111121ff3957447190b
    
    # 启动后速度查看后台会显示启动
    [root@docter ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
    d7f9566b853b   nginx     "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes                                              thirsty_black
    7744fbe4a8a8   nginx     "/docker-entrypoint.…"   54 minutes ago   Up 54 minutes   0.0.0.0:49154->80/tcp, :::49154->80/tcp   epic_neumannb
    
    # 隔两秒就没有了,端口冲突起不来的缘故
    [root@docter ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
    d7f9566b853b   nginx     "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes                                              thirsty_black
    
    # 启动时感觉像成功,其实是在报错误日志,只不过没显示而已
    [root@docker ~] docker logs romantic_tereshkova
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    2021/03/28 11:03:36 [emerg] 1#1: bind() to [::]:80 failed (98: Address already in use)
    	···
    
    

    2)HOST模式总结

    • 容器使用宿主主机的网卡,不能跟宿主主机之间的端口冲突。
    • 四种模式相比之下性能最高

    2.Container模式(集装箱/容器)

    # Container kang teng ne
    这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
    新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
    同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的,两个容器的进程可以通过 lo 网卡设备通信。
    

    1)案例

    # container后跟共享容器的名称
    [root@docker ~] docker run -it --network=container:ngixn nginx bash
    
    [root@docter mm]# docker run -it --network="container:nginx1" nginx bash #这种也可以
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    root@f95beddd2aa5:/# ip a
    
    # 访问nginx测试成功
    root@docker:/ curl 127.0.0.1 
    <!DOCTYPE html>
    	···
    </body>
    </html>
    
    

    2)Container模式总结

    一个容器使用另一个容器的网卡(网络共享)
    container模式中,一系列相关的容器里面,端口是不能重复的***
    # K8s大量内使用
    

    3.none模式(无网络)

    使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络 配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息,需要我们自己为 Docker 容器添加网卡、配置 IP 等。
    
    这种网络模式下容器只有 lo 回环网络,没有其他网卡。none 模式可以在容器创建时通过–network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
    
    适用于保密文件等
    
    很少用,无网络
    

    4.bridge模式(桥接)

    当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
    从docker0子网中分配一个ip给容器使用,并设置docker0的ip地址为容器的默认网关,在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一段放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。
    bridge 模式是docker的默认网络模式,无需写 --net 参数,使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能,可以使用iptables -t nat -vnL 查看。
    

    运行容器默认不指定,即为bridge模式
    若创建网桥如lnmp,运行容器时指定为lnmp,即为bridge模式

    5.自定义网桥

    1.创建一个网桥(相当于自定义名称,默认模式bridge),其余三个模式无须创建,可直接指定
    [root@docter ~]# docker network create cdan
    7ed1e078ef5e54719bbc1032e2bc1c2caefcb90c4b0283525aa1a926ed61d6f1
    [root@docter ~]# docker network ls   #展示网桥列表
    NETWORK ID     NAME      DRIVER    SCOPE
    aea495e49e87   bridge    bridge    local
    b0a268c1d902   host      host      local
    7ed1e078ef5e   cdan      bridge    local
    0d214ca04d47   none      null      local
    [root@docker ~]#  docker network inspect cdan    #查看cdan网桥的详细信息
    [
        {
            "Name": "cdan",   #名字
            "Id": "4ef00a5febc9d41a4abff000fe7351ba41c4aba84ff40e9b36261b5d734e86e6",#ID
            "Created": "2021-07-29T09:06:28.476590711+08:00",    #创建时间
            "Scope": "local",   #范围
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": { #此网桥理面有哪些容器
                "5de1063c4193ca2ad7ccc291fb8c6e52a84b66a7bac3ec1a31f8eeff78feded2": {
                    "Name": "nginx11",
                    "EndpointID": "69d749e4a0919c363ede6922bc39fb83c3f5e6d71947a01e2f393a5a54cff6b5",
                    "MacAddress": "02:42:ac:12:00:02",
                    "IPv4Address": "172.18.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    [root@docker ~]# docker network connect cdan d060f33b34ed  #网桥连接一个容器id
    [root@docker ~]# docker network disconnect cdan d060f33b34ed  # 网桥断开一个容器id
    [root@docker ~]#  docker network prune     #删除未被用的自定义的网桥
    
    2.指定网络模式运行一个容器
    [root@docter ~]# docker run -d --network=cdan nginx
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    86c72202856aef70431bacff36f13d3a96085b309bd6ed18c2774dae80cd5471
    
    [root@docter ~]# docker run -d --network=cdan --name nginx11 nginx  #执行这条命令就行,下面无需执行
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    b600d3d9cae3c8fbef58b68e71c6006940b078d1af624b19d1a4c229c7855eec
    [root@docter ~]# docker run -d --network=cdan --name nginx2 nginx
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    2413cee15626b9f2a5b0a14a410fc95f676ba448d07df766578904c62eb81ebb
    [root@docter ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
    2413cee15626   nginx     "/docker-entrypoint.…"   4 seconds ago        Up 4 seconds        80/tcp    nginx2
    b600d3d9cae3   nginx     "/docker-entrypoint.…"   8 seconds ago        Up 7 seconds        80/tcp    nginx11
    86c72202856a   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    sharp_villani
    d31deaf4037b   nginx     "/docker-entrypoint.…"   4 minutes ago        Up 4 minutes        80/tcp    nginx1
    
    # 测试访问
    [root@docter ~]# docker run -it --network=cdan nginx bash
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    root@ce0acd026af7:/# curl nginx11 #测试成功
    root@ce0acd026af7:/# curl nginx2  #测试成功
    root@ce0acd026af7:/# curl nginx33  #测试失败,因为没有创建
    <!DOCTYPE html>
    <html>
    <head>
    ...
    </body>
    </html>
    # 查看:为bridge模式 
    [root@docker ~]# docker inspect nginx
    	···
        "Networks": {
        "bridge": {
        "IPAMConfig": null,
        "Links": null,
    	···
    	
    3.不指定网络模式运行一个容器
    [root@docker ~] docker run -d --name mysql mysql:5.7
    b4cbedd83f1325cd778f0d29b9ee25fd1949a5276166d7980a94a31444132c3a
    
    # 查看:依然默认是bridge模式
    [root@docker ~] docker inspect mysql
    	···
        "Networks": {
        "bridge": {
        "IPAMConfig": null,
    

    三、Docker网络

    1.理解docker0

    原理:

    1)...我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0。
    桥接模式,使用的技术是evth-pir技术。

    2)...evth-pir 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。

    3)...正因为有这个特性,evth-pir 充当一个桥梁,连接各种虚拟网络设备。

    4)...Openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pir技术。

    在这里插入图片描述

    img

    结论:

    -----所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
    -----Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
    -----Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高。(内网传递文件!)

    2.–link的使用

    思考:我们编写了一个微服务,database url=ip,项目不重启,数据库IP换掉了,我们希望可以处理这个问题,可以用名字来进行访问容器?

    #ping不通如何解决?
    [root@docker ~]# docker exec -it tomcat02 ping tomcat01
    ping: tomcat01: Name or service not known
    

    使用–link解决网络连通的问题!

    #1.使用--link 连接tomcat03和Tomcat02
    [root@docker ~]# docker run -d -P --name tomcat03  --link tomcat02 tomcat
    dd2d5eddde7178b9ad16577eefc0080f3c076a57659f8410e7d740966f7bb055
    
    #2.用tomcat03去pingtomcat02可以ping通
    [root@docker ~]# docker exec -it tomcat03 ping tomcat02
    PING tomcat02 (172.17.0.3) 56(84) bytes of data.
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.176 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.076 ms
    
    #3.用tomcat02去pingtomcat03是ping不通的(反向ping不通)
    [root@docker ~]# docker exec -it tomcat02 ping tomcat03
    ping: tomcat03: Name or service not known
    

    – link原理探究:

    #1.进入tomcat03 查看hosts配置文件
    [root@docker ~]# 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	tomcat02 cab6ffb30712
    172.17.0.4	dd2d5eddde71
    
    #结论:就是在hosts文件内增加了一个172.17.0.3 tomcat02 cab6ffb30712
    

    现在docker已经不建议使用–link了,我们需要的自定义网络,不使用docker0.
    docker0问题:它不支持容器名连接访问

    3.自定义网络

    #1.查看所有的docker网络
    [root@docker ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    4549489718fb   bridge    bridge    local
    4e455d1ea0e9   host      host      local
    5207250efebf   lnmp      bridge    local
    d65cecabed67   none      null      local
    

    1)网络模式:
    bridge :桥接模式(默认,自己创建也是用桥接模式)
    none :不配置网络
    host :主机模式==》和宿主机共享网络
    container :容器网络连通(用的少)

    2)创建自定义网络模式:

    #1.之前不指定网络模式启动的方式默认是桥接方式(省略了--net bridge)
    [root@docker ~]# docker run -d -P --name tomc at01 --net bridge tomcat
    #域名不能访问
    
    #2.自定义网络
    [root@docker ~]# docker network create --driver bridge --subnet 192.168.0.0/16  --gateway 192.168.0.1 mynet  #自定义网络
    17b60394141b7770e9ce4383ea632bf909efade440c9de8f5de6adef4f7ad6f8
    注:
    --driver bridge          :网络模式
    --subnet 192.168.0.0/16  :子网地址 (192.168.0.2-192.168.255.255)
    --gateway 192.168.0.1    :网关地址(路由器的地址)
    
    #查看网络模式
    [root@docker ~]# docker network ls  
    NETWORK ID     NAME      DRIVER    SCOPE
    4549489718fb   bridge    bridge    local
    4e455d1ea0e9   host      host      local
    5207250efebf   lnmp      bridge    local
    17b60394141b   mynet     bridge    local
    d65cecabed67   none      null      local
    
    #2.使用自己的网络启动tomcat-net-01和tomcat-net-02
    [root@docker ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
    6bda213671717769c2e30212303729d6e01e9989bdf812111a4c51cf0f1380a2
    [root@docker ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
    35e89ee999e1306abcd9425a5e0eff9d3dcbac6a0a4d5d7ced9012a8d5d1aa84
    
    [root@docker ~]# docker network inspect mynet  #查看自己配置的网络自动分配两个IP给tomcat-net-01和tomcat-net-02
            "ConfigOnly": false,
            "Containers": {
                "35e89ee999e1306abcd9425a5e0eff9d3dcbac6a0a4d5d7ced9012a8d5d1aa84": {
                    "Name": "tomcat-net-02",
                    "EndpointID": "bacefc22806b6af3a6793cf181f45ccee9e485bbb5c717354e38866156e6342a",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                },
                "6bda213671717769c2e30212303729d6e01e9989bdf812111a4c51cf0f1380a2": {
                    "Name": "tomcat-net-01",
                    "EndpointID": "167489eb66380ca0252e55af28b1bbc8be10b91cf83dd43cb26c5a064e259f9a",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                }
            },
    

    在这里插入图片描述

    3)测试自定义网络模式:

    #1.测试使用IP和名字都可以ping通(自定义网络模式修复了桥接模式的不足)
    [root@docker ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
    PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
    64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.274 ms
    64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.079 ms
    64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.077 ms
    ^C
    --- 192.168.0.3 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2ms
    rtt min/avg/max/mdev = 0.077/0.143/0.274/0.092 ms
    [root@docker ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
    PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.040 ms
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.097 ms
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.102 ms
    ^C
    --- tomcat-net-02 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 30ms
    rtt min/avg/max/mdev = 0.040/0.079/0.102/0.029 ms
    

    4.网络连通

    在这里插入图片描述

    在这里插入图片描述

    #1.将tomcat01与mynet网络连通
    [root@docker ~]# docker network connect mynet tomcat01
    [root@docker ~]# docker network inspect mynet  #查看mynet详细信息
                },
                "b6190ab46e74c0a3936abd03ef2dfbf27c9ed86105df5724c3632810a36cb7f1": {
                    "Name": "tomcat01",
                    "EndpointID": "3caef97f78a51e11966cbfdd6ac937025b96e488d5480dddb57b388873fe42f6",
                    "MacAddress": "02:42:c0:a8:00:04",
                    "IPv4Address": "192.168.0.4/16",
                    "IPv6Address": ""
                }
    
    注:
       连通之后就是将tomcat01 放到了mynet网络下
       相当于一个容器两个IP地址
       好比阿里云服务的公网IP与私网IP
    
    
    #2.测试tomcat01连通性(此时tomcat02还是不能连通的)
    [root@docker ~]# docker exec -it tomcat01 ping tomcat-net-01
    PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
    64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.329 ms
    64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.077 ms
    64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.073 ms
    ^C
    --- tomcat-net-01 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 4ms
    rtt min/avg/max/mdev = 0.073/0.159/0.329/0.120 ms
    

    结论:假设要跨网络操作别人,就需要使用docker network connect 连通!

    四、简单总结

    docker 网络模式
    
    	host模式 : 与Linux宿主主机共享网络
    	
    	container模式 :与另一个容器共享网络
    	
    	none模式 : 只为容器提供回环网络
    	
    	bridge模式 : 网桥模式(多个容器间的网络互通,推荐使用网桥)
    
    docker network
    
    	1、系统默认创建了三个网桥(host、none以及bridge)
    	
    	2、创建网桥:docker network create [网桥名称]
    	
    	3、删除网桥:docker network rm [网桥名称]
    	
    	5、连接网桥:docker network connect [容器] [网桥名称]
    	
    	6、断开连接:docker network disconnect [网桥名称] [容器] 
    	
    	7、查看网桥列表:docker network ls
    	
    	8、清空网桥:docker network prune
    

    五、图形化界面

    www.portainer.io

  • 相关阅读:
    OK335x mksd.sh hacking
    Qt jsoncpp 对象拷贝、删除、函数调用 demo
    OK335xS 256M 512M nand flash make ubifs hacking
    Qt QScrollArea and layout in code
    JsonCpp Documentation
    Qt 4.8.5 jsoncpp lib
    Oracle数据库生成UUID
    freemarker得到数组的长度
    FreeMarker中if标签内的判断条件
    freemarker语法
  • 原文地址:https://www.cnblogs.com/caodan01/p/15073882.html
Copyright © 2011-2022 走看看