一、什么是docker
官方地址:https://docs.docker.com/
Docker 是一个基于go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
二、docker核心概念
docker三大核心概念:镜像 Image、容器 Container、仓库 Repository
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。基于镜像可以创建容器,同一个镜像可以创建多个容器;
docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。镜像存放在仓库中,可以从仓库中拉取。
三、docker架构及原理
- Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
- 架构上可以分为客户端和服务端;
- Docker Daemon是docker的守护进程;
- containerd是容器运行的进程,是实现容器的核心;
- 客户端通过内部的API和服务端的守护进程进行交互,守护进程再通过containerd分发到各个容器;
概念 | 说明 |
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。基于镜像可以创建容器,同一个镜像可以创建多个容器; |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。镜像仓库分为公共镜像仓库Docker Hub和一些私有化部署的仓库比如:Harbor(这两种类似于github和gitlab)Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 : 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
四、docker轻量级的实现原理
docker容器本质上是宿主机的进程,Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
namespace资源隔离
linux内核提拱了6种namespace隔离的系统调用:
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名或域名 (since Linux 2.6.19) |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存(since Linux 2.6.19) |
PID | CLONE_NEWPID | 进程编号(since Linux 2.6.24) |
Network | CLONE_NEWNET | 网络设备、栈、端口等(since Linux 2.6.24) |
Mount | CLONE_NEWNS | 挂载点(文件系统)(since Linux 2.6.24) |
User | CLONE_NEWUSER | 用户组和用户组(started in Linux 2.6.23 and completed in Linux 3.8) |
五、docker的优缺点
1.优点
- 更高效利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
2.缺点
- Docker是基于Linux 64bit的,无法在32bit的 linux/Windows/unix环境下使用
- Docker并非适合所有应用场景,Docker只能虚拟基于 Linux的服务
- Docker实例是无状态的,不会保存当前操作行为的数据:容器销毁后,再次创建容器不会保存之前的数据,一种方法是通过数据挂载技术将数据挂载到宿主机指定目录来解决此问题,另一种方法是通过docker commit命令来基于已有容器构建为新的镜像,从而达到环境持久化的目的。