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$

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 1500inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255inet6 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 0TX 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 1500inet 172.21.0.1  netmask 255.255.0.0  broadcast 172.21.255.255inet6 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 0TX 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 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 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 0TX 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 1500inet 192.168.179.100  netmask 255.255.255.0  broadcast 192.168.179.255inet6 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 0TX 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 1500inet 172.20.2.129  netmask 255.255.255.0  broadcast 172.20.2.255inet6 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 0TX 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 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::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 0TX 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.localdomain6Connecting to 192.168.179.100:6022...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

在容器中可以看到 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

如果你使用 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

参考链接:

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

详解Docker的网络模式之host模式(host网络模式)相关推荐

  1. 详解Docker的基本原理与实践操作

    详解Docker的基本原理与实践操作,Web时代,应用变得越来越强大,与此同时也越来越复杂.集群部署.隔离环境.灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁. 本文我们就来探索Docke ...

  2. Docker的mysql镜像_详解docker下的Mysql镜像的使用方法

    通常初学者学习docker时,不太清楚怎样拉取一个Mysql镜像并使用,今天这篇文章简单介绍一下使用流程. 一.预习一下用到的docker命令: 1.docker images 列出本地主机上的镜像. ...

  3. 详解docker容器的资源监控方案

    docker资源的监控方案 如何监控docker容器整体的资源利用率呢?如何监控独立docker容器的资源利用率呢? 先说结论:前者用kubesphere或者rancher(大厂都是自己搞的监控系统) ...

  4. 详解rsync算法--如何减少同步文件时的网络传输量

    详解rsync算法--如何减少同步文件时的网络传输量 先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A.B和server上的文件内容都是相同的(记为File.1).某 ...

  5. docker多个容器一起打包_详解Docker 容器基础系统镜像打包

    因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Li ...

  6. 详解23种设计模式(基于Java)—— 结构型模式(三 / 五)

    目录 3.结构型模式(7种) 3.1.代理模式 3.1.1.概述 3.1.2.结构 3.1.3.静态代理 3.1.4.JDK动态代理 3.1.5.CGLIB动态代理 3.1.6.三种代理的对比 3.1 ...

  7. 一文详解Docker 代理脱坑

    本文转载自:一文详解Docker 代理脱坑 Docker 代理配置 由于公司 Lab 服务器无法正常访问公网,想要下载一些外部依赖包需要配置公司的内部代理.Docker 也是同理,想要访问公网需要配置 ...

  8. 26-Docker-常用命令详解-docker rmi

    常用命令详解-docker rmi 前言 docker rmi 语法格式 options说明 使用示例 删除镜像,且不带 tag 删除镜像,且带 tag 根据镜像ID,强制删除镜像 删除多个镜像 删除 ...

  9. 万字详解Docker架构原理、功能及使用

    一.简介 1.了解Docker的前生LXC LXC为Linux Container的简写.可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性.相当于C++中 ...

  10. 太全了|万字详解Docker架构原理、功能及使用(送书)

    点击上方"民工哥技术之路"选择"置顶或星标" 每天10点为你分享不一样的干货 一.简介 1.了解Docker的前生LXC LXC为Linux Container ...

最新文章

  1. zookeeper 集群安装
  2. 在ASP.NET下实现数字和字符相混合的验证码
  3. python画误差棒/带
  4. u-boot支持LCD显示(基于TQ2440)
  5. 计算机专业论文关于天气预报的,关于天气预报论文范文写作 天气预报相关论文写作资料...
  6. 亚马逊上海人工智能研究院:深度图模型实习生
  7. ARM公司的Cortex-M0概况介绍
  8. java之list均分
  9. 【Transformer】10个重要问题概览Transformer全部内容
  10. SQL Pass北京举办第六次线下活动,欢迎报名
  11. 计算机基础中的函数,《计算机基础》中EXCEL函数的简单使用综述
  12. 全新AIY Edge TPU开发板惊艳亮相,今秋发布!
  13. aria2 txt导入_使用Aria2完成下载任务
  14. 记-玩吧-一次失败的面试
  15. calcite连接mysql_如何使用Calcite实现一个简单的数据库
  16. Mysql中使用关键字name做字段名
  17. 怎么windows设置qq邮箱服务器,电脑中如何添加QQ邮箱到Windows Live Mail
  18. java内存分析详解_深入java内存查看与分析详解
  19. 【知识小集】☞Excel之VBA编程语句集300句
  20. 韩国三星android多少钱,韩国首款安卓翻盖 三星GALAXY GOLDEN赏

热门文章

  1. 服务器删除的excel文件备份在哪里,excel自动备份文件在哪!如何找回EXCEL表格已删除的文件...
  2. 详解VLAN与划分广播域
  3. sql注入实验二 ——合天网安实验室学习笔记
  4. 2021-09-21用pyecharts做全球各个国家的gdp色彩深度图
  5. 头条 上传图片大小_无锡抖音巨量运营培训南天值得选择——鹰手营子矿头条...
  6. 【有利可图网】PS实战教程55:打破次元壁,将照片从三次元跨越到二次元
  7. BZOJ 5336: [TJOI2018]party Dp套Dp
  8. 电脑公司Windows7_X86旗舰版V0911
  9. 修改Oracle系统管理员密码
  10. 睡眠 应该用 a加权 c加权_困成狗?谈谈睡眠研究的遗传发现之旅