本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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
构建过程解析
- docker 从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个新容器
- 执行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被触发 |