Docker之DockerFile相关基础知识

一、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 :设置新的镜像的名称及版本
. :代表寻址的路径

猜你喜欢

转载自blog.csdn.net/qq_46106857/article/details/130733202