一、什么是docker,docker的概念

Docker是一个用Go语言开发的一个开源容器引擎,开发时可以让开发者很方便将他们的应用以及依赖包和当前的容器中环境打包到一个轻量级、可以移植的容器中,然后发布到任何流行Linux系统上,只要该系统也安装了docker,那么就可以对该开发者环境进行还原;在容器和容器之间不会有任何的接口,更重要的是容器性能开销非常低,并且对分配到的资源可以最大限度的利用到。

二、docker中的镜像

docker中的镜像是只读的,它是创建容器的基础,类似于VMware虚拟机中的快照概念,镜像可以自己制作,也有官方提供的镜像仓库中的镜像

三、docker中的容器

这里的容器指的是从镜像创建的运行中的实例,可以启动、停止、删除。容器之间相互隔离、互不可见,保证安全性。可以把容器看做一个简易版的Linux环境。

  • 不过我想的是,比如我们从仓库下载了一个centos7镜像,然后基于镜像运行容器,那么该容器对我们来说应该和真实centos7使用感受是差不多的。
  • 如果我们下载了一个Nginx镜像,然后基于镜像创建容器,那么该容器的一切都是围绕着被Nginx需要,以便达到体积小、速度快等特性。
  • 同理,其它针对于某个服务的镜像也是如此。只是在运维层面的角度,并没有去深究,究竟有什么不同而已。

四、docker中的仓库

docker中的仓库一般所指的都是我们所用到的镜像仓库,有在互联网上各大站点的发布的公有仓库,也可以搭建自己公司内部的私有仓库。

搭建自己公司私有仓库,使用时和公有仓库没什么差别,只是指定不同的仓库就好了

互联网上最大的公共镜像仓库就是 Docker HUB ,这是官方镜像仓库

五、docker的网络通信

果然,任何一个技术,都有其津津乐道之处,也有其薄弱之处,那么对于docker来说,网络通信绝对算是其弱点之一。

  • docker内置默认存在的网络模式
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
114a818f4abf        bridge              bridge              local
8e522feee15d        host                host                local
58751ced4364        none                null                local

如上,这是docker中默认存在的集中网络模式,但是我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

bridge模式:使用 --net=bridge 指定,默认设置。

host模式:使用 --net=host 指定。

none模式:使用 --net=none 指定。

container模式:使用 --net=container:NAME_or_ID 指定。

下面对这些网络模式原理,以及工作方式逐个梳理

bridge模式

  1. 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
  2. 在创建容器时没有使用docker run --network=<NETWORK>指定的话,模式是连接到此网络
  3. 当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  4. 接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为192.168.111.3/24。RFC1918解释

如上图,启动docker服务之后,就会在宿主机创建一个名为docker0的虚拟网桥,然后我们创建容器时,如果没有指定网络,那么模式出于此网络模式;docker和宿主机通信通过虚拟网桥进行通信。

host模式

  1. 该模式的简单理解:相当于VMware产品的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  2. 个人对于命名空间(name space)的一点理解:我们把Linux操作系统比喻成一个大房子,那么命名空间指的就是这个房子中的一个个房间;而我们现在所提到的network namespace(网络命名空间),这时我们将整个linux网络比喻为一个大房子,Network Namespace指的就是一个个房间。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。但是,在host模式下工作的容器,不会获得一个独立的网络命名空间,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  3. 当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用宿主机地址:端口即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
  4. 关于命名空间详细介绍看这里

container模式

  1. 此网络模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是合宿主机共享同一个。新创建的容器,不会创建自己的网卡,配置自己的ip,而是和一个指定的容器公有ip、端口范围等。
  2. 同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

None模式

  1. 如果将容器设置为此网络模式,那就相当于关闭了容器的网络功能,该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。
  2. 此模式在以下两种情况下是有用的:
    1. 容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
    2. overlay网络功能,1.8新增加的功能,现在先不总结,后面会独立出来写。

本文参考文章

六、总结

  1. 要想玩转docker,首先要深入理解docker的网络通信
  2. 加油,依然不要忘记或抛弃,对生命的真实和对自己的真实