Docker系列(十五)——Dockerfile 基本理论概述

版权声明:本文为博主原创文章,如果觉得写的不错需要转载,在转载时请注明博文出处! https://blog.csdn.net/Hello_World_QWP/article/details/84556302

                                                  《 Dockerfile 基本理论概述 》

前言

在上一篇博客中主要对 《 Docker通过Volume指令添加一个或多个容器数据卷 》进行了实操,本篇将 Dockerfile 的认识,包括:什么是 Dockerfile ?Dockerfile 脚本儿知识补充 ?Dockerfile 的执行流程?Dockerfile 小姐。

Dockerfile 基本理论概述

一、什么是Dockerfile ?

Dockerfile 是用来构建生成 Docker 镜像的文件,是由一系列指令参数组合成的脚本儿文件。

使用Dockerfile文件,三步构建并生成一个完整的镜像文件:

  1. 创建编写Dockerfile脚本儿文件;
  2. 使用docker的build命令构建生成一个镜像文件;
  3. 使用docker的run命令来运行这个镜像;

初识 Dockerfile 脚本儿文件,这儿以 redis 的 Dockerfile 脚本儿为例,可以到 https:// 上进行检索需要的脚本儿文件,具体内容如下:

FROM debian:stretch-slim

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r redis && useradd -r -g redis redis

# grab gosu for easy step-down from root
# https://github.com/tianon/gosu/releases
ENV GOSU_VERSION 1.10
RUN set -ex; \
	\
	fetchDeps=" \
		ca-certificates \
		dirmngr \
		gnupg \
		wget \
	"; \
	apt-get update; \
	apt-get install -y --no-install-recommends $fetchDeps; \
	rm -rf /var/lib/apt/lists/*; \
	\
	dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
	wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
	wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
	gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
	gpgconf --kill all; \
	rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc; \
	chmod +x /usr/local/bin/gosu; \
	gosu nobody true; \
	\
	apt-get purge -y --auto-remove $fetchDeps

ENV REDIS_VERSION 5.0.4
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-5.0.4.tar.gz
ENV REDIS_DOWNLOAD_SHA 3ce9ceff5a23f60913e1573f6dfcd4aa53b42d4a2789e28fa53ec2bd28c987dd

# for redis-sentinel see: http://redis.io/topics/sentinel
RUN set -ex; \
	\
	buildDeps=' \
		ca-certificates \
		wget \
		\
		gcc \
		libc6-dev \
		make \
	'; \
	apt-get update; \
	apt-get install -y $buildDeps --no-install-recommends; \
	rm -rf /var/lib/apt/lists/*; \
	\
	wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL"; \
	echo "$REDIS_DOWNLOAD_SHA *redis.tar.gz" | sha256sum -c -; \
	mkdir -p /usr/src/redis; \
	tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1; \
	rm redis.tar.gz; \
	\
# disable Redis protected mode [1] as it is unnecessary in context of Docker
# (ports are not automatically exposed when running inside Docker, but rather explicitly by specifying -p / -P)
# [1]: https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da
	grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h; \
	sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h; \
	grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h; \
# for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"
# see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840
# (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)
	\
	make -C /usr/src/redis -j "$(nproc)"; \
	make -C /usr/src/redis install; \
	\
	rm -r /usr/src/redis; \
	\
	apt-get purge -y --auto-remove $buildDeps

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379
CMD ["redis-server"]

二、Dockerfile 脚本儿知识补充

  1. 指令的执行顺序从上到下,依次执行;
  2. 在脚本儿文件中的每一条指令字母全部必须为大写,指令后面必须跟至少一个参数;
  3. 每一条指令都会构建提交成一个全新的镜像;
  4. Dockerfile 脚本儿中的 # 符号表示注解改行;

三、Dockerfile 的执行流程

  1. 当执行命令 “ docker build dockerfileName ” 时,docker 会从 base 镜像运行一个容器;
  2. 执行脚本儿文件中的第一条指令,并对容器进行更改的操作;
  3. 容器更改操作完成后,执行一个类似于 docker commit 的操作提交生成一个新的镜像层;
  4. 基于刚提交生成的新的镜像运行一个新的容器;
  5. 执行脚本儿文件中的下一条指令,并执行第3步中的操作;
  6. 执行完成所有指令,并构建生成一个新的镜像;

如下图:

四、总结
 

1、Dockerfile:构建镜像前首先需要定义一个 Dockerfile,Dockerfile 定义了最终镜像生成时需要的一切。Dockerfile 涉及的内容包括需要执行的代码或者是文本文件软件运行的环境变量运行时环境依赖的第三方组件包动态链接库操作系统的发行版服务进程和内核进程等;

2、Docker 镜像:通过一个完成的 Dockerfile 文件,执行 “ docker build ” 命令时会产生一个全新的 Docker 镜像文件;

3、Docker 容器:当运行该 Docker 镜像时,会真正开始提供服务,容器就是可直接提供服务。

*注:如果当应用的进程需要和系统服务或者内核进程进行交互时,需要考虑 namespace 的设计和权限控制等;

从从应用软件的角度来看,分别代表这不同的三个阶段,分别为:Dokerfile 脚本儿文件、Docker 镜像、Docker 容器(真正提供服务的阶段):

  • Dockerfile 脚本儿文件即软件的原材料;
  • Docker 镜像即软件的交付物;
  • Docker 容器即软件运行时运行状态;

Dockerfile 主要面向开发人员,而 Docker 镜像成为交付物品,Docker 容器则涉及部署与运维,三者缺一不可,三者统称为Docker体系的基石


 好了,关于 Docker系列(十五)——Dockerfile 基本理论概述 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者: 华    仔
联系作者: [email protected]
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/84556302
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!

猜你喜欢

转载自blog.csdn.net/Hello_World_QWP/article/details/84556302