DockerFile相关基础知识
- 一、Docker镜像原理
- 1、操作系统组成部分
- 1.1 七大子系统
- 1.2 Linux文件系统
- 2、Docker镜像原理介绍
- 2.1 原理图
- 2.2 Docker镜像本质
- 2.3 统一文件系统
- 2.4 复用性
- 2.5 统一性
- 二、容器转为镜像
- 1、Docker镜像的制作
- 1.1 容器转换为镜像
- 1.2 镜像转为压缩文件
- 1.3 导入镜像的压缩文件
- 三、dockerfile概述及关键字
- 1、Dockerfile概念
- 2、关键字
- 2.1 FROM
- 2.2 MAINTAINER
- 2.3 LABEL
- 2.4 RUN
- 2.5 ENTRYPOINT
- 2.6 COPY
- 2.7 ADD
- 2.8 ENV
- 2.9 ARG
- 2.10 VOLUME
- 2.11 EXPOSE
- 2.12 WORKDIR
- 2.13 USER
- 2.14 HEALTHCHECK
- 2.15 ONBUILD
- 2.16 STOPSIGNAL
- 2.17 SHELL
- 3、样例
- 3.1 dockerfile文件内容
- 3.2 构建命令
一、Docker镜像原理
1、操作系统组成部分
1.1 七大子系统
进程调度子系统、进程通信子系统、内存管理子系统、设备管理子系统、文件管理子系统、网络通信子系统、作业控制子系统
1.2 Linux文件系统
Linux文件系统由bootfs和rootfs两部分组成
(1)bootfs:包含bootloader(引导加载程序)和kernel(内核)
(2)rootfs:root文件系统,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
2、Docker镜像原理介绍
2.1 原理图
2.2 Docker镜像本质
Docker镜像是由特殊的文件系统叠加而成
最底端是bootfs,并使用宿主机的bootfs,所以启动的速度特别快
第二层是root文件系统rootfs,称为base image(centos/ubuntu)
此外上面还可以继续叠加其他的镜像文件。
所以它是一个分层文件系统。
2.3 统一文件系统
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
(Docker镜像层都是只读的,容器层是可写的)
2.4 复用性
Centos的iso镜像文件包含bootfs和rootfs
docker的Centos镜像复用了宿主机的操作系统的bootfs,所以Centos镜像只有rootfs和其他镜像层。因此docker上的Centos镜像比Centos的iso镜像文件要小。
2.5 统一性
docker中镜像是分层的,某一个镜像的大小很小,但需要依赖父镜像和基础镜像,所以对外暴露的大小就很大了。
二、容器转为镜像
1、Docker镜像的制作
1.1 容器转换为镜像
目录挂载的东西不会一起转换为镜像
docker commit 容器id 镜像名称:版本号
1.2 镜像转为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
1.3 导入镜像的压缩文件
docker load -i 压缩文件名称
三、dockerfile概述及关键字
1、Dockerfile概念
Dockerfile是一个文本文件
包含一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。
2、关键字
2.1 FROM
指定父镜像,指定dockerfile基于哪个image构建
2.2 MAINTAINER
作者信息,用来标明这个dockerfile谁写的
2.3 LABEL
标签,用来标明dockerfile的标签,可以使用Label代替Malntainer最终都是在docker image基础信息中可以查看
2.4 RUN
执行命令,执行一段命令,默认是/bin/bash格式:
RUN command或者 RUN [“command”,“param1”,“param2”]
2.5 ENTRYPOINT
入口,一般在制作一些执行就关闭的容器中会使用
2.6 COPY
复制文件,build的时候复制文件到image中
2.7 ADD
添加文件,build的时候添加文件到image中,不仅仅局限于当前build上下文,可以来源于远程服务
2.8 ENV
环境变量,指定build时候的环境变量,可以在启动容器的时候,通过-e覆盖,格式ENV name=value
2.9 ARG
构建参数,构建参数,只在构建的时候使用的参数,如果有ENV,那么ENV的相同名字的值始终覆盖arg的参数
2.10 VOLUME
定义外部可以挂载的数据卷,指定build的image哪些目录可以启动的时候挂载到文件系统中,启动容器的时候使用-v绑定,格式VOLUME[“目录”]
2.11 EXPOSE
暴露端口,定义容器运行的时候监听的端口,启动容器的使用-p来绑定暴露端口,格式:EXPOSE 8080 或者 EXPOSE 8080/udp
2.12 WORKDIR
工作目录,指定容器内部的工作目录,如果没有创建则自动创建,如果指定 / 使用的是绝对地址,如果不是 / 开头,那么是在上一条workdir的路径的相对路径
2.13 USER
指定执行用户,指定build或者启动的时候,用户在RUN、CMD、ENTRYPONT执行的时候的用户
2.14 HEALTHCHECK
健康检查,指定监测当前容器的健康监测的命令(很少用,因为很多时候,应用本身有健康监测机制)
2.15 ONBUILD
触发器,当存在ONBUILD关键字的镜像作为基础镜像的时候,当执行FROM完成之后,会执行ONBUILD的命令,但是不影响当前镜像,用处也不怎么大
2.16 STOPSIGNAL
发送信号量到宿主机,该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出
2.17 SHELL
指定执行脚本的shell,指定RUN、CMD、ENTRYPOINT执行命令的时候,使用的shell
3、样例
3.1 dockerfile文件内容
基于centos7镜像,构建一个新的镜像,要求有vim工具,以及进入容器后在usr目录
FROM centos:7
MAINTAINER Bob
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
3.2 构建命令
docker build -f ./centos_dockerfile -t mycentos:v1 .
-f :指定dockerfile的文件路径
-t :设置新的镜像的名称及版本
. :代表寻址的路径