docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker构建镜像

Docker利用Dockerfile与docker build命令构建镜像指南

作者:敲上瘾

Docker镜像能将应用程序及其所有依赖打包成一个标准化的、可移植的文件,本文将简单介绍一下如何使用docker commit指令和Dockerfile进行构建,需要的小伙伴可以了解下

一、镜像制作简介

Docker镜像能将应用程序及其所有依赖(如库、配置、运行时环境等)打包成一个标准化的、可移植的文件,确保应用在任何支持Docker的环境中都能以相同方式运行,从而解决"在我这能跑,到你那却不行"的环境一致性问题,同时简化部署流程、提高扩展效率,并通过容器化实现资源隔离与轻量化管理,让应用的开发、测试和生产环境保持统一,大幅降低跨环境部署的复杂度和出错概率。

制作镜像主要有两种方式:

相比docker commit,使用 Dockerfile 构建镜像是绝对的主流做法,核心优势如下:

1. 自动化 & 可重复

2. 透明 & 可追溯

3. 高效 & 快速

利用分层缓存:只重建变更的步骤,大幅提升构建速度。

4. 易维护 & 最佳实践

5. 天生适合 CI/CD

完美集成自动化流程,实现代码提交后自动构建、测试、部署。

二、Dockerfile文件配置

Dockerfile 就是镜像的蓝图,Dockerfile与镜像的关系如同图纸与房子的关系

Dockerfile格式:

# Comment
INSTRUCTION arguments

2.1 常用命令清单

官方地址:https://docs.docker.com/reference/dockerfile/

2.2 命令详解

功能:

FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境;

注意事项:

语法:

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

参数:

示例:

注意:可在一个 Dockerfile 中多次使用FROM指令,每个FROM指令开启一个新的构建阶段。每个阶段都可以有自己的安装、配置和构建步骤。后面的构建阶段可以从前面的构建阶段中选择性地复制所需的文件或目录。即“多阶段构建”

LABEL

功能:

为镜像添加元数据

语法:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

示例:

FROM ubuntu:22.04 as buildstage1
LABEL version="1.0" desc="create by bit"

COPY

功能:

用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中。

语法:

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

参数:

注意:

示例:

效果:

ENV

功能:

ENV <key>=<value> ...

示例:

效果:

与ENV配合使用:

ENV MYROOTDIR=/data/web/html/
COPY ./index.html ${MYROOTDIR}

WORKDIR

功能:

为 Dockerfile 中所有的 RUNCMDENTRYPOINTCOPYADD 指定设定工作目录,相当于cd到一个目录然后执行指令
语法:

WORKDIR /path/to/workdir

注意:

示例:

效果:

注意:在 Dockerfile 中,如果存在多个 WORKDIR 指令,在后续的 WORKDIR 指令出现之前,所有需要指定工作目录的指令(如 RUN、CMD、ENTRYPOINT、COPY、ADD 等)都会以上一个 WORKDIR 所设置的路径作为工作目录。

ADD

功能:

ADD 指令类似于 COPY 指令,ADD 支持使用 TAR 文件和 URL 路径,会自动完成解压和下载,而copy不支持这个功能

语法:

ADD [--chown=<user>:<group>]  <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

参数:

示例:

效果:

如果是本地下载tar,然后给容器会自动解压。如果是远端则不会。

RUN

功能:

用于指定 docker build 过程中运行的程序,其可以是任何命令

语法:

#shell form
RUN <command>
#exec form
RUN ["executable", "param1", "param2"]

参数:

第一种格式中,<command>通常是一个 shell 命令,且以/bin/sh -c来运行它,Windows 默认为 cmd /S /C。如果一个脚本 test.sh 不能自己执行,必须要 /bin/sh -c test.sh 的方式来执行,那么,如果使用 RUN 的 shell 形式,最后得到的命令相当于:

/bin/sh -c "/bin/sh -c 'test.sh'"

第二种语法格式中的参数是一个 JSON 格式的数组,其中<executable>为要运行的命令,后面的 <paramN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以/bin/sh -c来发起,因此常见的 shell 操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此 shell 特性的话,可以将其替换为类似下面的格式。

RUN ["/bin/bash", "-c", "<executable>", "<param1>"]

示例:

注意:多使用&&把指令放在同一个RUN,减少层

CMD

功能:

语法:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

注意:

示例:

CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

ENTRYPOINT

功能:

用于指定容器的启动入口

语法:

#exec form
ENTRYPOINT ["executable", "param1", "param2"]
# shell form
ENTRYPOINT command param1 param2

参数:

json 数组中,要使用双引号,单引号会出错

注意:ENTRYPOINT与CMD功能类似,但ENTRYPOINT不会被docker run指令完全覆盖,docker run后面的参数会作为ENTRYPOINT的参数。

示例:

test:v0.7使用CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

test:v0.8使用ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

EXPOSE

功能:

语法:

EXPOSE <port> [<port>/<protocol>...]

参数:

示例:

EXPOSE 80/tcp

ARG

功能:

语法:

ARG <name>[=<default value>]

注意:

注意:ARG和ENV同时存在时,ENV会覆盖ARG

示例:

Dockerfile文件

ARG SYSVERSION=22.04
FROM ubuntu:${SYSVERSION}

构建时可以更改变量从而更改Ubuntu版本:

docker build -t test:v0.9 --build-arg SYSVERSION=22.10

VOLUME

功能:

语法:

VOLUME <mountpoint>
VOLUME ["<mountpoint>"]

参数:

mountpoint: 挂载点目录

注意:

示例:

VOLUME ["/data1"]

USER

功能:

USER <user>[:<group>]
USER <UID>[:<GID>]

参数:

注意:

<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则将运行失败

示例:

USER root:root
RUN groupadd mysql
RUN useradd mysql -g mysql
USER mysql:mysql
RUN whoami > /tmp/user.txt

HEALTHCHECK

功能:

语法:

HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)
HEALTHCHECK NONE (disable any healthcheck inherited from the base image)

OPTIONS 选项参数:

返回值:

示例:

FROM nginx:1.24.0
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1

三、docker build 指令

功能:

docker build 命令用于使用 Dockerfile 创建镜像。

语法:

docker build [OPTIONS] PATH | URL | -

关键参数:

以上就是Docker利用Dockerfile与docker build命令构建镜像指南的详细内容,更多关于Docker构建镜像的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文