一、bridge网络

1.创建一个测试容器
[root@localhost ~]# docker run -d -it --name busybox_1 busybox /bin/sh -c "while true;do sleep 3600;done"
03b308c847edd23f21ba69afb825d92f7aaeb05b1ff4431dd47ccee439a0361a

2.查看当前机器docker有哪些网络
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
fa30a4d17b5b        bridge              bridge              local
a03aaca35833        host                host                local
d85c50eb947c        none                null                local

3.查看bridge详细信息(如果没有指定网络,默认使用bridge网络)
[root@localhost ~]# docker network inspect fa30a4d17b5b  #fa30a4d17b5b  为bridge的ID
....."Containers": {                    #该字段表示名称为busybox_1的Container网络连接到的是bridge这个网络"03b308c847edd23f21ba69afb825d92f7aaeb05b1ff4431dd47ccee439a0361a": {  #容器的ID"Name": "busybox_1",        #容器的名称"EndpointID": "c850f22941894ef8655a80a96e4be4c5045699b70b4bc17201f80f07a27a3b4d","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16",  #地址"IPv6Address": ""}},
......

4.查看宿主机及容器busybox_1这个容器的网络接口,其中宿主机的veth66a7ab0@if110与容器中的eth0@if111网络接口实际上是一对pari,而veth66a7ab0@if110又连接到docker0上
[root@localhost ~]# ip a   #查看宿主网络接口
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 52:54:00:fd:34:4b brd ff:ff:ff:ff:ff:ffinet 172.16.150.135/24 brd 172.16.150.255 scope global eth0valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:23:c0:91:f9 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 scope global docker0valid_lft forever preferred_lft forever
111: veth66a7ab0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 7e:59:81:8b:54:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0[root@localhost ~]# docker exec busybox_1  ip a  #查看busybox_1容器的网络接口
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
110: eth0@if111: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever

5.验证veth66a7ab0网络与docker0相连接
[root@localhost ~]# brctl show   #如果没有该命令,yum安装 bridge-utils软件包即可
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024223c091f9    no        veth66a7ab0

6.创建第二测试容器
[root@localhost ~]# docker run -d -it --name busybox_2 busybox /bin/sh -c "while true;do sleep 3600;done"
b884db0bf4a862281b1dfb66457c7f565896fce1a40151619e80c2c5b1499216

7.再次查看bridge网络信息
[root@localhost ~]# docker network  inspect  bridge
......      "Containers": {"03b308c847edd23f21ba69afb825d92f7aaeb05b1ff4431dd47ccee439a0361a": {"Name": "busybox_1","EndpointID": "c850f22941894ef8655a80a96e4be4c5045699b70b4bc17201f80f07a27a3b4d","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""},"b884db0bf4a862281b1dfb66457c7f565896fce1a40151619e80c2c5b1499216": {"Name": "busybox_2",  #busybox_2 也连接到bridge"EndpointID": "a5e56917165daf2965bf7f24cf9ce58c88e4ff3c1118544c49ca5f25172af28d","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""}},
......

8.查看本地网络接口,发现多了113: vethc039e93@if112
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 52:54:00:fd:34:4b brd ff:ff:ff:ff:ff:ffinet 172.16.150.135/24 brd 172.16.150.255 scope global eth0valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:23:c0:91:f9 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 scope global docker0valid_lft forever preferred_lft forever
111: veth66a7ab0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 7e:59:81:8b:54:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
113: vethc039e93@if112: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether ea:a2:a8:dc:48:78 brd ff:ff:ff:ff:ff:ff link-netnsid 1

9.查看bridge网络信息,发现docker0连接率两个接口了
[root@localhost ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024223c091f9    no        veth66a7ab0vethc039e93

简单拓扑图:
总结:实质上docker容器之间通过与docker0接口连接.实现先互直接通信,感觉有点像交换机?
10.docker访问公网简单拓扑图

小结:实质上docker访问公网网络通过docker0 NAT转发实现

二、host网络

1.查看当前服务端口
[root@localhost ~]# netstat -tnlp  #除了sshd,没有其他服务端口
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      965/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      965/sshd    

2.创建一个测试容器,指定使用host网络
[root@localhost ~]# docker run  -d --privileged --name my_centos  --network host  docker.io/centos /usr/sbin/init  #建议使用centos镜像,后续测试需要
cfb8d105dcb44947ce794d890b67c905df9aa1ba67ef2675fd1a51177d47835d

3.查看host网络信息(注意容器的网络信息)
[root@localhost ~]# docker network inspect host
......"Containers": {"cfb8d105dcb44947ce794d890b67c905df9aa1ba67ef2675fd1a51177d47835d": {"Name": "my_centos","EndpointID": "4250d74b28f8125688bd7d0f1475a7d107135c0e87367a9c35c197fd981b7cd4","MacAddress": "",   #可以看到我们创建的容器此时并没有Mac和IP地址"IPv4Address": "","IPv6Address": ""}......

4.进入容器内部,查看网络信息
[root@localhost ~]# docker exec -it my_centos /bin/bash
[root@localhost /]# ip a    #默认没有相关查看命令
bash: ip: command not found
[root@localhost /]# ifconfig
bash: ifconfig: command not found
[root@localhost /]# yum install net-tools -y  #我们yum安装(是不是很奇怪,没有网络地址怎么安装)
[root@localhost /]# ifconfig    #内容太多不粘了,但是显示的应该是当前宿主机的网络信息
[root@localhost /]# netstat -tnlp
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      -
tcp6       0      0 :::22                   :::*                    LISTEN      -   

5.在容器总安装httpd服务器,并启动
[root@localhost /]# yum install httpd -y
[root@localhost /]# systemctl restart httpd
[root@localhost /]# netstat -tnlp  #发现多了80端口
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:80              0.0.0.0:*               LISTEN      1305/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -   

6.退出容器,在宿主机上查看当前网络连接
[root@localhost ~]# netstat -tnlp #宿主机上80端口也被开放了
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:80              0.0.0.0:*               LISTEN      7032/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      965/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      965/sshd   

7.对于host模式的思考:

host模式下是怎么占领端口的?

host模式端口占用模式是你的容器占用你主机上当前所监听的端口(官网描述为publish),比如我们都知道Nginx占用80端口,那么当我们用host模式启动的时候,主机上的80端口会被Nginx占用,这个时候其他的容器就不能指定我们的8080端口了,但是可以指定其他端口,所以说一台主机上可以运行多个host模式的容器,只要彼此监听的端口不一样就行。

host模式下使用-p或者-P会出现WARNING: Published ports are discarded when using host network mode

当你是host模式的时候,主机会自动把他上面的端口分配给容器,这个时候使用-p或者-P是无用的。但是还是可以在Dockerfile中声明EXPOSE端口

host模式设计的原因

host模式设计出来就是为了性能,访问主机的端口就能访问到我们的容器,使容器直接暴露在公网下,但是这却对docker的隔离性造成了破坏,使得安全性大大降低。这种模式有利有弊,对于每个人来说看法都不一样,具体取舍看个人。

三、none网络

1.创建一个测试容器
[root@localhost ~]#  docker run -d --name test1 --network none busybox  /bin/sh -c "while true;do sleep 36000;done"
ca1771ebfe436137156568cd570c116d12bd85e782dbec365c9f62a70209d028

2.查看none网络信息
[root@localhost ~]# docker network inspect none
......"Containers": {"ca1771ebfe436137156568cd570c116d12bd85e782dbec365c9f62a70209d028": {"Name": "test1",  #容器无法看到Mac和IP地址"EndpointID": "ddcff44cdedb78f59108c6978345a256baa8bb09965461b2ffac58d5334fdba6","MacAddress": "","IPv4Address": "","IPv6Address": ""}
......

3.进入容器查看网络信息
[root@localhost ~]# docker exec -it test1 /bin/sh
/ # ip a           #只有回环接口
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever

 小结:none 网络的容器只有一个自己的回环接口,没有任何 IP 地址分配,所有这个网络中的每个容器都是孤立的。但是所有网络配置我们都可以自己配置,如IP、网卡等

转载于:https://www.cnblogs.com/panwenbin-logs/p/11171379.html

docke网络之bridge、host、none相关推荐

  1. Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    前言 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍容器网络模式, 属于了解范畴,充分了容器的网络模式,更有助于更好的理解Docker的容器之间的访问逻辑. 疑问:为什么要了解容器 ...

  2. vmware中的网络(bridge,nat)(转载)

    vmware中的网络(bridge,nat)(转载) vmware中的网络(bridge,nat) 概述: VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式 ...

  3. KVM的NAT网络和bridge网络安装

    KVM的安装使用 安装前准备 NAT网络 第一大步:安装相关包 第二大步:创建磁盘 第三大步:安装配置 第四大步:进入管理端 点左上角1的部分,查看ip 创建bridge网络虚拟机 安装前准备 实验目 ...

  4. Dockerfile精编细作(六)四种网络模式bridge、host、container、none

    查看网卡信息 查看ip信息:centos7:ip add或ip addr lo:localhost网卡 ens33:对外网卡以太网,本机ip docker0:docker容器和宿主机通信的网卡,Doc ...

  5. Docker学习总结(21)——Docke网络bridge详解

    Docker 安装时会创建一个 命名为 docker0的 linux bridge.如果不指定--network,创建的容器默认都会挂到docker0上. 当前 docker0 上没有任何其他网络设备 ...

  6. 【华为云技术分享】《跟唐老师学习云网络》 - Bridge网桥

    [摘要] 跟唐老师学习云网络,已经进入到虚拟化的世界啦.Bridge是网络虚拟化中非常重要的一种设备,快来一起学习Linux-Bridge的作用吧. 一.什么是Linux-Bridge 咱们直接说人话 ...

  7. Docker网络之bridge网络

    bridge网络相当于用软件的方法在宿主机内部虚拟一个交换机,它是一个二层网络设备.在一台宿主机内可以创建多个bridge,连接在同一bridge上的容器可以直接通信,连接在不同bridge上的容器不 ...

  8. linux命令(9)——网络配置 修改host文件

    service network restart  重启网络 修改主机的host文件: 需要管理员权限:su sodo 一下 之后vim /etc/hosts ping 一下hadoop就会全部出来了.

  9. docker网络模式之 host模式

    如果为一个容器的网络模式 指定主机模式,则该容器的网络堆栈不与docker主机隔离,也即容器网络直接使用主机网络,例如,你运行一个容器,绑定了端口80,同时使用 host  网络,那么容器应用程序的8 ...

  10. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

最新文章

  1. Python游戏开发pygame模块,Python实现球球碰撞小游戏
  2. 系统linux/redhat6.5 zabbix 2.47监控nginx1.8.0 (下)
  3. Webservice开发之xsd文件示例代码
  4. 剑指offer第二版-9.用两个栈实现队列
  5. SDN 作业提示器(持续更新)
  6. socket网络编程——套接字地址结构
  7. offsetTop测试见解
  8. java查询比对是否重复_java-对象的ArrayList,比较对象并查找重复项,...
  9. 不仅有骁龙8 Plus!摩托罗拉新旗舰还要抢首发2亿像素
  10. 【渝粤教育】广东开放大学 环境与资源保护法 形成性考核 (56)
  11. 【Python爬虫】新手入门案例教学(一):爬取豆瓣电影排行有关信息
  12. 展望:2021年程序员业界趋势与生存指南
  13. 如何提升公众号关注率,让用户看完文章关注你
  14. STM32用ST-link下载程序
  15. 20-Django REST framework-Serializer序列化器
  16. JSON-LIB 的使用指南
  17. Oracle Namespace 说明
  18. Linux Oracle dbf文件误删 恢复操作
  19. RFC系列协议--rfc2373--IP Version 6 Addressing Architecture
  20. [轻笔记]蛙跳积分法

热门文章

  1. 学计算机物理去戴维斯还是伦斯勒理工学院好,为什么伦斯勒理工学院评价那么高?...
  2. android pm 列出权限,Android pm命令
  3. Simon写作翻转课笔记
  4. 2020 第一周工作总结:TAGE分支预测器算法
  5. WIN系统仿MAC任务栏工具分享——RocketDock
  6. 3.关联查询和属性文件
  7. mm struct与pgd
  8. 屏幕缩放和注释工具(ZoomIt)
  9. 技术人人都是好的需求评审专家- 如何需求评审,需求评审评什么.
  10. 使用Layer弹窗时遇到Layer.Close()后dom元素延迟性销毁的问题 @Gyb