当前位置:   article > 正文

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

docker 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<UP,BROADCAST,MULTICAST>  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<link>
        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<UP,BROADCAST,MULTICAST>  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<link>
        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<UP,BROADCAST,MULTICAST>  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<link>
        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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        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/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/229470
推荐阅读
相关标签
  

闽ICP备14008679号