docker深入

一、本机出现的docker网桥问题

源于自己需要在一个linux中,使用容器搭建一个flink集群环境
【问题背景】
在已有的image上,运行3个不同的容器,然后对3个容器进行通信,需要了解docker网络的机制问题

【问题出现】
无意中看到了ip addr,看到有几个莫名的网络网桥出现
网络深入 - 图1

网络深入 - 图2

【概念】
虚拟网桥
bridge模式是Docker默认的网络配置,会为每一个容器分配Network命名空间、设置IP地址等。

Docker启动时,自动在主机上创建虚拟网桥docker0并随机分配一个本地空闲私有网段的一个地址给docker0接口。
虚拟网桥docker0在内核层连通了其他的物理或虚拟网卡,将所有容器和本地主机都放到同一个网络。
docker0接口的默认配置包含了IP地址、子网掩码等,可以在docker服务启动的时候进行自定义配置。
【本机状态】查看docker 配置的网卡
网络深入 - 图3
【知识点】docker内部默认的网络配置机制
网络深入 - 图4

查看docker网络状态
网络深入 - 图5

网络深入 - 图6

Bridge是容器启动的默认网络模式
当创建一个Docker容器时,容器会自动获得Bridge网段的一个空闲IP地址,并使用docker0接口的IP地址作为容器的默认网关,从而建立了主机和容器之间的一个虚拟共享网络。
主机可以跟容器通信,容器之间也可以相互通信。
容器通过docker0网桥以nat方式连接外网,外网通过端口映射(-p参数)连接到容器。

【参考链接】https://www.cnblogs.com/anliven/p/6804496.html

【验证猜想】
1、如果容器中是通过主机进行nat访问外界网络,那么我现在在容器内
exec –it bash
ping www.baidu.com

2、是不是可以访问?
如果可以:确实容器内可以访问外部
否则:容器内不能访问网络

【实践过程记录】
1、选择nginx的容器进行访问
2、ping www.baidu.com,没有ping命令
3、更新apt-get update
4、安装iputils-ping
5、ping www.baidu.com
网络深入 - 图7
【结论】:容器内部的镜像容器可以访问外部网络,借助的是linux101的网卡

路径:容器1(mysql)-> linux1 (hadoop101) -> 主机 -> 百度
nat -> 桥接 -> 外网访问

【说明】
其实docker内部是一个linux,ubuntu版本的,不是centos的
网络深入 - 图8

二、深入理解docker网络问题

2.1 问题

【回到本来的问题:docker内部的两个容器怎么通信呢?】
网络深入 - 图9
先看看外部访问docker内部的容器
网络深入 - 图10

docker的三种网络模式

  • bridge
  • none
  • host

    2.2 虚拟机网络知识

    【打断-插入知识点】
    虚拟机的网络配置NAT
    网络深入 - 图11
    【理解】记住nat的本质,只是一个虚拟的网络,实际和外界联系的一直是主机原来的网络
    桥接模式
    网络深入 - 图12
    【相关指令】
    网络深入 - 图13

2.3 docker实战网络部分

【继续】
【本次操作实战】
1、在容器没有启动时,是没有docker网卡的
网络深入 - 图14

2、查看虚拟机本机的网卡情况
网络深入 - 图15
发现也只有自己自带的3个网卡(2+1docker0)

2.3.1 安装部署docker容器

【准备条件】
安装docker
docker拥有mysql:least镜像

【命令】启动两个tomcat
docker run -d —name tomcat002 -p 8092:8080 tomcat
docker run -d —name tomcat001 -p 8091:8080 tomcat
docker ps
网络深入 - 图16

【查看网络情况】
网络深入 - 图17
【进入bridge模式进行查看】
网络深入 - 图18
查看刚刚启动的容器的ip

【分别进入到容器中查看网卡】
网络深入 - 图19

可见确实分配了网卡

【进入到两个内部进行互相通信】
网络深入 - 图20
tomcat1和tomcat2能够通信

2.3.2 桥接模式

网络深入 - 图21
由于容器是使用桥接模式,每个启动的容器都有一个网卡,而这个网卡连接到docker0中,对于宿主机中,也需要有两个对应的网卡进行对应
网络深入 - 图22

上面已经验证,桥接模式容器可以互相访问

【容器是否能够访问外网】
docker exec -it tomcat001 curl -I http://www.baidu.com
网络深入 - 图23

【查看单个容器的网卡】docker inspect tomcat001
网络深入 - 图24

网络深入 - 图25

2.3.3 host模式

网络深入 - 图26
【采用host方式创建新的容器】
docker run –d –name tomcat-host –network host tomcat
网络深入 - 图27
查看docker network inspect host
网络深入 - 图28
网络深入 - 图29
host模式没有分配网络ip和网关

【查看docker中tomcat-host容器的网卡】
显示和主机的网卡一模一样
网络深入 - 图30

host模式下只能启用一个主机,因为宿主机只有一个ip
网络深入 - 图31

docker ps –a
查看所有容器(包括停止的)

2.3.4 none模式

创建none网络的容器
网络深入 - 图32
查看网络情况
网络深入 - 图33

2.3.5 自定义网络实现

自定义网络进行连接(默认为bridge)
网络深入 - 图34
查看网络状态
网络深入 - 图35
【创建新的网络】docker network create custom
网络深入 - 图36
【查看custom网络情况】分配给的是172.18.0.0子网网段
网络深入 - 图37
【基于自定义网络,运行一个tomcat服务器】
网络深入 - 图38
【查看tomcat服务器的网络情况】
网络深入 - 图39
【用自定义网络的tomcat服务器和之前的tomcat服务器进行通信】
通信失败,因为不在一个网段中
网络深入 - 图40

【将两个不同的网段的网络进行联通】
docker network connect custom tomcat001
网络深入 - 图41
【查看custom网络中的情况】加入了一个不同网段的网络
这个新加的是在custom中加入的
网络深入 - 图42
【对应的也在tomcat001中加了一个对应的网卡】
网络深入 - 图43
对应出现
网络深入 - 图44
【两者可以互相连通】
网络深入 - 图45

三、docker数据存储

网络深入 - 图46