简介
本文主要介绍Docker必知概念和必会使用方法,适合想要了解docker技术和学习docker日常使用的读者。
Docker起源—容器
最早,一台服务器只能运行同类的单一应用,想要增加一个新的应用,需要采购一个新的服务器,为了解决服务器资源严重浪费的问题,虚拟机(VM)技术出现了,但是像VMwave,VisualBox这些虚拟机技术并非十全十美,最大的问题是每个虚拟机都要有一个操作系统,这些OS会占用额外的CPU和RAM—这些资源本可以用于运行更多的应用,同时由于启动速度慢,可移植性差等问题,容器(Container)技术开始发展起来,容器的运行不会再独占操作系统,启动速度快,便于迁移,可以说解决了虚拟机时代的“顽疾”。
容器技术起源于Linux,是开源社区长期努力持续贡献的产物,但因为早期容器技术过于复杂,并没有真正被大众所接受,直到Docker的出现。
Docker—让容器变得简单
Docker是一种用Go语言开发的用于创建、运行,管理、编排容器的开源软件,是GitHub上Moby开源项目的一部分,位于旧金山的Docker公司是整个Moby项目的维护者。Docker公司致力于“将Docker和容器技术推向全世界”,有一说一,正是Docker这家公司让容器变得简单,Linux容器技术才得到了广泛的应用。近几年微软也和Docker公司、社区进行了深入合作,促进Docker和容器技术在Windows平台的发展,Mac系统上也可以用Docker for Mac来运行Linux容器,虽然这是通过在Mac上启动一个轻量级Linux虚拟机来运行Linux容器的,但这种方式至少方便了开发人员在Mac上开发和调试Linux容器。
Docker的几个重要的概念
- Docker引擎:docker引擎是用于运行和编排容器的基础设施工具,可以认为常说的Docker就是指Docker引擎。Docker引擎主要由以下组件构成:Docker客户端(Docker Client),Docker守护进程(Docker Daemon),containerd以及runc。它们共同负责容器的创建和运行。
- Docker架构:C/S架构(Client/Server),Client主要负责传递Docker命令,容器的管理,编排等在Server侧(Docker守护进程,containerd等)来完成。从图中可以看到Docker正逐步走向模块化,容器的执行逻辑和运行代码下放给了下层的containerd和runc,Docker daemon成为了更高层的管理者,负责镜像管理,安全特性,RESTful API等。
*
- Docker镜像:镜像可以理解为构建容器的模板,更进一步可以理解为面向对象中的类(Class),镜像内部由精简的操作系统文件,应用运行所必须的文件和依赖包,和运行容器所需的配置参数(环境变量)等组成。镜像对外看是一个只读的文件集合的整体,镜像对内是分层叠加实现的,这里的分层可以理解为构建镜像过程中的不同阶段镜像的不同版本,举一个例子,基于ubuntu18.04构建一个镜像,这就是这个镜像的第一层,然后再装上python包,这就是第二层,再加上安全补丁就是第三层,后续每次做的添加都是一层,最终构建时Docker负责堆叠这些层形成一个整体的镜像。这样松耦合分层堆叠的好处是可以在不同镜像之间共享镜像层,这是由Docker的存储引擎自动实现的。
(1)镜像体积一般很小,Docker官方Alpine linux镜像只有4MB,Windows镜像会比较大
(2)从一个镜像可以启动一个或多个容器(传入的参数不同或运行的端口不同),所有的容器没有全部停止或销毁,对应的镜像无法删除
(3)从面向对象的角度来看,镜像是类,容器是对象,镜像是静态的,容器是运行时的镜像
(4)镜像仓库服务:Docker镜像存储在镜像仓库服务(Image Registry)中,Docker客户端默认使用官方公共仓库服务