Docker基础


Docker入门

本篇文档用于了解docker是什么,有些什么内容,不涉及docker指令用法

docker

将环境与程序一起发布,解决环境一致性的问题(docker镜像)
docker的核心思想,隔离,打包装箱,每个箱子相互隔离,通过隔离,充分利用服务器资源(docker容器)

docker整体结构示意图


Client:通过docker指令操作docker服务
Docker_Host:docker服务,通过docker守护进程来调度管理Container和Image
Registry:docker仓库,用于存放和管理Image
底层原理:Docker是Client-Server结构的系统,Docker的守护进程运行在宿主机上,通过Socket与客户端联通,DockerServer执行从DockerClient发出的指令

Docker与VM(虚拟机)

为什么要用docker而不是VM?因为docker比VM要小的多,也快得多
Docker比VM小,快的原因:

  1. Docker的抽象层比虚拟机少
  2. Docker用的是宿主机的操作系统内核,VM用的是虚拟机操作系统的内核,因此docker在创建新的容器时不需要像VM一样重新加载一个操作系统内核

    注:操作系统与操作系统内核不是一个东西:内核仅仅是操作系统的一部分,是真正与硬件交互的那部分软件,与硬件交互包括读写硬盘、读写网盘、读写内存以及任何连接到系统中的硬件,除了与硬件交互外,内核还负责分配资源,分配什么资源呢?所谓资源就是硬件,比如CPU时间、内存、IO等等,这些都是资源。

docker指令

下图中是常见的docker指令,用于操作容器和镜像,熟悉这些指令后即可完成基本的程序打包与部署

Docker容器数据卷

什么是容器数据卷:docker可以将应用和环境打包成一个镜像,运行起来的容器与外界完全隔离,产生的数据都在容器中,如果删除了容器数据就丢失了,因此产生了对数据持久化的需求
容器之间的数据共享技术:将docker容器中产生的数据同步到本地
卷技术:目录的挂载,将容器内的目录挂载到linux上

Docker文件系统

UnionFS(联合文件系统)

分层,轻量级,高性能
将对文件系统的修改作为一次提交来层层叠加
docker镜像中使用到的相同层是可以复用的

Docker网络

Docker网络原理

  1. 我们只要安装了docker,就会有一个网卡docker0使用的是桥接模式
  2. 每启动一个docker容器,docker就会给容器分配一个ip,使用的技术是veth-pair
    在容器中:
    在Linux中:
    通过上图,我们可以发现,这个容器带来的网卡都是一对对的
    veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议(各自与协议相连接),一段彼此相连(协议之间通讯)
  • 在容器中35是eth0的index,36是和它pair(即Linux)的veth的index
  • 在linux中36是veth的index,35是和它pair(即容器)的eth0的index

同一个docker服务,启动的docker容器之间是可以连接的
原理:docker0相当于一个路由器,容器之间可以通过他进行相互通信(默认不指定网络的情况下都是有docker0进行路由的,docker会给容器分配一个默认的可用ip)

既然docker会默认给容器分配ip,那么容器重启后ip就会改变,如何让其他程序找到这个重启后的服务呢?

  • 固定端口号,然后用宿主机IP来访问
  • 使用--link来使容器以服务名访问其他容器(已经不建议使用了)
    • 实际上就是在容器启动时读取想要访问的服务的ip,然后修改hosts文件,将读取到的ip与服务名写入到了当前文件的hosts文件中
    • 问题:
      • 当前容器可以使用目标服务名访问,但目标服务不能通过当前容器的服务名访问过来
      • 如果目标服务重启ip发生了改变,则当前容器不重启则无法访问
  • 自定义网络
    • docker0特点:默认,域名不能访问,--link可以打通
    • 使用自定义网络可以弥补使用docker0导致的服务名无法ping通的问题,且可以使用自定义网络来达到不同集群使用不同网络,确保集群的安全与健康

Docker Compose & Swarm

Docker Compose

Docker Compose可以轻松高效的管理容器,定义运行多个容器只需一份文件即可(相当与一份部署文档,只不过这份文档是给docker读的,docker根据这份文档那启用容器)
使用Docker Compose的前提是装有Compose组件

Docker Swarm

Docker的集群服务,详细描述可参考官方文档:https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

docker swarm在结构上分为两种节点,即管理节点与部署节点
管理节点:操作都在管理节点上,部署容器
工作节点:部署容器

部署docker swarm集群时,需要保证管理节点是大于1的奇数个,只有这样集群才能通过Raft确认集群的存活情况

Raft:一致性算法
swarm中的Raft协议:保证大多数节点存活才可以用(至少>1),因为是大于一,因此swarm集群至少要大于三台manager,这样才能保证即使挂掉一个manager也能让集群正常工作(如果只有两个manager,挂掉一台后,剩余存活节点就是=1,不满足集群工作条件)
简单的来说就是剩下的manager节点无法判断是自己离线还是其他的离线

工作原理


命令 -> 管理节点 -> api -> 调度 -> 工作节点(根据Task创建维护容器)