docker网络官网 https://docs.docker.com/network/

  Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或将它们连接到非Docker工作负载。Docker容器和服务甚至不需要知道它们已部署在Docker上,也不必知道它们的对等对象是否也是Docker工作负载。无论您的Docker主机运行Linux,Windows还是两者结合,您都可以使用Docker以与平台无关的方式管理它们。

计算机网络模型:

  根据网络的七层模型 以及四层模型来看,最后数据的传输都是基于基础层之上,也就是说两台机器的数据传输需要通过数据链路层进行网络传输,而这一切的功劳得归属于网卡。没有网卡是做不到的。

Linux中网卡:

  要了解 Docker网络。我们先来看看基于 Linux 系统的网卡的信息,查看网卡[网络接口]:

ip link show
ls /sys/class/net
ip a

  以上三个命令均是查看网卡的信息,我们来看一下 ip a 所展示出来的网卡信息有哪些?

  我们可以看到网卡的基本信息例如当前网卡的状态(UP/DOWN/UNKOWN等),Mac地址(link/ether),IP地址(inet)。

  在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可 比如:cat /etc/sysconfig/network-scripts/ifcfg-ens33 。当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试

ip addr add 192.168.1.102/ dev ens33  添加网卡绑定IP地址

  然后我们就可以通过 ip a 来查看:

  然后我们也可以删除它:

ip addr delete 192.168.1.102/ dev ens33

  网卡的启动与关闭:

重启网卡 :service network restart / systemctl restart network
启动/关闭某个网卡 :ifup/ifdown ens33 or ip link set ens33 up/down

Network Namespace 实战:

  之前我们提到Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自定义容器格式,从而提供一套虚拟运行环境。而Namespace用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等。

  在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的。

ip netns list:查看当前机器上的network namespace
ip netns add ns1   #添加
ip netns delete ns1 #删除

  接下去我们来熟悉一下 Linux 的Namespace的简单操作,以便之后更加容易的理解Docker的网络。

1.创建一个network namespace:ip netns add ns1

2.查看该namespace下网卡的情况:ip netns exec ns1 ip a 。可以看到刚刚创建出来的 Namespace 的网卡信息是这样的:

3.启动ns1上的lo网卡 : ip netns exec ns1 ifup lo   or   ip netns exec ns1 ip link set lo up.再查看其网卡信息

4.再次创建一个network namespace:ip netns add ns2 然后也将其lo网卡启动:

  那么现在本台宿主机上有两个 network namespace ,分别是 ns1 与 ns2 ,此时此刻这两个网络之间是无法通信的:

  此时想让两个namespace网络连通起来有什么办法呢?在Linux中有一种技术 veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能。

1.创建一对link,也就是接下来要通过veth pair连接的link :ip link add veth-ns1 type veth peer name veth-ns2 。这个命令就是添加一对veth pair,即 veth-ns1 与 veth-ns2 是一对。

2.查看 link 情况 :ip link:

3.将veth-ns1加入ns1中,将veth-ns2加入ns2中:

ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2

4.查看宿主机和ns1,ns2的link情况,可以发现这个pair对已经分配到了指定的 namespace了:

5.此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件,为其添加IP:

ip netns exec ns1 ip addr add 192.168.1.11/ dev veth-ns1
ip netns exec ns2 ip addr add 192.168.1.12/ dev veth-ns2

6.启动veth-ns1和veth-ns2:

ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up

7.然后查看这两个网卡的信息:

8.此时两个network namespace互相ping一下,发现是可以ping通的:

  这就是我们对 network namespace 的基本认识。

Container 的 network namespace:

  按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入到容器中进行验证.

1.不妨创建两个container看看?

docker run -d --name tomcat01 -p : tomcat
docker run -d --name tomcat02 -p : tomcat

2.进入到两个容器中,并且查看ip.互相ping一下是可以ping通的.因为他们在一个网段。

  值得我们思考的是,此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的?有些小伙伴可能会想,不就跟上面的namespace实战一样吗?注意这里并没有veth-pair技术。

深入分析container网络-Bridge:

1.docker0默认bridge,查看centos的网络:ip a,可以发现,重点看跟docker有关系的3个网卡:

2.查看容器tomcat01的网络:docker exec -it tomcat01 ip a,可以发现:

3.在centos中ping一下tomcat01的网络,发现可以ping通。

  既然可以ping通,而且centos和tomcat1又属于不同的network namespace,是怎么连接的?很显然,跟之前的实战是一样的,画个图:

  也就是说,在tomcat01中有一个 eth0 和 centos 的 docker0 中有一个vetha4 是成对的,类似于之前实战中的veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl。安装一下:yum install bridge-utils.我们可以看到docker0下有两个接口,即就是tomcat01-02里面的网卡接口。

  那为什么tomcat01和tomcat02能ping通呢?不多说,直接上图:

  这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:docker network ls 。bridge也是docker中默认的网络模式:

  可以看到有三种类型的网络模式: bridge , host ,none。还有一种多机通讯的 overlay 。

  不妨检查一下bridge:docker network inspect bridge :

  在tomcat01容器中是可以访问互联网的,顺便把这张图画一下咯,NAT是通过iptables实现的:

