Docker
引入
比如写了一个web应用,本地调试没有问题,想发给朋友看看,或者需要部署到远程服务器上。首先需要配置相同的软件,比如数据库,web服务器,必要的插件、库等等。
一开始会想到虚拟机,但是虚拟机需要模拟硬件,运行整个操作系统,不但体积臃肿内存占用高,程序的性能也会收到影响。
这时Docker就派上用场了,Docker在概念上与虚拟机非常相似,但是却轻量很多,不会去模拟底层的硬件,只会为每一个应用提供完全隔离的运行环境,可以在环境中配置不同的工具软件,并且不同环境之间相互不影响。这个环境在Docker中也被称作container

重要概念
Dockerfile
一个自动化脚本
- 主要被用来创建镜像
- 类似于列清楚了一个从操作系统到应用服务启动需要做哪些事情的清单文件
Container Image
- 当运行docker build的时候,docker就会根据dockerfile的说明一行行构建环境+应用程序,最终将这个程序+环境打包成一个类似压缩包的东西,叫做容器镜像Container Image
Container
- 在目的服务器上执行
docker pull拿到容器镜像 - 然后执行
docker run命令,将这个类似压缩包的容器镜像解压缩获得一个独立的环境和应用程序并运行 - 这样的就是容器Container
传统虚拟机和container的区别?


- Container不带有像虚拟机一样的完整操作系统
- 容器内只包含了操作系统的核心依赖库和配置文件等必要组件
- 利用一个NameSpace的能力让它看起来就像是一个独立的操作系统
- 再利用一个Cgroup限制它能使用的计算资源
- 所以说容器本质上只是个自带独立运行环境的特殊进程,底层用的是宿主机的操作系统内核
Docker Registry
负责管理镜像仓库推拉能力的服务
- docker pull 拉取镜像
架构原理
经典的client-server架构
Client
Client对应docker-cli
在命令行使用docker命令就是在使用docker -cli
- docker-cli会解析我们的命令然后调用docker daemon守护进程提供的restful API
Server
server对应docker daemon
守护进程收到命令后会根据命令创建和管理各个容器
内部分为docker server 和 engine两层
docker server本质上就是一个http服务器,负责对外提供操作容器和镜像的api接口,接收到API请求后会分发任务给engine层,engine层负责创建job,由job执行不同的工作
例如:如果执行的是docker-build命令job会根据docker-file执行文件
相关周边
docker compose
用来部署多个容器并且对这些容器有一定顺序要求
- 通过一个yaml文件写清楚要部署的容器有哪些,部署顺序是怎样的,以及这些容器占用的cpu和内存等信息
- 通过一行docker-compose up命令解析yaml文件,将容器们进行部署
docker swarm
解决多个容器构成的一整套服务在多态服务器上的集群部署问题
- 比如某应用在A服务器坏了就将该应用在b服务器上重新部署一套实现迁移
- 还能根据需要对应用做扩缩容