Docker 教程

Dockerfile分析:Nginx

点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。

前面几章节详细介绍了 Dockerfile 各个命令的作用和具体用法,下面我们通过阅读分析一些通用的、官方的镜像的 Dockerfile 来学习如何编写 Dockerfile,为后续自己编写抛砖引玉。

下面 Nginx 镜像的 Dockerfile 文件,下载地址:

https://github.com/docker-library/nginx/blob/master/1.7/Dockerfile

来一起看看大佬是如何编写 Dockerfile 的,我们也可以依葫芦画瓢,编写出自己的 Dockerfile。

分析 Dockerfile

# 以 Debian 操作系统的 “jessie” 版本作为基础镜像来构建新的 Docker 镜像
FROM debian:jessie
# note: we use jessie instead of wheezy because our deps are easier to get here

# 运行指令,安装依赖
# apt-get update:用于更新软件包列表,确保能够获取到最新的软件包版本信息。
# apt-get install -y:自动确认安装,无需手动确认。-y 参数可以在无人值守的环境下快速安装软件。
# --no-install-recommends:在安装软件包时不安装推荐的软件包,
#   这样可以减少不必要的软件安装,使镜像更加精简。
# fontconfig-config \
# fonts-dejavu-core \ ... 列出了一长串要安装的软件包,包括各种库(如字体相关库、图形库、
#   加密库等)、Perl 相关模块、实用工具(rename)以及一些基础的软件包(如perl、sgml-base等)。
# && rm -rf /var/lib/apt/lists/*:在安装完软件包后,删除/var/lib/apt/lists/目录下的所有文件。
#   这个目录用于存储软件包列表信息,在安装完成后,这些文件可以被删除以减少镜像的大小

