什么是 Dockerfile?

Dockerfile 是一个标准化的可执行组件,其中包含运行应用程序源代码所需的操作系统 (OS) 库和依赖项,这些代码不依赖于底层操作系统 (OS)。程序员可以使用开源平台 Docker 设计、分发、启动、运行、升级和管理容器。Docker 提供企业版 (EE) 和社区版 (CE)。企业版适用于开发关键任务生产应用程序的企业和 IT 团队,而社区版则适合刚开始学习 Docker 的小型团队。

Docker

什么是 Docker?

Docker是一个开源平台,开发人员可以在其中容器化应用程序。容器技术在 Docker 出现之前就已经存在,但由于 Docker 的出现,容器技术才逐渐流行起来。Docker 最关键的部分是 Docker 引擎和Docker Hub。Docker引擎在本地系统上运行程序,Docker Hub 类似于云服务,我们可以在其中与所有人共享 Docker 镜像。

什么是 Dockerfile?

Dockerfile 使用 DSL(领域特定语言),包含生成 Docker 镜像的指令。Dockerfile 将定义快速生成镜像的流程。创建应用程序时,应按顺序创建 Dockerfile,因为 Docker 守护进程会从上到下运行所有 ​​ 指令。

Dockerfile 是镜像的源代码

什么是 Docker 镜像?

一个具有多层且轻量、紧凑的独立可执行包的工件称为Docker 镜像,其中包含运行软件所需的所有组件,包括代码、运行时、库、环境变量和配置文件。

什么是 Docker 容器?

容器是镜像的运行时实例。容器包含应用程序运行所需的所有依赖项和参数,并且与主机环境完全隔离,因此可以提高开发和部署的效率。

Dockerfile 命令/说明

1. FROM

  • 表示基础映像(OS),它是在任何其他命令之前首先执行的命令。

句法

FROM <ImageName> 

例如:基础镜像将是 ubuntu:19.04操作系统

FROM ubuntu:19.04

来自 Ubuntu:19.04

2. COPY

  • 复制命令用于在构建镜像时将文件/文件夹复制到镜像中。

句法:

COPY <Source>   <Destination> 

示例:将 .war 文件复制到Tomcat webapps 目录

COPY target/java-web-app.war  /usr/local/tomcat/webapps/java-web-app.war

3. ADD

  • 在创建镜像时,我们可以使用 ADD 命令从远程 HTTP/HTTPS 目的地下载文件。

句法

ADD <URL>  

示例:尝试使用 ADD 命令下载 Jenkins

ADD https://get.jenkins.io/war/2.397/jenkins.war

4. RUN

  • 脚本和命令通过 RUN 指令运行。RUN 命令或指令的执行将在你在先前图层(Image)之上创建镜像时进行。

句法

RUN < Command + ARGS> 

例子

RUN touch file

5. CMD

  • CMD 命令的主要目的是启动容器内的进程,并且可以被覆盖。

句法

CMD [command + args] 

示例:启动Jenkins

CMD [“java”,“-jar”,“Jenkins.war”]

6. ENTRYPOINT

  • ENTRYPOINT 配置了一个将作为可执行文件运行的容器。启动 Docker 容器时,会执行名为 ENTRYPOINT 的命令或脚本。
  • 它不能被覆盖。CMD和 ENTRYPOINT之间的唯一区别是 CMD 可以被覆盖而 ENTRYPOINT 不能。

句法

ENTRYPOINT [command + args] 

示例:执行echo 命令。

ENTRYPOINT ["echo","Welcome to GFG"]

7. MAINTAINER

  • 通过使用 MAINTAINER 命令,我们可以识别 Dockerfile 的作者/所有者,并且可以为镜像设置我们自己的作者/所有者。

句法:

MAINTAINER <NAME>

示例:将镜像的作者设置为 GFG 作者。

MAINTAINER  GFG author

从 Dockerfile 创建 Docker 镜像的阶段

以下是从 Dockerfile 创建 docker 镜像的阶段:

  1. 创建一个名为 Dockerfile 的文件。
  2. 在 Dockerfile 中添加指令。
  3. 构建 Dockerfile 来创建镜像。
  4. 运行镜像来创建容器。

示例 1:使用示例创建 Dockerfile 的步骤(Jenkins)

在这个例子中,我们将为 Jenkins 编写 Dockerfile,并使用为 Jenkins 编写的 Dockerfile 构建一个镜像,并将其作为容器运行。

步骤 1:打开 Docker 并创建一个名为Dockerfile 的文件。

第 2 步:使用 vi 编辑器打开 Dockerfile 并开始编写构建 Jenkins 镜像所需的命令。

JDK作为基础镜像,因为 Jenkins 的先决条件是 JDK,之后我们添加了一个名为MAINTAINER的命令,它指示 docker 文件的作者或所有者,我们添加了ENV变量,在其中设置了 Jenkins 的路径,通过使用RUN命令我们创建路径,通过使用ADD我们下载 Jenkins 并在CMD命令的帮助下启动.war文件。

