暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

09-docker系列-docker网络你了解多少(下)

运维家 2022-02-16
144

声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。


主旨

本文接上一篇介绍的4种网络模式,据此,分别来进行实验下。


环境

    linux环境
    docker环境


    回忆

      bridge:容器和宿主机的docker0网卡桥接
      host:容器和宿主机共享网络
      null:独立,不能进行网络交互
      contain:容器网络共享,和host的差异在于所有的docker容器,共同拥有一个IP地址


      bridge模式

      使用nginx镜像,将容器的80端口,映射到宿主机上:
        语法:
          docker run -d -p 宿主机端口:容器端口 -p 宿主机端口:容器端口 镜像名
          解释:
            如果是多个端口映射,多个几个 -p 即可,下面我们只映射了一个端口
            宿主机和容器端口可以不对应,即容器80端口,宿主机可以是10000端口
        实例:
        [yunweijia@localhost ~]$ sudo docker images
        REPOSITORY TAG IMAGE ID CREATED SIZE
        yunweijia jenkins 976d65da21b9 44 hours ago 874MB
        yunweijia python3 31255eafafc3 47 hours ago 662MB
        nginx latest c316d5a335a5 2 weeks ago 142MB
        centos       7         eeb6ee3f44bd   5 months ago   204MB
        [yunweijia@localhost ~]$ sudo docker run -d -p 80:80 nginx
        ed75d4ce62f1f5b3668f430726a6e4c1f630683ef12e2805019543bb96f33ce6
        [yunweijia@localhost ~]$ sudo docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        ed75d4ce62f1 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp quizzical_shannon
        [yunweijia@localhost ~]$
        [yunweijia@localhost ~]$ sudo netstat -tunlp | grep 80
        tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 105966/docker-proxy
        tcp6 0 0 :::80 :::* LISTEN 105970/docker-proxy
        udp 0 0 0.0.0.0:44380 0.0.0.0:* 706/avahi-daemon: r
        [yunweijia@localhost ~]$ 


            开通防火墙策略:

          [yunweijia@localhost ~]$ sudo firewall-cmd --add-port=80/tcp --permanent
          success
          [yunweijia@localhost ~]$ sudo firewall-cmd --reload
          success
          [yunweijia@localhost ~]$ sudo firewall-cmd --list-port
          80/tcp
          [yunweijia@localhost ~]$


              浏览器访问验证:

            http://宿主机IP:80



            host模式

            使用nginx镜像,也是将80端口暴露出来(记得将上一步启动的nginx镜像使用docker stop 容器ID 的方式停掉,因为我们上面使用的就是80端口,端口冲突的话容器无法启动):
              语法:
                docker run -d --net=host 镜像
              实例:
              [yunweijia@localhost ~]$ sudo docker run -d --net=host nginx
              a515ca68b5db8f181ba746d074562971a1121222d13848e9f24382fb5664ac43
              [yunweijia@localhost ~]$ sudo docker ps
              CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
              a515ca68b5db nginx "/docker-entrypoint.…" 6 seconds ago Up 6 seconds serene_hopper
              [yunweijia@localhost ~]$ sudo netstat -tunlp | grep 80
              tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 106519/nginx: maste
              tcp6 0 0 :::80 :::* LISTEN 106519/nginx: maste
              udp 0 0 0.0.0.0:44380 0.0.0.0:* 706/avahi-daemon: r
              [yunweijia@localhost ~]$


              如果防火墙没有开通80端口,也是要开通的,以上文的方式开通,因为同样都是80端口,此处就不重复写入了。


              浏览器访问验证:
                http://宿主机IP:80



                null模式

                使用nginx镜像来验证,此处也需要停止上面建立的nginx容器,本来是不需要的,但是我们这里要做验证,所以需要停止,使用null模式启动的容器,自己是一个完全独立的环境:
                  语法:
                  docker run -d --net=none nginx
                  实例:
                  [yunweijia@localhost ~]$ sudo docker run -d --net=none nginx
                  5f73c16b7cdbf3e32d755b6cc1f4a28875ea734c6f916d03422b19f8d67429bf
                  [yunweijia@localhost ~]$
                  [yunweijia@localhost ~]$ sudo docker ps
                  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                  5f73c16b7cdb nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds boring_cohen
                  [yunweijia@localhost ~]$

                  浏览器访问:
                    http://宿主机IP:80

                    可以看到在我们容器启动之后,浏览器也无法访问nginx,且如果我们进入容器中,他和谁也无法进行网络通信,但是nginx镜像为了控制镜像的大小,没有安装ping命令,故而我们再启动一个centos容器来进行验证,如下:
                      [yunweijia@localhost ~]$ sudo docker run -it --net=none centos:7 bin/bash
                      [root@5b4d026a5a2c ]# ping 192.168.112.130
                      connect: Network is unreachable
                      [root@5b4d026a5a2c ]# ping 127.0.0.1
                      PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
                      64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
                      64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.050 ms
                      ^C
                      --- 127.0.0.1 ping statistics ---
                      2 packets transmitted, 2 received, 0% packet loss, time 1000ms
                      rtt min/avg/max/mdev = 0.045/0.047/0.050/0.007 ms
                      [root@5b4d026a5a2c ]# ping www.baidu.com
                      ping: www.baidu.com: Name or service not known
                      [root@5b4d026a5a2c ]# exit
                      exit
                      [yunweijia@localhost ~]$

                          从上面可以看到只能通信本身的回环地址。


                      contain模式

                      先使用bridge模式,后台启动一个centos容器,然后再使用contain模式,启动其他容器:
                      PS:这里不得不再写两句,因为我就在这里就卡了一下子,尽管之前文章中也写到了,但是这里再次强调下。如果你的宿主机可以联网,且你使用brideg模式启动了容器,但是这个容器无法联网的话,第一,检查下路由转发是否打开了;第二,检查下selinux是否关闭了,如果前两项有问题,但是你改好了,容器也重启了,还是无法联网,那么你重启下docker服务,就行了,就可以联网了,一定要检查好,别急,稳住。
                        [yunweijia@localhost ~]$ sudo docker run -d centos:7 bin/bash -c "while true;do echo yunweijia; sleep 5; done"
                        8dac7ae5ce12e7aefca6c0640bf3a0504193ba2760324bae06d161e004452ebb
                        [yunweijia@localhost ~]$ sudo docker exec -it 8dac7a /bin/bash
                        [root@8dac7ae5ce12 ]# yum -y install net-tool
                        [root@8dac7ae5ce12 ]# ifconfig
                        eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
                        inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
                        ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
                        RX packets 13047 bytes 21842754 (20.8 MiB)
                        RX errors 0 dropped 0 overruns 0 frame 0
                        TX packets 8534 bytes 464490 (453.6 KiB)
                        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


                        lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
                        inet 127.0.0.1 netmask 255.0.0.0
                        loop txqueuelen 1000 (Local Loopback)
                        RX packets 0 bytes 0 (0.0 B)
                        RX errors 0 dropped 0 overruns 0 frame 0
                        TX packets 0 bytes 0 (0.0 B)
                        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


                        [root@8dac7ae5ce12 /]#


                        从上面可以看到容器的IP是172.17.0.2,那么我们接下来使用contain方式再启动一个nginx容器:
                          语法:
                            docker run -d --net=container:有独立IP地址的容器ID或者名字 镜像名
                          实例:
                          [yunweijia@localhost ~]$ sudo docker run -d --net=container:8dac7 nginx
                          1078238592dcc63307271595ecdddf1b19281b802a57b28edd61b072bb1854c0
                          [yunweijia@localhost ~]$ sudo docker ps
                          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                          1078238592dc nginx "/docker-entrypoint.…" 13 seconds ago Up 12 seconds affectionate_merkle
                          8dac7ae5ce12 centos:7 "/bin/bash -c 'while…" 11 minutes ago Up 11 minutes sweet_keller
                          [yunweijia@localhost ~]$


                          然后我们curl一下centos的容器IP看下结果:
                            [yunweijia@localhost ~]$ curl http://172.17.0.2
                            <!DOCTYPE html>
                            <html>
                            <head>
                            <title>Welcome to nginx!</title>
                            <style>
                            html { color-scheme: light dark; }
                            body { width: 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>
                            [yunweijia@localhost ~]$


                            我们访问的centos容器,为什么出来了nginx的界面呢?当然是访问到nginx容器里面的nginx了呀,这个也证明了使用contain方式启动的容器,共享同一个容器IP。

                            至于为什么不用浏览器访问?那是因为我容器的IP地址只能和宿主机交互啊,如果你要使用浏览器访问,你就给他配置一个你浏览器能访问通的IP地址就行了。


                            至此,docker网络介绍结束,下面我们将介绍下docker的容器文件共享和特权模式。
                            文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论