文章目录
一、基于dockerfile创建
1.1 什么是dockerfile
dockerfile是自定义镜像的一套规则
dockerfile由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层
1.2 dockerfile的组成
Dockerfile每行支持一条指令,每条指令可携带多个参数,支特使用以“#“号开头的注释(可以通过&&写入多条命令)
1.3 dockerfile结构
Dockerfile是由一组指令组成的文件Dockerfile结构四部分
· 基础镜像信息
· 维护者信息
· 镜像操作指令
· 容器启动时执行指令(cmd)
二、dockerfile操作指令
指令 | 含义 |
---|---|
from镜像 | 指定新的镜像所基于的镜像,第一条必须为from,每创建一个镜像就需要一条from指令。(开启一个新镜像,必须写的一行指令) |
maintainer名字 | 说明镜像的维护人的信息 |
run命令 | 在所基于的镜像上执行命令,并提交到新的镜像中。 |
CMD[“要运行的程序“,”参数1,“参数2“] | 指定启动容器时要运行的命令或者脚本,Dockerfile只能有—条CMD命令,如果指定多条则只能最后一条被执行。 |
expose | 指定新镜像加载到Docker时要开启的端口 |
ENV | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要Dockerfile在相同的目录中 |
VOLUME[“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器的用户 |
WORKDIR路径 | 为后续的RUN,CMD,ENTRYPOINT指定工作目录 |
ONBUILD命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTCHECK | 健康检查 |
三、docker镜像分层
3.1 docker境像分层(基于AUFS构建):
· Docker镜像位于bootfs内核之上
· 每一层镜像的下一层成为父镜像
· 第一层镜像成为base image(操作系统环境镜像)
· 容器层(可读可写),在最顶层( writable)
· 容器层以下都是readonly
container 读写层(执行)
image(只读)
base image:基础镜像
bootfs+rootfs+aufs/overlay2+LXC(kernel)
bootfs:主要引导加载内核kernel,linux刚启动会加载bootfs文件系统,在docker镜像的最底层是bootfs
aufs:存储引擎
overlay2:存储引擎
rootfs:个性化版本信息,统一化linux版本的操作系统
LXC:辅助docker实现虚拟化
3.2 涉及技术
bootfs (boot file system) 内核空间主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
在linux操作系统中(不同版本的linux发行版本),linux加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作
rootfs (root file system)内核空间
在bootfs之上 (base images,例如centos 、 ubuntu)
包含的就是典型Linux系统中的 /dev,/proc,/bin,/etc 等标准目录和文件rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等
四、小结
4.1AUFS 与overlay/ overlay2
AUFS 与overlay/ overlay2 (docker 高版本)AUFS是一种联合文件系统。它使用同一个Linux
host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层而docker使用了overlay/overlay2存储驱动来支持分层结构
OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载
overlay结构:
overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息
1、rootfs、基础镜像
2、lower 下层信息(为镜像层,可读)
3、upper 上层目录(容器信息,可写)
4、worker 运行的工作目录(copy-on-write写时复制-》准备容器环境)
5、merged "视图层” (容器视图)
4.2 cmd和entrypoint区别
首先要讲一讲exec和shell的区别
exec:容器加载时使用的启动的第一个任务进程
shell:容器加载时使用的第一个bash (/bin/bash /bin/sh /bin/init)
如果 entrypoint使用了shell模式,CMD指令会被忽略。
如果entrypoint使用了exec模式,CMD指定的内容被追加为 entrypoint指定命令的参数。
如果entrypoint使用了exec模式,CMD也应该使用exec模式。
cmd是容器环境启动时默认加载的命令
entrypoint是容器环境启动时第一个加载的命令程序/脚本程序 init