FROM openjdk:11-jdk
MAINTAINER GFG author
LABEL env=production
ENV apparea /data/app
RUN mkdir -p $apparea
ADD https://get.jenkins.io/war/2.397/jenkins.war $apparea
WORKDIR $apparea
EXPOSE 8080
CMD ["java","-jar","jenkins.war"]

docker build -t jenkins:1 .

docker run -d -p 8080:8080 <Imagetag/ID>

Jenkins )

Dockerfile

步骤 2: ** docker file 的第一个指令是 FROM。在这里,你必须提供一个基础镜像。例如,如果你想从 Ubuntu 获取基础镜像,我们将使用 FROM Ubuntu。

FROM ubuntu
  • 另一项说明是您必须提供维护者 (MAINTAINER)。这是可选的,但最佳实践是提供此镜像的维护者,这样可以很容易地找到维护者。您也可以提供您的姓名和电子邮件。
  • 如果你愿意,也可以只提供邮箱地址,不提供姓名。不过这里我们会提供完整的信息。
MAINTAINER YOUR_NAME <YOUR_EMAIL_ID>
  • 接下来,我们要运行一些程序,所以我们会说运行任何命令,我们可以使用RUN并添加您需要运行的命令。
RUN apt-get update
  • 如果您想在创建容器期间在命令行上运行某些操作,您可以输入CMD并在方括号内输入命令。如下所示:
CMD ["echo", "Hello Geeks!"]
  • 此时该文件将包含以下命令:
FROM ubuntu
MAINTAINER YOUR_NAME <YOUR_EMAIL_ID>
RUN apt-get update
CMD ["echo", "Hello Geeks!"]

步骤 3:现在我们必须构建镜像,因此您可以使用以下命令:

docker build /<FILE_LOCATION>

( 或者 )

docker build . -f Dockerfile.txt

  • 它显示 docker build,你需要提供 dockerfile 的位置。这将开始构建镜像。

构建 Docker 镜像

  • 列出镜像的命令

docker image ls / docker images

列出 Docker 镜像

Dockerfile 的好处

Dockefile 的优点如下:

  • 一致性和可重复性:Dockerfile 确保环境设置和依赖关系在不同的设置中得到一致支持,从而最大限度地减少主机环境依赖问题。
  • 版本控制: Dockerfiles 可以与源代码一起用于版本控制,它有助于跟踪更改和回滚。
  • 自动化:它提供了构建、配置和部署应用程序的过程的自动化,减少了人工干预和错误。

编写 Dockerfile 的最佳实践

以下是编写 Dockerfile 的最佳实践:

  • 使用官方基础镜像:尽量使用官方基础镜像,以确保可靠性、安全性和兼容性。
  • 最小化层:尝试通过使用 && 选项结合常用命令并使用多阶段构建来最小化层。
  • 利用缓存:通过按从最少到最频繁更改的顺序排列指令,我们可以最大化缓存分层并加快构建速度。
  • 保持清洁:确保删除不必要的文件并使用 .dockerignore 排除镜像中不需要的文件和目录。

Dockerfile 问题排查

以下是一些 Dockerfile 问题排查:

  • 检查构建日志:查看构建日志,通过错误消息和日志详细信息识别错误。它有助于提供有价值的信息。
  • 验证语法和指令:它有助于确保 dockerfile 语法和指令的顺序正确,有助于解决常见问题,包括缺少命令或正确的参数。
  • 优化层缓存:尝试验证缓存是否有效利用。通过重新排序指令,我们可以减少频繁修改的层的更改,从而加快构建过程。
  • 依赖管理:通过确保所有依赖项正确放置并可访问,我们可以避免构建失败。

Dockerfile 与 Docker Compose

以下是 dockerfile 和 Docker Compose 的区别:

特征 Dockerfile Docker Compose
目的 定义如何构建单个 Docker 镜像 定义并运行多容器 Docker 应用程序
文件扩展名 Dockerfile(无延期) docker-compose.yml
用法 根据指令逐层构建镜像 管理多容器设置和网络
配置焦点 专注于镜像创作 专注于容器编排和配置
键盘命令 FROM,,,,,RUNCMDCOPYADD services,,volumesnetworks
单容器 vs 多容器 单容器焦点 多容器焦点
依赖项 每个镜像单独构建 处理容器间依赖关系
示例用例 为应用程序创建可重用的环境 运行应用程序堆栈(例如,Web 服务器、数据库)

总结

在这篇文章中,我们介绍了一些Dockerfile中经常使用的关键命令和指令,并使用示例详细介绍了Dockerfile的工作原理。它为每个Dockerfile命令提供了易于掌握的语法和示例。

Leave a Comment