百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

一文搞懂如何从 Dockerfile 构建 Docker 镜像

toyiye 2024-07-09 23:02 15 浏览 0 评论

Docker 通过提供轻量级、可移植且高效的解决方案,简化了软件开发和部署。“docker build”命令是 Docker 镜像创建过程的核心。本文将探讨 Docker 构建命令、用法以及 Docker 构建的优化。

前提条件

要按照本文进行操作,请确保你已经安装了Docker或Docker Desktop

Docker 构建有什么作用?

Docker build 是一个命令行界面 CLI命令,允许你根据 Dockerfile 中指定的指令构建 Docker镜像。它使镜像创建过程自动化,确保了一致性和可重复性。

Docker 构建命令的用法

docker build 命令使用以下语法运行:

docker build [OPTIONS] PATH | URL
  • OPTIONS:可用于定制构建过程的各种选项
  • PATH | URL:指定 Dockerfile 所在的路径,Docker 构建上下文将从这个位置开始。

Docker 构建命令:常用选项以及示例

通过了解 Docker 构建命令的语法和选项,你可以定制构建过程以满足你的特定需求,无论是分配标签、指定 Dockerfile 位置、构建时传递变量还是强制无缓存的构建。

使用 Docker 构建命令时,有几个常用的选项。语法和示例如下:

  • -t--tag:此选项允许你为构建的镜像分配标签,以便于引用和版本控制。在此示例中,构建的镜像将被标记为“sampleapp”和“latest”版本。用法示例: docker build -t sampleapp:latest .
  • -f-file:如果未命名为“Dockerfile”,则此选项可用于指定不同的 Dockerfile 名称或位置。在此示例中,将使用当前目录中名为“ProductionDockerfile”的 Dockerfile 构建镜像。 用法示例: docker build -f ProductionDockerfile .
  • --build-arg:该--build-arg选项允许你在构建时将变量传递到 Dockerfile,从而在构建过程中进行自定义配置。此命令将在构建时,把名为“VERSION”且值为“10”的变量传递给 Dockerfile。用法示例: docker build --build-arg VERSION=10.
  • --no-cache:此选项可用于强制 Docker 忽略缓存并执行全新构建。此命令强制 Docker 忽略缓存并执行全新的构建。用法示例: docker build --no-cache .
  • --target:如果你的 Dockerfile 使用指令定义了多个构建阶段FROM,则该--target选项允许你指定要构建的特定目标阶段。在此示例中,只会构建 Dockerfile 中定义为“mytarget”的阶段。 用法示例: docker build --target mytarget .
  • --quiet-q:该--quiet选项隐藏构建输出,仅显示镜像成功构建后的最终镜像 ID。此命令以静默方式执行构建,仅显示生成的镜像 ID。 用法示例: docker build --quiet .

这些只是一些常用的选项,Docker 构建提供了更多选项,你可以在官方 Docker 文档中搜索。

Docker 构建是如何工作的?

Docker 构建通过执行 Dockerfile 中的指令序列来创建镜像。这些指令包括复制文件、安装依赖项和执行命令等操作。当运行 docker build 命令时,Docker 守护进程会逐条读取并执行 Dockerfile 中的指令,每条指令都会生成一个轻量级的只读层。这些层被堆叠起来,形成最终的镜像。

为了提高效率,Docker 会缓存那些自上次构建以来未发生变化的层,这样在后续的构建中就可以直接使用这些缓存层,而无需重新构建,从而大幅缩短构建时间。

完成所有指令后,Docker 将生成一个包含应用程序及其所有依赖项的最终镜像,这个镜像随时准备被用来运行容器。

如何从 Dockerfile 构建 Docker 镜像

本文我们将从 Dockerfile 构建一个镜像,并基于这个镜像运行Docker容器,提供一个网页访问的 Web 服务器。

第 1 步 - 创建工作目录

创建用于演示的目录或文件夹(此处使用“docker-demo”)并在终端中运行以下命令导航到该目录:

mkdir docker-demo
cd docker-demo

在目录中创建一个名为“index.html”的文件,并添加以下内容:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Simple App</title>
  </head>
  <body>
    <h1>Hello World</h1>
    <p>This is running in a docker container</p>
  </body>
</html>

这将作为服务器提供的网页。

第 2 步 - 选择基础镜像

接下来,从Docker Hub或本地存储库中选择合适的基础镜像。基础镜像构成了自定义镜像的基础,并包含操作系统和基本依赖项。几乎每个 Docker 镜像都基于一个基础镜像。本文,将使用nginx:stable-alpine3.17-slim作为基础镜像。

