一、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   #查看宿主网络接口
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :::fd::4b brd ff:ff:ff:ff:ff:ff
inet 172.16.150.135/ brd 172.16.150.255 scope global eth0
valid_lft forever preferred_lft forever
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default
link/ether :::c0::f9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ scope global docker0
valid_lft forever preferred_lft forever
: veth66a7ab0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master docker0 state UP group default
link/ether 7e:::8b::a2 brd ff:ff:ff:ff:ff:ff link-netnsid [root@localhost ~]# docker exec busybox_1 ip a #查看busybox_1容器的网络接口
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0@if111: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/ scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80:::acff:fe11:/ 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 .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
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :::fd::4b brd ff:ff:ff:ff:ff:ff
inet 172.16.150.135/ brd 172.16.150.255 scope global eth0
valid_lft forever preferred_lft forever
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default
link/ether :::c0::f9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ scope global docker0
valid_lft forever preferred_lft forever
: veth66a7ab0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master docker0 state UP group default
link/ether 7e:::8b::a2 brd ff:ff:ff:ff:ff:ff link-netnsid
: vethc039e93@if112: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master docker0 state UP group default
link/ether ea:a2:a8:dc:: brd ff:ff:ff:ff:ff:ff link-netnsid
9.查看bridge网络信息,发现docker0连接率两个接口了
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 .024223c091f9 no veth66a7ab0
vethc039e93
简单拓扑图:
总结:实质上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.0.0:* LISTEN /sshd
tcp6 ::: :::* LISTEN /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.0.0:* LISTEN -
tcp6 ::: :::* 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.0.0:* LISTEN /httpd
tcp 0.0.0.0: 0.0.0.0:* LISTEN -
tcp6 ::: :::* 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.0.0:* LISTEN /httpd
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp6 ::: :::* LISTEN /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 #只有回环接口
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever

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

docke网络之bridge、host、none的更多相关文章

  1. docker网络之bridge

    建议阅读本文章之前了解一下文章,本文不作bridge的基本介绍 https://blog.csdn.net/u014027051/article/details/53908878/ http://wi ...

  2. VirtualBox的网络配置,Host Only+NAT方式 (zhuan)

    http://blog.csdn.net/xinghun_4/article/details/7969894 ***************************************** 其实网 ...

  3. 主机网络ping: unknown host baidu.com问题解决

    本机环境: 系统:Centos 网络:NAT 虚拟机之前一直都可以连外网,但最近不能连了,现状如下: [root@vhost03 ~]# ping baidu.comping: unknown hos ...

  4. VirtualBox的网络配置,Host Only+NAT方式

    其实网络这类相关的文章很多,我只是想结合自己的实际情况,把我的经验写下来,给那些需要的人们吧. 主机:windows xp 虚拟机:ubuntu 10.10 Virtualbox:4.0.2 虚拟机在 ...

  5. docker从零开始网络(四 ) host网络

    使用主机网络 如果host对容器使用网络驱动程序,则该容器的网络堆栈不会与Docker主机隔离.例如,如果您运行绑定到端口80 host的容器并使用网络,则容器的应用程序将在主机IP地址的端口80上可 ...

  6. Windows虚拟机共享公司网络给Linux host

    前两天写了一个Linux主机通过windows虚拟机上网的随笔,实话说功能有点弱,比如22端口的转发都没有.实际上还有一个更简单且功能更强的共享方法(不需要安装ccproxy). https://ww ...

  7. 北桥芯片(north bridge/host bridge)

    看下上面的图,会比较清晰的认识到北桥芯片所在位置 北桥芯片(North Bridge) 是mother board chipset(主板芯片组) 中起主导作用的最重要的组成部分,也称为主桥(Host ...

  8. docke 网络配置

    一,docker 的bridge模式是和vmware中的nat模式类似的,但是如果想要弄成和vmwae中的bridge怎么办呢? 说明,bridge模式获取的Ip是与宿主机的ip是出于同一个网段的. ...

  9. docke 网络配置2

    一,docker 的bridge模式是和vmware中的nat模式类似的,但是如果想要弄成和vmwae中的bridge怎么办呢? 说明,bridge模式获取的Ip是与宿主机的ip是出于同一个网段的. ...

随机推荐

  1. 通过MES技术居然可以防止制造数据造假?

    近些年来我们经历了太多制造数据造假事件,特别是前段时间曝出的医药制造事件更是将我们群众的愤怒值推到了最高点.不过我们最应当做的是,冷静下来,思考一下各行各业的我们是不是都该做些什么了?毕竟当下一个灾难 ...

  2. 车间如何数字化?MES系统来助力

    对于生产过程复杂多变的离散制造企业而言,面临重重考验:生产作业计划频繁变更,制造工艺复杂,在生产过程中的临时插单.材料短缺等现象.通过MES制造执行管理解决方案,搭建协同管理平台,加强控制力.执行力和 ...

  3. QString判断空 isEmpty

    isEmpty Returns true if the string has no characters; otherwise returns false. QString().isEmpty(); ...

  4. Xml格式数据转map工具类

    前言[ 最近在写一个业务,由于调UPS物流的接口返回的是一个xml格式的数据结果,我现在要拿到xml中某个节点的值,而这个xml数据是多节点多层级的,并且这某个节点的值有可能只有一条值,有可能有多条, ...

  5. element-ui的form表单样式改动

    造成下面样式错乱是下面自带的css样式,原本打算通过样式重写在组件内的style,发现下面相应的元素是出于封装情况的,无论样式重写在组件还是在公共样式均不能很好的解决,因为跳转到该页面时都要刷新一次, ...

  6. day04 作业

    一.简述Python的五大数据类型的作用.定义方式.使用方法: 数字类型 整型 作用:描述年龄 定义方式: x = 10 y = int('10') 使用方法: + - * / % // ** 如果需 ...

  7. Confluence 邮箱设置

    Confluence有两种方法设置邮箱 原理: confluence服务器配置好邮箱信息,用户触发邮件发送规则时,confluence服务使用已配置的邮箱信息登录到邮箱服务器,进行发件服务. 那么我们 ...

  8. Rust中的Cargo工作空间实践

    这是为了开发大型程序,分治crate用的. 目录结构如下: 一,根cargo.toml内容 [workspace] members = [ "adder", "add-o ...

  9. c# 第五节 第一个控制台程序、第一个桌面、快捷键、注释

    本节内容: 1:控制台程序的创建 2:第一个桌面程序 3:快捷键 4:注释 一.第一个控制台程序: 这就是控制台程序: 打开你的vs2015,按如下操作 二.第一个桌面程序 比如当我们删除一个东西会弹 ...

  10. 201777010217-金云馨《面向对象程序设计(Java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...