《 Dockerfile 基本理论概述 》
前言
在上一篇博客中主要对 《 Docker通过Volume指令添加一个或多个容器数据卷 》进行了实操,本篇将 Dockerfile 的认识,包括:什么是 Dockerfile ?Dockerfile 脚本儿知识补充 ?Dockerfile 的执行流程?Dockerfile 小姐。
Dockerfile 基本理论概述
一、什么是Dockerfile ?
Dockerfile 是用来构建生成 Docker 镜像的文件,是由一系列指令和参数组合成的脚本儿文件。
使用Dockerfile文件,三步构建并生成一个完整的镜像文件:
- 创建编写Dockerfile脚本儿文件;
- 使用docker的build命令构建生成一个镜像文件;
- 使用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 脚本儿知识补充
- 指令的执行顺序从上到下,依次执行;
- 在脚本儿文件中的每一条指令字母全部必须为大写,指令后面必须跟至少一个参数;
- 每一条指令都会构建提交成一个全新的镜像;
- Dockerfile 脚本儿中的 # 符号表示注解改行;
三、Dockerfile 的执行流程
- 当执行命令 “ docker build dockerfileName ” 时,docker 会从 base 镜像运行一个容器;
- 执行脚本儿文件中的第一条指令,并对容器进行更改的操作;
- 容器更改操作完成后,执行一个类似于 docker commit 的操作提交生成一个新的镜像层;
- 基于刚提交生成的新的镜像运行一个新的容器;
- 执行脚本儿文件中的下一条指令,并执行第3步中的操作;
- 执行完成所有指令,并构建生成一个新的镜像;
如下图:
四、总结
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社区。
作 者: | 华 仔 |
联系作者: | who.seek.me@java98k.vip |
来 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/84556302 |
版权声明: | 本文为博主原创文章,请在转载时务必注明博文出处! |