第 3 步 - 创建 Dockerfile

创建一个名为“Dockerfile”的文件。该文件将定义镜像的构建指令。默认情况下,当你运行docker build命令时,docker 会搜索 Dockerfile。

第 4 步 - 将构建指令添加到 Dockerfile

在文本编辑器中打开 Dockerfile 并添加以下行:

FROM nginx:stable-alpine3.17-slim
COPY index.html /usr/share/nginx/html

EXPOSE 80 
CMD ["nginx", "-g", "daemon off;"]

上面的指令将创建一个 Docker 镜像。基于该镜像启动容器,将通过 Nginx Web 服务器提供“index.html”访问。

  • FROM指令初始化一个新的构建阶段并为后续指令设置基础镜像。
  • COPY指令将文件或目录(通常是源代码)从源复制到镜像内的指定位置。它将文件复制到“/usr/share/nginx/html”目录,这是 Nginx Web 服务器中提供静态文件的默认位置。
  • CMD指令的主要目的是为执行容器提供默认值。根据你构建的镜像类型,Dockerfile 中定义的指令会有所不同

第 5 步 - 使用 Docker 构建命令构建镜像

在构建 Docker 镜像之前,运行命令确认已安装 Docker docker --version

img

要构建容器,请确保你位于包含 Dockerfile 的文件夹中,并在终端中运行以下命令:

docker build -t sampleapp:v1 .

此命令启动 Docker 构建过程,根据当前目录 (.) 中的 Dockerfile 中指定的指令创建 Docker 镜像。

-t标志指定镜像的标签,允许你为其分配名称和版本。本文,镜像名称为“sampleapp”,版本“v1”。通过为镜像提供描述性标识符,使其更易于引用和管理。

你可以看到构建过程开始,并且输出表明构建过程已完成。

img

[第 6 步 - 验证构建的 Docker 镜像

docker images成功构建后,通过运行命令列出 Docker 主机上的所有可用镜像来验证镜像。可以看到新创建的镜像列出了分配的标签和其他相关的信息。

img

第 7 步 - 运行 Docker 镜像

接下来,使用以下命令将 Docker 镜像作为容器运行:

docker run -p 8080:80 sampleapp:v1

该命令告诉 Docker 运行sampleapp容器。-p标志指定端口映射,它将主机的端口映射到容器内的端口。在这里,你将主机的端口 8080 映射到容器的端口 80。

你可以根据需要修改主机端口,并确保使用正确的镜像名称和版本。

img

第 8 步 - 访问应用程序

容器运行后,访问应用程序。打开 Web 浏览器,输入localhost:8080,可以看到 Web 浏览器上显示的示例页面。

img

优化 Docker 构建的一些措施

你可以遵循以下措施优化 Docker 构建:

  • 确保 Dockerfile 简洁、有组织且易于维护。将复杂的任务分解为更小的、可重复使用的指令,从而提高可读性,简化故障排除和更新。
  • 在 Dockerfile 中使用轻量级镜像作为基础镜像,并确保只安装镜像中的必要内容。较小的镜像不仅可以提高性能,还可以减少部署期间的资源消耗。
  • 使用.dockerignore确保你只添加所需的文件。
  • 利用Docker的缓存机制来加速后续构建。使用不经常更改的图层或--no-cache=true在必要时使用标志。这对于大型项目特别有用。
  • 如果适用,请考虑使用多阶段构建。它们允许你将构建依赖项与最终运行时镜像分开,从而缩小镜像大小。

这些措施将提高 Docker 构建的效率,从而缩短构建时间、缩小镜像大小、提高性能并实现可靠的镜像创建。

解决 Docker 构建命令问题

你也可能在 Docker 构建过程中遇到问题。以下是一些常见问题及其可能的解决方案:

  • 错误:“Unable to find the Dockerfile”:确保你在包含 Dockerfile 的目录中运行 docker build 命令。如果 Dockerfile 不在当前目录,你需要指定其路径。
  • 构建失败:如果构建失败,首先检查 Dockerfile 的语法是否正确,确保所有依赖项和命令都已明确指定。查看构建日志和错误消息,以便识别问题所在。如果问题持续存在,尝试使用 --no-cache 选项来执行无缓存构建,这有助于排除缓存相关的问题。

结论

本文,我们主要了解了 Docker 构建的工作原理、Docker 构建语法和示例,以及如何从 Dockerfile 逐步构建 Docker 镜像。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码