Docker

引入

比如写了一个web应用,本地调试没有问题,想发给朋友看看,或者需要部署到远程服务器上。首先需要配置相同的软件,比如数据库,web服务器,必要的插件、库等等。

​ 一开始会想到虚拟机,但是虚拟机需要模拟硬件,运行整个操作系统,不但体积臃肿内存占用高,程序的性能也会收到影响。

​ 这时Docker就派上用场了,Docker在概念上与虚拟机非常相似,但是却轻量很多,不会去模拟底层的硬件,只会为每一个应用提供完全隔离的运行环境,可以在环境中配置不同的工具软件,并且不同环境之间相互不影响。这个环境在Docker中也被称作container

image-20241204104629654

重要概念

Dockerfile

一个自动化脚本

  • 主要被用来创建镜像
  • 类似于列清楚了一个从操作系统到应用服务启动需要做哪些事情的清单文件

Container Image

  • 当运行docker build的时候,docker就会根据dockerfile的说明一行行构建环境+应用程序,最终将这个程序+环境打包成一个类似压缩包的东西,叫做容器镜像Container Image

Container

  • 在目的服务器上执行docker pull拿到容器镜像
  • 然后执行docker run命令,将这个类似压缩包的容器镜像解压缩获得一个独立的环境和应用程序并运行
  • 这样的就是容器Container

传统虚拟机和container的区别?

image-20241204110934446

image-20241204111258843

  • 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

image-20241204111844145
  • 守护进程收到命令后会根据命令创建和管理各个容器

  • 内部分为docker server 和 engine两层

    • docker server本质上就是一个http服务器,负责对外提供操作容器和镜像的api接口,接收到API请求后会分发任务给engine层,engine层负责创建job,由job执行不同的工作

      image-20241204112002229
    • 例如:如果执行的是docker-build命令job会根据docker-file执行文件

相关周边

docker compose

用来部署多个容器并且对这些容器有一定顺序要求

  • 通过一个yaml文件写清楚要部署的容器有哪些,部署顺序是怎样的,以及这些容器占用的cpu和内存等信息
  • 通过一行docker-compose up命令解析yaml文件,将容器们进行部署

docker swarm

解决多个容器构成的一整套服务在多态服务器上的集群部署问题

  • 比如某应用在A服务器坏了就将该应用在b服务器上重新部署一套实现迁移
  • 还能根据需要对应用做扩缩容