在 Docker-Compose 文件中重建容器
在我们实施我们的应用程序之前,我们需要了解 Dockerfile 和 compose.yaml 文件之间的区别。
在为我们的应用程序创建自定义图像时,我们通常使用名为 Dockerfile 的文件,并使用 docker run
命令在命令行上从中运行容器。 如果我们想创建多个镜像,这些命令会变得过于繁琐且难以管理容器,所以这就是 compose.yaml 文件的用武之地。
compose.yaml 文件构建图像、运行容器、为这些容器创建网络并将它们添加到网络中。 然后我们可以使用服务的名称访问网络应用程序。
这两个命令必须存在于应用程序中,以便 docker compose up
命令可以创建和运行图像。
如果对图像进行了任何更改,这些命令将获取更改、停止容器并重新创建图像。 在本教程中,我们将了解如何从 Docker 文件中定义的多个容器重建单个 Docker 容器。
创建一个新项目
打开 IntelliJ IDEA 并选择文件 > 新建 > 项目。 在打开的窗口中,选择 Node.js 并将项目名称从无标题更改为 docker-rebuild-container 或使用任何首选名称。
确保安装了 Node 运行时环境,以便从计算机自动添加 Node 解释器和包管理器部分。 最后,单击“创建”按钮生成项目。
在 docker-rebuild-container 文件夹下创建一个名为 index.js 的文件,并将以下代码复制并粘贴到该文件中。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.json(
[
{
name: "Java in action",
author: "chad darby",
price: 345
},
{
name: 'React cookbook',
author: "mary public",
price: 600
},
])
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
在此文件中,我们创建了一个示例 Node.js 应用程序来创建图像并从中运行容器。 此应用程序公开了一个 API,可以通过向浏览器/在浏览器上发出获取请求来访问该 API。
为镜像创建 Dockerfile
创建一个名为 Dockerfile 的文件,然后将以下说明复制并粘贴到该文件中。
FROM node:16.17.0-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js
此文件定义了构建映像并从中运行容器的说明。 docker 文档提供了这些说明如何工作的详细说明。
为容器创建一个 Compose 文件
在 docker-rebuild-container 文件夹中创建一个 compose.yaml 文件,并将以下说明复制并粘贴到该文件中。
services:
service-one:
restart: on-failure
build: .
hostname: service-one
ports:
- '3000:3000'
service-two:
restart: on-failure
build: .
hostname: service-two
ports:
- '5000:3000'
该文件定义了两个名为 service-one 和 service-two 的服务,分别从主机的 3000 端口和 5000 端口监听容器中的 3000 端口。
- services - 这定义了应用程序的计算组件。
- restart - 这定义了容器终止时要采取的操作。
- build - 这定义了包含用于构建映像的配置的 Dockerfile 的源。
- hostname - 这设置了服务使用的自定义名称。
- ports - 这会暴露主机上的端口来为应用程序提供服务。
Docker 文档提供了一个 docker compose 文件参考,详细解释了这些说明。
使用 compose 运行容器
在这个例子中,我们将看到如何一次构建和运行所有定义的容器。 要执行我们的 docker compose.yaml
文件,请使用键盘快捷键 ALT + F12 在您的开发环境中打开一个新的终端窗口,然后使用以下命令来构建和运行容器。
~/WebstormProjects/docker-rebuild-container$ docker compose up --build --force-recreate --no-deps -d
通过这个命令,运行和管理容器变得非常容易。 在使用此命令之前,我们运行 docker compose up -d
以确保我们正在使用此命令重建映像并重新创建容器。
=> CACHED [docker-rebuild-container_service-two 2/5] WORKDIR /com/app 0.0s
=> CACHED [docker-rebuild-container_service-two 3/5] ADD package*.json ./ 0.0s
=> CACHED [docker-rebuild-container_service-two 4/5] RUN npm install 0.0s
=> [docker-rebuild-container_service-two 5/5] ADD . . 1.2s
=> [docker-rebuild-container_service-one] exporting to image
- --build - 这确保在运行容器之前构建图像。
- --force-recreate - 这将重新创建容器而不考虑其配置和图像的状态。
- --no-deps - 这确保链接的服务不会启动。
使用 compose 重建单个容器
要从 compose.yaml 文件中定义的多个容器重建单个容器,请使用上一个示例中使用的命令并添加要重建的服务的名称,如下所示。
~/WebstormProjects/docker-rebuild-container$ docker compose up --build --force-recreate --no-deps -d service-one
此命令重建映像并重新创建名为 service-one 的容器,因为我们只想重新创建一个容器。 我们可以从该命令的输出中验证仅重新创建了一个容器,如下所示。
[+] Running 1/1
⠿ Container docker-rebuild-container-service-one-1 Started
要验证容器是否按预期工作,请在浏览器上发出两个请求,一个在 localhost:3000 (http://localhost:3000/) 上,另一个在 localhost:5000 (http://localhost:5000/) 上,以及 请注意,我们可以从两个容器访问同一个应用程序。 以下是容器返回的 JSON 响应。
[
{
"name": "Java in action",
"author": "chad darby",
"price": 345
},
{
"name": "React cookbook",
"author": "mary public",
"price": 600
}
]
总结
在本文中,我们学习了如何使用 Dockerfile 定义图像、使用 compose.yaml 文件定义容器、在 compose 文件中运行容器以及在 compose 文件中重新创建单个容器。
请注意
,从组合文件运行容器的语法是docker compose up [OPTIONS] [SERVICE...]
,可选的 SERVICE 参数允许我们指定一个或多个我们想要重建其图像或重新创建其容器的服务。
相关文章
在 Linux 中托管 Docker Internal
发布时间:2023/04/18 浏览次数:139 分类:Docker
-
Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。
在 Docker 中设置工作目录
发布时间:2023/04/18 浏览次数:82 分类:Docker
-
在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。
在 Docker 容器中公开多个端口
发布时间:2023/04/18 浏览次数:143 分类:Docker
-
Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。
将用户添加到 Docker 容器
发布时间:2023/04/18 浏览次数:187 分类:Docker
-
在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。
使用 Docker 网络主机命令
发布时间:2023/04/18 浏览次数:112 分类:Docker
-
在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。
清除 Docker 容器日志
发布时间:2023/04/18 浏览次数:181 分类:Docker
-
本文介绍了我们可以用来清除 docker 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。
Dockerfile 中 COPY 和 ADD 命令的区别
发布时间:2023/04/18 浏览次数:158 分类:Docker
-
在 Dockerfile 中,我们可以使用 COPY 或 ADD 命令复制这些文件。 这些命令在功能上是相同的; 但是,存在一些差异。本文介绍了 Dockerfile 中 COPY 和 ADD 命令之间的区别。