创建自己的network( 类型:bridge ):

1.创建一个network,类型为bridge

docker network create tomcat-net
or
docker network create --subnet=172.19.0.0/ tomcat-net

2.查看已有的network:docker network ls

3.查看tomcat-net详情信息:docker network inspect tomcat-net

4.创建tomcat的容器,并且指定使用tomcat-net : docker run -d --name custom-net-tomcat --network tomcat-net tomcat

5.查看custom-net-tomcat的网络信息 :  docker exec -it custom-net-tomcat ip a

6.此时在custom-net-tomcat容器中ping一下tomcat01的ip会如何?发现无法ping通

  而此时此刻整个 Network Namespace 是这样的:

7.此时如果tomcat01容器能够连接到tomcat-net上应该就可以:执行 docker network connect tomcat-net tomcat01

8.查看tomcat-net详情信息:docker network inspect tomcat-net

  再看看 tomcat01的网卡状态:

  此时进入到tomcat01或者custom-net-tomcat中,不仅可以通过ip地址ping通,而且可以通过名字ping到,这时候因为都连接到了用户自定义的tomcat-net bridge上 (但是ping tomcat02是不通的)

  但是如果实在默认的 docker0 的网络中 ,通过 ping +容器名是不会通的,想要通就要在创建容器的时候加上参数  --link  +容器名,且该命令是单向的。不推荐在生产上这么做,推荐用自定义network。

Container网络Host:

1.创建一个tomcat容器,并且指定网络为host :docker run -d --name my-tomcat-host --network host tomcat

2.查看ip地址 :docker exec -it my-tomcat-host ip a  可以发现和centos是一样的:

3.检查host网络:docker network inspect host

Container网络 None :

1.创建一个tomcat容器,并且指定网络为none: docker run -d --name my-tomcat-none --network none tomcat

2.查看ip地址 :docker exec -it my-tomcat-none ip a .会发现他是与世隔绝的一种模式

端口映射:

  端口映射也是解决docker 网络通讯的手段之一。比如我们在创建容器的时候指定映射端口:

docker run -d --name port-tomcat -p : tomcat

  这样子就可以通过宿主机的IP加8090端口访问到容器。

Docker网络大揭秘(单机)的更多相关文章

  1. 5、Docker网络配置(单机)

    一.概述 以下内容参考:https://docs.docker.com/network/#network-drivers Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连 ...

  2. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  3. Docker网络解决方案-Flannel(转)

    转自https://www.cnblogs.com/kevingrace/p/6859114.html Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Ope ...

  4. 深入解读docker网络与kubernetes网络

    前言:你是否学习使用k8s很久很久了可是对于网络这块仍旧似懂非懂呢? 您是否对网上一堆帖子有如下的抱怨: 打开多个博客,然后发现有区别么? 明显是直译过来的,越看越迷糊 “因为xxx,所以yyy”,. ...

  5. Docker 网络详解及 pipework 源码解读与实践

    转载自:https://www.infoq.cn/article/docker-network-and-pipework-open-source-explanation-practice/ Docke ...

  6. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  7. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  8. 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

    原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...

  9. docker网络解析

    Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...

随机推荐

  1. node.js模块中exports和module.exports的区别

    Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...

  2. Java面试之框架篇(9)

    spring现在无疑是Java中最火的框架,使用范围广,几乎每个公司面试都会涉及spring和数据库,你可以对Struts不熟悉,但一定不能表现出对spring不了解.第九篇赢在面试全篇介绍sprin ...

  3. 实验 5 Spark SQL 编程初级实践

    实验 5  Spark SQL 编程初级实践    参考厦门大学林子雨 1. Spark SQL 基本操作 将下列 json 数据复制到你的 ubuntu 系统/usr/local/spark 下,并 ...

  4. 10.django的一些方法理解

    django get_object_or_404 get_object_or_404是django的django shortcuts的方法,用来查询数据,或者抛出一个DoesNotExist的异常 用 ...

  5. luogu P1083 借教室 x

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  6. CF191C Fools and Roads - 树剖解法

    Codeforces Round #121 (Div. 1) C. Fools and Roads time limit per test :2 seconds memory limit per te ...

  7. OI多项式 简单学习笔记

    咕咕咕 先开个坑(其实是存模板来了) 一些特别简单的前置东西qwq 复数的计算 复数相加:向量相加,复数相乘.复数相乘:模长相乘,旋转量相加(就是复平面坐标轴逆时针旋转的角度) (当然也可以直接使用c ...

  8. sh_08_打印小星星

    sh_08_打印小星星 # 在控制台连续输出五行 *,每一行星号的数量依次递增 # * # ** # *** # **** # ***** # 1. 定义一个计数器变量,从数字1开始,循环会比较方便 ...

  9. 【Mark】博弈类题目小结(HDU,POJ,ZOJ)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...

  10. Jmeter -- 参数化(函数助手和CSV数据文件配置)

    使用场景: 例如:模拟多用户登陆时 参数化两种方式: 方式一:使用函数助手 1. 创建包含多个登录名和密码的文件 可以在文本编辑器中输入,格式如下: username,passwordusername ...