• 详解Docker的网络模式之host模式(host网络模式)


    Docker的网络模式之host模式

    刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢?今天我们就一起来认识一下docker的网络吧~

    查看本机的网络模式

    Docker的网络模块是可插拔式的,默认有五种网络模式可以选择。通过docker network ls这个命令来查看本机中所有的网络模式。

    zxl@linux:~/Downloads$ docker network ls
    NETWORK ID     NAME                                DRIVER    SCOPE
    7073c3dcfabb   bridge                              bridge    local
    75e8b72bcb7c   docker-compose-postgresql_default   bridge    local
    f674a227bd35   host                                host      local
    f907cba0eede   kind                                bridge    local
    79f129884d9a   minikube                            bridge    local
    180116fefa44   none                                null      local
    zxl@linux:~/Downloads$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Host模式详解

    默认Docker容器运行会分配独立的Network Namespace隔离子系统,基于host模式,容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。(用的是宿主机的IP,也就是和宿主机共用一个IP地址,host模式不需要加-p进行端口映射,因为和宿主机共享网络IP和端口)

    连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。

    [root@www ~]# docker rm -f `docker ps -aq`
    b67e41213bfc
     
    [root@www ~]# docker run -itd --net=host centos7-ssh-v1:latest 
    a0b030bf26338f41c8fa8c47de3cdc7dd9880036640e048bb563e740f567728b
    [root@www ~]# docker ps
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
    a0b030bf2633        centos7-ssh-v1:latest   "/bin/sh -c /usr/sbi??   5 seconds ago       Up 5 seconds                            laughing_williamson
    [root@www ~]# docker inspect a0b030bf2633 | grep -i networkmode
                "NetworkMode": "host",
    [root@www ~]# docker exec -it a0b030bf2633 /bin/bash
    [root@a0b030bf2633 ~]# ifconfig
    br-a68a7681f73a: flags=4099  mtu 1500
            inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255
            inet6 fe80::42:b6ff:fed1:6076  prefixlen 64  scopeid 0x20
            ether 02:42:b6:d1:60:76  txqueuelen 0  (Ethernet)
            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
    br-b09178df0a79: flags=4099  mtu 1500
            inet 172.21.0.1  netmask 255.255.0.0  broadcast 172.21.255.255
            inet6 fe80::42:45ff:feff:369d  prefixlen 64  scopeid 0x20
            ether 02:42:45:ff:36:9d  txqueuelen 0  (Ethernet)
            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
    docker0: flags=4099  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::42:44ff:fea0:1092  prefixlen 64  scopeid 0x20
            ether 02:42:44:a0:10:92  txqueuelen 0  (Ethernet)
            RX packets 7021  bytes 306134 (298.9 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 7957  bytes 60566091 (57.7 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ens33: flags=4163  mtu 1500
            inet 192.168.179.100  netmask 255.255.255.0  broadcast 192.168.179.255
            inet6 fe80::afe7:df8d:107b:abd1  prefixlen 64  scopeid 0x20
            ether 00:0c:29:93:42:61  txqueuelen 1000  (Ethernet)
            RX packets 98616  bytes 117487805 (112.0 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 22452  bytes 2530627 (2.4 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ens37: flags=4163  mtu 1500
            inet 172.20.2.129  netmask 255.255.255.0  broadcast 172.20.2.255
            inet6 fe80::e64a:a3d7:df04:1664  prefixlen 64  scopeid 0x20
            ether 00:0c:29:93:42:6b  txqueuelen 1000  (Ethernet)
            RX packets 82168  bytes 46060412 (43.9 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 12879  bytes 1182653 (1.1 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    lo: flags=73  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1  (Local Loopback)
            RX packets 12  bytes 1004 (1004.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 12  bytes 1004 (1004.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    #容器22端口是启动不了的,因为是共享宿主机的22端口的,在容器内要改为6022才可以,然后重新启动ssh
    [root@a0b030bf2633 ~]# vi /etc/ssh/sshd_config 
    [root@a0b030bf2633 ~]# cat /etc/ssh/sshd_config | grep -i port | grep -v "#"
    Port 6022
    [root@a0b030bf2633 ~]# /usr/sbin/sshd
     
    #在容器里也可以看到宿主机的端口
    [root@a0b030bf2633 ~]# netstat -tpln
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -                   
    tcp        0      0 0.0.0.0:6022            0.0.0.0:*               LISTEN      39/sshd             
    tcp6       0      0 :::22                   :::*                    LISTEN      -                   
    tcp6       0      0 ::1:25                  :::*                    LISTEN      -                   
    tcp6       0      0 :::6022                 :::*                    LISTEN      39/sshd  
     
    ​
    [root@a0b030bf2633 ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
     
    Connecting to 192.168.179.100:6022...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host 网络的使用场景又是什么呢?
    直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

    Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables等。

    使用主机模式不需要加-p映射,因为是共用宿主机的端口了,企业一般用的比较少,容易乱套搞晕懵圈,因为你区分不了在容器还是宿主机里面(共享网络,共享主机名)。

    host模式应用示例

    Docker 镜像内集成了 V2Ray 内核,因此内核无需额外被安装。

    --network=host指定使用host模式

    # run v2raya
    docker run -d \
      --restart=always \
      --privileged \
      --network=host \
      --name v2raya \
      -e V2RAYA_ADDRESS=0.0.0.0:2017 \
      -v /lib/modules:/lib/modules:ro \
      -v /etc/resolv.conf:/etc/resolv.conf \
      -v /etc/v2raya:/etc/v2raya \
      mzz2017/v2raya
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果你使用 MacOSX 或其他不支持 host 模式的环境,在该情况下无法使用全局透明代理,或者你不希望使用全局透明代理,docker 命令会略有不同:

    # run v2raya
    docker run -d \
      -p 2017:2017 \
      -p 20170-20172:20170-20172 \
      --restart=always \
      --name v2raya \
      -v /etc/v2raya:/etc/v2raya \
      mzz2017/v2raya
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参考链接:

    https://blog.csdn.net/qq_34556414/article/details/107864633
    https://v2raya.org/docs/prologue/installation/docker/

  • 相关阅读:
    (一)Multisim安装与入门
    会议OA项目之我的审批功能
    抓包后使用postman访问出错,后端报错 MalformedJsonException: Unterminated string
    Linux小技巧之awk必知必会
    Unity开发之C#基础-异常处理(Try Catch)
    故障排除指南:解决 Kibana Discover 加载中的 6 个常见问题
    哔哩哔哩移动端项目:Vue3.2 + TS + Axios入门到实战
    golang基础:channel的应用场景
    基于杂草优化算法的线性规划问题求解matlab程序
    基础Redis-Java客户端操作介绍
  • 原文地址:https://blog.csdn.net/a772304419/article/details/126056421