点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。
前面几章节详细介绍了 Dockerfile 各个命令的作用和具体用法,下面我们通过阅读分析一些通用的、官方的镜像的 Dockerfile 来学习如何编写 Dockerfile,为后续自己编写抛砖引玉。
下面 Nginx 镜像的 Dockerfile 文件,下载地址:
https://github.com/docker-library/nginx/blob/master/1.7/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 文件,可以访问 https://github.com/docker-library 地址,如下图:
点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。