容器化是 DevOps 中的一项宝贵技能。它使应用程序能够轻松地在各种计算环境(包括云架构)中构建和分发。容器化应用程序只是意味着将应用程序的内容压缩并捆绑到可以在容器中执行和解压的映像中。
容器化并不是一个复杂的过程。这是一个涉及编写 Dockerfile 的简单过程。Dockerfile 是一个蓝图,它协调了如何将您的应用程序及其依赖项整齐地捆绑到一个自给自足的 Docker 映像中。
详细了解 Dockerfile 以及它在创建容器镜像中的重要性至关重要。在本文中,您将了解什么是 Dockerfile 以及如何使用 Dockerfile 将应用程序内容组装到镜像中。
先决条件
安装了 Docker 和 Git 的 Linux 实例。
按照分步说明了解如何在 Ubuntu 24.04 上安装 Docker并设置 Git。
什么是 Dockerfile?
创建 Docker 容器映像的过程始于编写 Dockerfile。Dockerfile 负责将应用程序的内容容器化。由于 Dockerfile 指定了用于构建容器的依赖项,因此它决定了容器运行时的安全性和健康状况。在 Dockerfile 中指定不安全的依赖项和不正确的网络配置会损坏映像。
执行 Dockerfile 的最终结果是可重现的容器映像。如果您向其他人提供应用程序的源代码和 Dockerfile,他们可以在他们的机器或云中构建和运行相同的应用程序。这种可移植性是无与伦比的。不再有诸如“此代码仅适用于我的机器”之类的问题。不再需要复杂的依赖项设置说明。
准备好增强您的 Docker 基础架构了吗?使用 Cherry Servers裸机或虚拟服务器轻松扩展并享受灵活的存储。通过免费的 24/7 技术支持、按使用量付费定价和全球可用性消除基础架构问题。
Dockerfile 的组件
Dockerfile 包含用于创建各种容器结构层的不同指令。以下是构建镜像时必须指定的指令。
1. FROM: Dockerfile 以 FROM 指令开头,该指令指定用于构建容器映像的基础映像。例如,您可以从最小 Linux 发行版(如 Alpine)或标准语言运行时(如 Node.js)开始。
FROM node:22
2. RUN:此指令运行并执行命令。它还安装指定的依赖项或包。例如,下面的指令指示 Dockernpm run build
在构建过程中运行命令。
RUN npm run build
3. COPY 和 ADD:这些指令会复制当前目录中的应用程序内容。然后,复制的内容将被压缩并容器化。
COPY . .
4. WORKDIR:此指令设置将从中执行命令的工作目录。这些命令:RUN
、、和将使用 指定的路径。例如,根目录被设置为 Dockerfile 的工作目录。CMD
COPY
ADD
WORKDIR
/app
WORKDIR /app
5. ENV:设置环境变量,例如卷。环境变量可用于自定义应用程序的行为或设置需要在构建时和运行时保留的配置详细信息。
ENV PATH="./node_modules/.bin:$PATH"
6.EXPOSE :此指令通过指定容器应该监听的端口来设置容器的基本网络接口。
EXPOSE 8080
7.CMD :指定容器启动时将运行的默认命令。在下面的示例中,npm、run 和 start 命令将在容器执行时运行并启动 Node.js 应用程序。
CMD ["npm", "run", "start"]
每条更改镜像文件系统状态的 Dockerfile 指令都会产生一个新层。Docker 会缓存这些层,因此如果您重新运行构建且初始层未发生更改,Docker 可以跳过重建它们,从而显著加快该过程。
为了实现最佳缓存和效率,明智的做法是构建 Dockerfile,以便经常更改的指令出现在底部附近,而不经常更改的指令出现在顶部。
例如,指定基础映像 (FROM) 和安装系统包可以提前出现,而复制经常更新的应用程序源代码可以稍后出现。这种方法可以避免在进行小代码更新时需要从头开始重建每一层。
如何使用 Dockerfile 创建映像
Dockerfile 可让您将任何应用程序容器化,无论使用什么框架或语言构建应用程序。创建 Dockerfile 时,务必确保依赖项是安全的,以防止构建包含不安全因素的映像。
容器运行时利用的漏洞危害更大,成本也更高。这是因为容器不安全因素会危及容器化应用程序并破坏服务。当容器被分配主机权限时,问题会变得更糟。具有主机权限的容器会为不安全因素渗透主机系统铺平道路,从而加剧安全漏洞。
因此,谨慎使用用于构建 Dockerfile 的配置非常重要。
容器化您的应用程序
1. 克隆 React 应用程序项目
执行以下命令,在 GitHub 上克隆一个 React 应用程序项目。您将在接下来的步骤中使用提供的 Dockerfile 将此演示应用程序容器化。
git clone https://github.com/xTrilton/my-app.git
上述存储库包含一个容器化应用程序的 Dockerfile,您不必创建新的 Dockerfile。克隆应用程序后,使用以下命令将目录更改为 Dockerfile 所在的应用程序根目录。
cd my-app
应用程序项目中包含的 Dockerfile 为使用 Node.js 库的 React.js 应用程序创建了一个镜像:node:19-alpine3.16
。Dockerfile 执行时将运行 Node.js 命令,例如npm run build
。以下 Dockerfile 中使用的所有指令均已在上一节中进行了说明。
Dockerfile
FROM node:19-alpine3.16# set working direction (directory for my project)WORKDIR /app# set environment pathENV PATH="./node_modules/.bin:$PATH"COPY . .# install npm dependenciesRUN npm install# Build the applicationRUN npm run build # start an application (starting our react server)CMD ["npm", "run", "start"]
2. 构建镜像
在终端中运行以下命令。执行此命令之前,请确保 Docker 正在运行。
RUN npm run build0
例如,
RUN npm run build1
命令中的.
告诉 Docker 在当前目录中查找 Dockerfile。latest
参数将容器的版本标记为最新版本。
当您docker build
针对包含 Dockerfile 的目录运行时,Docker 会逐步执行 Dockerfile 指令。层允许 Docker 缓存中间状态并加快未来的构建速度。
3. 验证镜像创建过程
使用以下命令检查镜像是否构建成功:
RUN npm run build2
如果镜像创建成功,您将获得以下输出,其中显示您刚刚创建的镜像的名称及其详细信息。您的应用程序的项目名称将是镜像名称。输出还可以包括基础镜像node:19-alpine3.16
。
4.运行容器
构建映像后,使用以下命令启动容器:
RUN npm run build3
上述命令以分离模式 ( -d
) 启动一个新容器,允许其在后台运行。标志将主机的-p
端口映射到容器内的端口,具体来说,将其绑定到本地主机 IP 地址。这意味着容器内运行的应用程序只能通过 从主机访问,通过阻止外部访问来增强安全性。3000
3000
127.0.0.1
http://127.0.0.1:3000
5. 检查集装箱详情
使用以下命令检查容器是否已创建并正在运行。
RUN npm run build4
您将获得以下输出,表明 my-first-app容器正在运行。
接下来,使用以下命令获取更详细信息。
RUN npm run build5
例如,
RUN npm run build6
您将获得以下显示容器详细信息的输出。
6. 访问容器
一旦容器运行,您可以通过http://localhost:3000/访问它。
结论
在本文中,您详细了解了 Dockerfile 是什么以及它的组件是什么。此外,您还了解了如何使用 Dockerfile 创建映像。只要您知道如何使用创建 Dockerfile 所需的指令,容器化应用程序就不是一个复杂的过程。在访问容器化应用程序之前,验证映像和容器是否已创建也很重要。
持续创建镜像会导致无休止的重要且冗余的镜像列表。保存容器化不同应用程序版本的容器镜像非常重要。如果新应用程序版本无法按预期运行,而您现在必须回滚到运行更好的旧应用程序版本,这将大有裨益。立即注册,即可使用 Cherry Servers 备份存储解决方案以较低的成本轻松保存和备份镜像。