# runtime dependencies
# (packages are listed alphabetically to ease maintenence)
RUN apt-get update && apt-get install -y --no-install-recommends \
		fontconfig-config \
		fonts-dejavu-core \
		geoip-database \
		init-system-helpers \
		libarchive-extract-perl \
		libexpat1 \
		libfontconfig1 \
		libfreetype6 \
		libgcrypt11 \
		libgd3 \
		libgdbm3 \
		libgeoip1 \
		libgpg-error0 \
		libjbig0 \
		libjpeg8 \
		liblog-message-perl \
		liblog-message-simple-perl \
		libmodule-pluggable-perl \
		libpng12-0 \
		libpod-latex-perl \
		libssl1.0.0 \
		libterm-ui-perl \
		libtext-soundex-perl \
		libtiff5 \
		libvpx1 \
		libx11-6 \
		libx11-data \
		libxau6 \
		libxcb1 \
		libxdmcp6 \
		libxml2 \
		libxpm4 \
		libxslt1.1 \
		perl \
		perl-modules \
		rename \
		sgml-base \
		ucf \
		xml-core \
	&& rm -rf /var/lib/apt/lists/*


# RUN gpg --keyserver pgp.mit.edu --recv-key:这行指令使用 GnuPG(GNU Privacy Guard)
#  工具从指定的密钥服务器(pgp.mit.edu)接收一系列密钥。
#  后面列出的一长串字符串是具体的密钥 ID。每个密钥 ID 用于唯一标识一个特定的 GPG 密钥。
# see http://nginx.org/en/pgp_keys.html
RUN gpg --keyserver pgp.mit.edu --recv-key \
	A09CD539B8BB8CBE96E82BDFABD4D3B3F5806B4D \
	4C2C85E705DC730833990C38A9376139A524C53E \
	B0F4253373F8F6F510D42178520A9993A1C052F8 \
	65506C02EFC250F1B7A3D694ECF0E90B2C172083 \
	7338973069ED3F443F4D37DFA64FD5B17ADB39A8 \
	6E067260B83DCF2CA93C566F518509686C7E5E82 \
	573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62

# 设置了一个环境变量名为NGINX_VERSION,并将其值设为1.7.4
ENV NGINX_VERSION 1.7.4

# 1.安装构建依赖
#   RUN buildDeps="... "; apt-get update && apt-get install -y 
#   --no-install-recommends $buildDeps && rm -rf /var/lib/apt/lists/*:
#   首先定义了一个名为buildDeps的变量,其中包含了一系列用于构建 Nginx 的软件包,
#   如各种开发库(如libc-dev-bin、libfontconfig1-dev等)、编译器(gcc)、构建工具(make)等。
#   apt-get update 更新软件包列表,然后使用 apt-get install 安装 buildDeps 变量中
#   列出的软件包,--no-install-recommends参数确保只安装必需的软件包,减少不必要的依赖。
#   最后,删除/var/lib/apt/lists/*以清理软件包列表文件,减小镜像大小。

# 2.下载和验证 Nginx 源码
# && curl -SL "http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz" -o nginx.tar.gz
# 使用curl工具从 Nginx 官方网站下载指定版本(由NGINX_VERSION环境变量指定)的 Nginx 源码压缩包,
# 并命名为nginx.tar.gz。

# && curl -SL "http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc" -o nginx.tar.gz.asc
# 同时下载对应的签名文件,用于验证源码的完整性和真实性。

# && gpg --verify nginx.tar.gz.asc
# 使用 GnuPG(GPG)工具验证下载的 Nginx 源码压缩包的签名。

# 2.构建、安装和配置 Nginx
# && mkdir -p /usr/src/nginx:创建用于存放 Nginx 源码的目录。

# && tar -xvf nginx.tar.gz -C /usr/src/nginx --strip-components=1:
# 解压下载的 Nginx 源码压缩包到/usr/src/nginx目录,并使用 --strip-components=1 参数
# 确保解压后的文件直接放在该目录下,而不是在一个子目录中。

# && rm nginx.tar.gz*:删除下载的压缩包文件,以减小镜像大小。

# && cd /usr/src/nginx:切换到 Nginx 源码目录。

# &&./configure...:运行 Nginx 的配置脚本,指定了一系列参数,如用户和组为www-data、
# 安装路径为/usr/local/nginx、启用各种模块等。

# && make -j"$(nproc)":使用多线程(根据系统的 CPU 核心数自动确定线程数)进行构建。

# && make install:安装构建好的 Nginx。

# && cd /:切换回根目录。

# && rm -r /usr/src/nginx:删除 Nginx 源码目录,减小镜像大小。

# && chown -R www-data:www-data /usr/local/nginx:
# 更改 Nginx 安装目录的所有者和组为www-data。

# 4.配置 Nginx 以在前台运行
# && { echo; echo '# stay in the foreground so Docker has a process to track'; 
#   echo 'daemon off;'; } >> /etc/nginx.conf:
# 向 Nginx 的配置文件/etc/nginx.conf 中添加一些内容,使得 Nginx 在前台运行。
# 这是为了让 Docker 容器能够跟踪 Nginx 进程,因为 Docker 通常需要一个前台运
# 行的进程来保持容器的运行状态。

# 5.清理构建依赖
# && apt-get purge -y --auto-remove $buildDeps:
# 使用 apt-get purge 命令清理之前安装的构建依赖软件包,
# --auto-remove 参数确保自动清理不再需要的依赖项。

# All our runtime and build dependencies, in alphabetical order (to ease maintenance)
RUN buildDeps=" \
		ca-certificates \
		curl \
		gcc \
		libc-dev-bin \
		libc6-dev \
		libexpat1-dev \
		libfontconfig1-dev \
		libfreetype6-dev \
		libgd-dev \
		libgd2-dev \
		libgeoip-dev \
		libice-dev \
		libjbig-dev \
		libjpeg8-dev \
		liblzma-dev \
		libpcre3-dev \
		libperl-dev \
		libpng12-dev \
		libpthread-stubs0-dev \
		libsm-dev \
		libssl-dev \
		libssl-dev \
		libtiff5-dev \
		libvpx-dev \
		libx11-dev \
		libxau-dev \
		libxcb1-dev \
		libxdmcp-dev \
		libxml2-dev \
		libxpm-dev \
		libxslt1-dev \
		libxt-dev \
		linux-libc-dev \
		make \
		manpages-dev \
		x11proto-core-dev \
		x11proto-input-dev \
		x11proto-kb-dev \
		xtrans-dev \
		zlib1g-dev \
	"; \
	apt-get update && apt-get install -y --no-install-recommends $buildDeps && rm -rf /var/lib/apt/lists/* \
	&& curl -SL "http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz" -o nginx.tar.gz \
	&& curl -SL "http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc" -o nginx.tar.gz.asc \
	&& gpg --verify nginx.tar.gz.asc \
	&& mkdir -p /usr/src/nginx \
	&& tar -xvf nginx.tar.gz -C /usr/src/nginx --strip-components=1 \
	&& rm nginx.tar.gz* \
	&& cd /usr/src/nginx \
	&& ./configure \
		--user=www-data \
		--group=www-data \
		--prefix=/usr/local/nginx \
		--conf-path=/etc/nginx.conf \
		--http-log-path=/proc/self/fd/1 \
		--error-log-path=/proc/self/fd/2 \
		--with-http_addition_module \
		--with-http_auth_request_module \
		--with-http_dav_module \
		--with-http_geoip_module \
		--with-http_gzip_static_module \
		--with-http_image_filter_module \
		--with-http_perl_module \
		--with-http_realip_module \
		--with-http_spdy_module \
		--with-http_ssl_module \
		--with-http_stub_status_module \
		--with-http_sub_module \
		--with-http_xslt_module \
		--with-ipv6 \
		--with-mail \
		--with-mail_ssl_module \
		--with-pcre-jit \
	&& make -j"$(nproc)" \
	&& make install \
	&& cd / \
	&& rm -r /usr/src/nginx \
	&& chown -R www-data:www-data /usr/local/nginx \
	&& { \
		echo; \
		echo '# stay in the foreground so Docker has a process to track'; \
		echo 'daemon off;'; \
	} >> /etc/nginx.conf \
	&& apt-get purge -y --auto-remove $buildDeps

# 设置了环境变量PATH,将/usr/local/nginx/sbin目录添加到系统的PATH变量的开头。
# 这样做是为了确保在容器中执行命令时,可以更方便地找到 Nginx 的可执行文件。
# 当在容器中执行命令时,系统会首先在 PATH 变量中列出的目录中查找可执行文件。
# 通过将 Nginx 的可执行文件所在的目录添加到 PATH 中,可以直接使用 Nginx 的命令而
# 无需指定完整的路径。
ENV PATH /usr/local/nginx/sbin:$PATH

# 设置容器的工作目录为/usr/local/nginx/html。
# 可以方便后续的操作都在这个特定的目录下进行。对于 Nginx 来说,通常这个目录是存放网站
# 内容的地方。在这个目录下,可以进行文件的创建、修改、删除等操作,以及在容器启动时执行
# 特定的脚本或命令。同时,设置明确的工作目录也有助于提高 Dockerfile 的可读性和可维护性,
# 使得其他人更容易理解容器的工作环境和默认的操作位置。
WORKDIR /usr/local/nginx/html

# TODO USER www-data

# 告诉 Docker,在容器运行时,容器内部的 80 端口应该被暴露出来,以便可以从容器外部访问
EXPOSE 80

# 设置了容器启动时默认执行的命令。在这个例子中,容器启动时会运行nginx命令。
CMD ["nginx"]

💢注意:

(1)末尾反斜杠(\)是用来表示命令行的续行符。当一条命令太长而不便于在一行中完整书写时,可以使用反斜杠将其拆分为多行。这样可以提高代码的可读性,同时也方便编辑和维护

更多 Dockerfile 文件

如果想下载更多的官方 Dockerfile 文件,可以访问 https://github.com/docker-library 地址,如下图:

1197ae85aec2e1597e93bbe19c742d46_1724814709319-9ec70bc3-a9fd-4892-b288-320fc4fa67dc.png


点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号