Docker 基本理论知识

73 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

docker 官网:www.docker.com/ docker 中文官网:www.docker-cn.com/ Docker Hub 官网:hub.docker.com/

——简介

  • 基于 Go 语言实现的云开源项目
  • 目标:Build、Ship and Run Any App,Anywhere
  • 将应用运行在 Docker 容器上,Docker 容器在任何操作系统都是一致的,实现跨平台、跨服务器
  • 通过对应用组件的封装、分发、部署、运行等管理,使APP、web应用、数据库应用及其运行环境做到 一次封装,到处运行
  • 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
  • 容器内的应用直接运行于宿主的内核,而且没有进行硬件虚拟,更加轻便;容器之间相互隔离

优点

  • 快速的应用交付和部署
  • 便捷的升级和缩扩容
  • 简单的系统运维
  • 高效的计算资源利用

组成

  • 镜像:是一个只读的模板,可以创建多个 docker 容器,用来打包软件运行环境和基于运行环境开发的软件
  • 容器:是镜像创建的运行实例,可启动、开始、停止、删除,每个容器之间相互隔离
  • 仓库:是集中存放镜像文件的场所,分为公开和私有,最大公开仓库是 docker hub

——安装

前提

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

具体安装流程可参考:www.cnblogs.com/myzony/p/90…

——原理

运行架构图 在这里插入图片描述 工作流程

  • docker 是一个Client-Server 结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。
  • 容器,是一个运行时的环境,就是集装箱

docker 较 VM 效率高的原因

  • docker有着比虚拟机更少的抽象层,容器直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势
  • docker利用的是宿主机的内核,不需要Guest OS。因此当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统。避免引寻、加载操作系统内核返回比较耗时的过程,因此新建一个docker 容器只需要几秒钟

——镜像

简介

  • 镜像 是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

加载原理

  • docker 镜像实际上由一层层的文件系统组成,这种层级的文件系统被称为UnionFS(联合文件系统),是 docker 镜像的基础
  • bootfs(boot file system):是docker镜像的最底层,当boot加载完成之后整个内核就都在内存中,此时内存的使用权交给内核,系统也会卸载bootfs
    • bootloader
    • kernel
  • rootfs(root file system):在bootfs之上,包含 /dev、/proc、/etc、/bin等目录文件,是各种不同的操作系统发行版

镜像分层结构的优点、特点

  • 共享资源(多个镜像从相同base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像)
  • 内存中只需加载一份base镜像,就可以为所有容器服务。而且镜像的每一层都可以被共享
  • 镜像都是只读的, 当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作为容器层,容器层之下的都叫镜像层

——Docker容器数据卷

简介

  • 卷就是目录或文件,存在一个或多个容器中(有点类似于 redis中的rdb和aof文件
  • 由docker挂载到容器,但不属于联合文件系统
  • 可绕过 UnionFS 提供一些用于持续存储或共享数据的特性
  • 目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷

特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

数据卷容器

  • 命名的容器挂载数据卷,其他容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,称之为数据卷容器

——DockerFile

简介

  • 是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
  • 步骤:编写dockerfile文件——》docker build——》docker run

构建过程解析

  1. docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

区别

  • dockerfile 是软件的原材料,面向开发;定义了进程需要的一切东西,包括执行代码、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程
  • docker 镜像是软件的交付品,成为交付标准;在用dockerfile定义一个文件之后,docker build会产生一个docker镜像,当运行镜像时,会真正开始提供服务
  • docker 容器是是软件的运行态,涉及部署与运维;直接提供服务

保留字指令

保留字说明
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露的端口
WORKDIR指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中原路径的文件 / 目录 复制到新的一层的镜像内的位置
VOLUME容器数据卷,用于保存和持久化工作
CMD指定一个容器启动时要运行的命令,可以有多个CMD命令,只有最后一个生效
ENTRYPOINT指定一个容器启动,都是在指定容器启动程序与参数
ONBUILD当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发