• 【云原生】· 一文了解docker中的网络


    目录

    🍒查看docker网络

    🍒bridge网络

    🍒none网络

    🍒host网络

    🍒自定义容器网络


        🦐博客主页:大虾好吃吗的博客

        🦐专栏地址:云原生专栏

            根据前面的学习,已经对docker有了一些简单的概念。这里在啰嗦一句,容器是一个独立的环境,可以理解为一个小型的linux系统(但不要把它当真正的系统),而docker的网络分为三种分别为bridge、host、none。

    bridge:默认网络,可以ping通外网,但是外网无法访问内网。

    host:跟本地主机host使用的同一个网络。

    none:没有网络,挂载网络下的容器除了lo,没有其他网卡。

    查看docker网络

    docker安装时会自动在网络中创建三个网络,通过下面命令查看,默认网络是bridge。

    1. [root@doc11 ~]# docker network ls
    2. NETWORK ID     NAME     DRIVER   SCOPE
    3. 7d96a5075951   bridge   bridge   local
    4. 32cea9efbc61   host     host     local
    5. 4341e5f3526d   none     null     local

    bridge网络

            docker安装的时候会创建一个名为docker0的linux bridge。如果不指定network,创建容器默认都挂在docker0上。

    1. [root@doc11 ~]# brctl show
    2. bridge name     bridge id               STP enabled     interfaces
    3. docker0         8000.0242c661a50d       no

            当docker0上没有任何网络设备,我们创建一个容器看看有什么变化。这里以httpd为例,没有镜像的话使用docker pull httpd下载一个。

    1. [root@doc11 ~]# docker run -d httpd
    2. dbd6e608e12332df931f8b010e8ea0c2404856d06b24c500bbf1bd551e590a70
    3. [root@doc11 ~]# brctl show
    4. bridge name     bridge id               STP enabled     interfaces
    5. docker0         8000.0242c661a50d       no             vethd3c5074

            通过上面的命令可以看到,一个新的网络接口vethd3c5074被挂到了docker0上,vethd3c5074就是新创建容器的虚拟网卡。

    none网络

            我们看一下none网络,它就是一个完全隔离的网络。对于安全性要求高且不需要联网的应用可以使用none网络,比如某个容器的唯一用途就是生成随机密码,就可以放到none网络中避免密码被窃取。

    1. [root@doc11 ~]# docker run -it --network=none busybox
    2. / # ifconfig
    3. lo       Link encap:Local Loopback  
    4.         inet addr:127.0.0.1 Mask:255.0.0.0
    5.         UP LOOPBACK RUNNING MTU:65536 Metric:1
    6.         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    7.         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    8.         collisions:0 txqueuelen:1000
    9.         RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
    10. / #

    host网络

            连接到host网络的容器共享docker host的网络,容器的网络配置与host完全一样。容器中可以看到host的所有网卡,hostname也是host的。

    1. [root@doc11 ~]# docker run -it --network=host busybox
    2. / # ip a
    3. 1: lo: mtu 65536 qdisc noqueue qlen 1000
    4.   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5.   inet 127.0.0.1/8 scope host lo
    6.       valid_lft forever preferred_lft forever
    7.   inet6 ::1/128 scope host
    8.       valid_lft forever preferred_lft forever
    9. 2: ens33: mtu 1500 qdisc pfifo_fast qlen 1000
    10.   link/ether 00:0c:29:74:01:52 brd ff:ff:ff:ff:ff:ff
    11.   inet 192.168.8.11/24 brd 192.168.8.255 scope global noprefixroute ens33
    12.       valid_lft forever preferred_lft forever
    13.   inet6 fe80::62ba:6b5b:2f04:4aef/64 scope link noprefixroute
    14.       valid_lft forever preferred_lft forever
    15. 3: docker0: mtu 1500 qdisc noqueue
    16.   link/ether 02:42:c6:61:a5:0d brd ff:ff:ff:ff:ff:ff
    17.   inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
    18.       valid_lft forever preferred_lft forever
    19.   inet6 fe80::42:c6ff:fe61:a50d/64 scope link
    20.       valid_lft forever preferred_lft forever
    21. / # hostname
    22. doc11
    23. / #

    那么host网络的使用场景是什么呢?

            直接使用host的网络最大的好处就是性能,如果容器对网络传输效率有较高的要求,可以选择host网络。当然也是有一些缺点的,比如要考虑端口冲突问题,如果host上已经使用的端口,容器内就不能使用了。

    自定义容器网络

            除了上面三种网络,用户也可以根据也无需求创建user-defined网络。docker提供了三种user-defined网络驱动 :bridge,overlay和macvlan。overlay和macvlan用于创建跨主机网络。

    我们通过bridge驱动创建类似bridge网络。

    1. [root@doc11 ~]# docker network create --driver bridge my_net
    2. ce55c3cfefb5138572dcf58a8a1a81805415543b69893f2899ba37f18c2641fb
    3. [root@doc11 ~]# brctl show
    4. bridge name     bridge id               STP enabled     interfaces
    5. br-ce55c3cfefb5         8000.0242c21d4aba       no
    6. docker0         8000.0242c661a50d       no

            新增一个网桥br-ce55c3cfefb5,这里br-ce55c3cfefb5正好新建bridge网络my_net的短id。下面命令查看my_net的配置信息。

    1. [root@doc11 ~]# docker network inspect my_net
    2. [
    3.   {
    4.       "Name": "my_net",
    5.       "Id": "ce55c3cfefb5138572dcf58a8a1a81805415543b69893f2899ba37f18c2641fb",
    6.       "Created": "2023-06-19T02:46:15.02356553-04:00",
    7.       "Scope": "local",
    8.       "Driver": "bridge",
    9.       "EnableIPv6": false,
    10.       "IPAM": {
    11.           "Driver": "default",
    12.           "Options": {},
    13.           "Config": [
    14.               {
    15.                   "Subnet": "172.18.0.0/16",
    16.                   "Gateway": "172.18.0.1"
    17.               }
    18.           ]
    19.       },
    20.       "Internal": false,
    21.       "Attachable": false,
    22.       "Ingress": false,
    23.       "ConfigFrom": {
    24.           "Network": ""
    25.       },
    26.       "ConfigOnly": false,
    27.       "Containers": {},
    28.       "Options": {},
    29.       "Labels": {}
    30.   }
    31. ]

    上述172.18.0.0/16是docker自动分配的IP网段,我们可以自己指定网段。

    只需要创建的时候指定--subnet和--gateway参数

    1. [root@doc11 ~]# docker network create --driver bridge --subnet 172.66.66.0/24 --gateway 172.66.66.1 my_net2
    2. 0f463941f2aa09619d41ccde1adb96a04af9228851c7c6eea5ddd0c24b54700b
    3. [root@doc11 ~]# docker network inspect my_net2
    4. [
    5.   {
    6.       "Name": "my_net2",
    7.       "Id": "0f463941f2aa09619d41ccde1adb96a04af9228851c7c6eea5ddd0c24b54700b",
    8.       "Created": "2023-06-19T02:50:57.224944386-04:00",
    9.       "Scope": "local",
    10.       "Driver": "bridge",
    11.       "EnableIPv6": false,
    12.       "IPAM": {
    13.           "Driver": "default",
    14.           "Options": {},
    15.           "Config": [
    16.               {
    17.                   "Subnet": "172.66.66.0/24",
    18.                   "Gateway": "172.66.66.1"
    19.               }
    20.           ]
    21.       },
    22.       "Internal": false,
    23.       "Attachable": false,
    24.       "Ingress": false,
    25.       "ConfigFrom": {
    26.           "Network": ""
    27.       },
    28.       "ConfigOnly": false,
    29.       "Containers": {},
    30.       "Options": {},
    31.       "Labels": {}
    32.   }
    33. ]

            上面新建的bridge网络my_net2,网段为172.66.66.0/24,网关为172.66.66.1,网关在my_net2对应的网桥br-0f463941f2aa上面。

    1. [root@doc11 ~]# brctl show
    2. bridge name     bridge id               STP enabled     interfaces
    3. br-0f463941f2aa         8000.02426b2b8eb7       no
    4. br-ce55c3cfefb5         8000.0242c21d4aba       no
    5. docker0         8000.0242c661a50d       no
    6. [root@doc11 ~]# ifconfig br-0f463941f2aa
    7. br-0f463941f2aa: flags=4099 mtu 1500
    8.       inet 172.66.66.1 netmask 255.255.255.0 broadcast 172.66.66.255
    9.       ether 02:42:6b:2b:8e:b7 txqueuelen 0 (Ethernet)
    10.       RX packets 0 bytes 0 (0.0 B)
    11.       RX errors 0 dropped 0 overruns 0 frame 0
    12.       TX packets 0 bytes 0 (0.0 B)
    13.       TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

            我们来看看网络怎么使用吧,大概可以猜到想到,使用方法和上面的相同,使用--network参数指定网络。(因为使用的虚拟机环境恢复快照了,重新下载了一下busybox)

    1. [root@doc11 ~]# docker run -it --network=my_net2 busybox
    2. Unable to find image 'busybox:latest' locally
    3. latest: Pulling from library/busybox
    4. 5cc84ad355aa: Pull complete
    5. Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
    6. Status: Downloaded newer image for busybox:latest
    7. / # ip a
    8. 1: lo: mtu 65536 qdisc noqueue qlen 1000
    9.   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    10.   inet 127.0.0.1/8 scope host lo
    11.       valid_lft forever preferred_lft forever
    12. 6: eth0@if7: mtu 1500 qdisc noqueue
    13.   link/ether 02:42:ac:42:42:02 brd ff:ff:ff:ff:ff:ff
    14.   inet 172.66.66.2/24 brd 172.66.66.255 scope global eth0
    15.       valid_lft forever preferred_lft forever
    16. / #

    可以看到上面的网络是172.66.66.2/24,也可以通过--ip指定一个静态ip。

    1. [root@doc11 ~]# docker run -it --network=my_net2 --ip 172.66.66.66 busybox
    2. / # ip a
    3. 1: lo: mtu 65536 qdisc noqueue qlen 1000
    4.   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5.   inet 127.0.0.1/8 scope host lo
    6.       valid_lft forever preferred_lft forever
    7. 8: eth0@if9: mtu 1500 qdisc noqueue
    8.   link/ether 02:42:ac:42:42:42 brd ff:ff:ff:ff:ff:ff
    9.   inet 172.66.66.66/24 brd 172.66.66.255 scope global eth0
    10.       valid_lft forever preferred_lft forever

    注:只有使用--subnet创建的网络才能指定静态ip。

                                            创作不易,支持一波,点赞,收藏,关注~

  • 相关阅读:
    剑指offer 删除链表的结点
    关系抽取(二)远程监督方法总结
    深入浅出【图卷积神经网络GCN】从 邻接矩阵、特征值矩阵、单位阵、度矩阵 入手,深刻理解融合邻居节点(信息) | GCN从公式到代码实现 全过程 | 在Cora数据集上实现节点分类任务
    service 详解
    拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者
    纪念陈皓(左耳朵耗子)
    PHP调试工具 - FirePHP安装与使用方法
    墨者-网络安全
    【Java】容器|Set、List、Map及常用API
    Java stream sorted使用 Comparator 进行多字段排序
  • 原文地址:https://blog.csdn.net/qq_61116007/article/details/131287350