docker容器—overlay,Dockerfile编写

目录

一、overlay

1、AUFS和overlay/overlay2

2、overlay结构

3、联合挂载

二、dockerfile编写

1、Dockerfile结构四部分

2、CMD 与 entrypoint

3、编写dockerfile

4、dockerfile优化

优化方案

总结

构建nginx镜像

docker镜像层次结构

CMD和ENTRYPOINT区别


一、overlay

1、AUFS和overlay/overlay2

AUFS是一种联合文件系统。它使用同一个Linuxhost上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层

docker使用了overlay/overlay2存储驱动来支持分层结构
overlayFs将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

2、overlay结构

overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息

第一层rootfs基础镜像

第二层 lower下层信息(为镜像层,可读)

第三层upper上层目录(容器信息,可写)

第四层worker运行的工作目录( copy-on-write写时复制-》准备容器环境)

第五层merged”视图层”(容器视图)

3、联合挂载

[root@localhost mnt]# echo "lower.aaa" > lower/aaa
[root@localhost mnt]# echo "lower.bbb" > lower/bbb
[root@localhost mnt]# echo "upper.bbb" > upper/bbb
[root@localhost mnt]# echo "upper.ccc" > upper/ccc
[root@localhost mnt]# mkdir work meged
[root@localhost mnt]# mount -t overlay overlay -o lowerdir=lower, upperdir=upper, workdir=work meged

 

每次推送到docker hub只推送增量部分(底包毕竞大,增量推送给/更新部分比较小)所以生产上,只要你执行的镜像再推送的时候增量部分控制到比较小的一个范围就可以

二、dockerfile编写

Dockerfile是由一组指令组成的文件

1、Dockerfile结构四部分

基础镜像信息(指定操作系统镜像是什么镜像、什么版本)

{维护者信息}

镜像操作指令

容器启动时执行指令(启动容器的时候,执行的脚本/命令参数等等)

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#w号开头的注释&&
构建镜像命令(ps:可在构建镜像时指定资源限制)

docker build -t nginx:test .

-t : tag打标签
-f :指定dockerfile目录
.:指构建镜像时使用的环境(当前)目录,构建镜像时使用的上下文环境

2、CMD 与 entrypoint

CMD 与entrypoint:都是容器启动时要加载的命令

相同点

用法相似,都可以指定shell或exec函数调用的方式执行命令;
当存在多个CMD指令或ENTRYPOINT指令时,只有最后一个生效;

不同点

容器启动时,CMD指令指定的启动命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的启动命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数;
CMD指令可以作为ENTRYPOINT指令的默认参数。

exec模式与shell模式
exec:容器加载时使用的启动的第一个任务进程
shell:容器加载时使用的第一个bash ( /bin/bash /bin/sh /bin/init)
自检完成后,加载第一个pid = 1 进程
shell翻译官/解释器,解析
echo $PATH

exec无法输出环境变量

cmd是容器环境启动时默认加载的命令
entrypoint是容器环境启动时第一个加载的命令程序/脚本程序init
init pid 1

3、编写dockerfile

mkdir nginx
cd nginx
vim Dockerfile

#基于基础镜像(centos 需小写)
FROM centos:7
#用户信息(可选)
MAINTAINER this is nginx image
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#传入、解压nginx软件包
ADD nginx-1.12.0.tar.gz /usr/local/src
VOLUME ["/usr/local/nginx/html"]
WORKDIR /usr/local/src/nginx-1.12.0
#指定工作目录
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
指定http和https瑞
EXPOSE 80
RUN echo "daemon off; ">>/usr/local/nginx/conf/nginx.conf
CMD nginx
[root@localhost ngxin]# docker build -f Dockerfile -t "nginx:v1" .

镜像构建过程中

每一层镜像会临时产生一层新的镜像层,并且会运行为临时容器

每一层临时容器会基于前一层镜像的缓存层(容器)进行运行

如果该镜像层的临时容器在运行时报错,会exited(非0值)退出,并且在docker ps -a 中会保存下来,同时,docker buid构建过程,会中止

在基于同一个dockerfile修改时,修改的指令对应的image镜像缓存会失效,但该镜像层之前的image层的缓存公保留

4、dockerfile优化

优化四种方式

基于docker镜像分层的原理

每一条RUN指令都会生成一层新的镜像层
每一层镜像缓存会继承到下一层中,直接影响到镜像的大小

优化方案

减少RUN指令的使用RUN(RUN yum -y update   RUN yum install -y gcc gcc-c++ 整合为yum install -y gcc gce-ct+ && yum -y update)

将执行后的缓存/不用的输出丢入黑洞(减少缓存)
yum install -y gcc gcc-c++ && yum -y update > /dev/null

多阶段构建

使用更小体积的linux发行版本

#未优化之前
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
#关闭debug日志
RUN sed -i 's/CFLAGS="$CELAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]


docker build -t "nginx:v1" .
#查看镜像大小docker images

总结

构建nginx镜像

创建一个对应的目录( mkdir nginx )

编写Dockerfile 文件(最简单的方式,nginx部署脚本放进去每条命令用RUN执行,环境变量使用ENV,移动到对应目录使用workdir,EXPOSE暴露端口,最后使用CMD进行启动设置)

在nginx目录中上传nginx-1.12.2.tar.gz软件包等文件

docker build 创建

docker run运行容器

检验

docker镜像层次结构

base image :转础镜像

image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)

container:容器层(读写)

docker-server端

呈现给docker-client(视图)

CMD和ENTRYPOINT区别


如果ENTRYPOINT使用了shell模式,CMD指令会被忽略。
如果 ENTRYPOINT使用了 exec模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。
如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

Guess you like

Origin blog.csdn.net/y1035793317/article/details/121634815