欢迎来到我们为期 30 天的 Docker 容器化课程的第 6 天!在这篇博文中,我们将探讨 Docker 和容器化概念的基础知识。我们还将深入研究构建和运行容器,以及使用 Docker Compose 编排它们。那么,让我们开始吧!
什么是 Docker?
Docker 是一个开源平台,使您能够使用容器化自动部署、扩展和管理应用程序。容器是轻量级的隔离环境,封装应用程序及其依赖项,确保不同环境之间的一致性。
在深入了解 Docker 之前,让我们先熟悉一些关键概念:
图像:
图像是用于创建容器的只读模板。它们包含运行应用程序所需的一切,包括代码、运行时、库和依赖项。
容器:
容器是可以运行、启动、停止和删除的镜像实例。它们为应用程序的执行提供了一致且可重复的环境。
容器化概念:
容器化是一种操作系统级虚拟化方法,允许多个隔离环境(称为容器)在单个主机系统上运行。
以下是与容器化相关的几个关键概念:
隔离: 容器提供高级别的隔离,允许应用程序独立运行,而不受其他容器或主机系统的干扰。每个容器都有自己的文件系统、进程、网络接口和资源。
可移植性: 容器封装了应用程序及其依赖项,使它们在不同环境中具有高度可移植性。创建容器后,它可以在任何安装了 Docker 的系统上运行,无论底层基础设施或操作系统如何。
效率: 容器是轻量级的,因为它们共享主机系统的内核、库和资源。这消除了运行多个成熟虚拟机的需要,从而缩短了启动时间并优化了资源利用率。
可扩展性: 容器支持水平扩展,使您可以轻松地跨多个主机复制和分发应用程序实例。这种灵活性使得根据需求扩展应用程序变得更加容易,从而确保高效的资源利用和改进的性能。
构建和运行容器:
现在,让我们探讨如何使用 Docker 构建和运行容器。下面是演示该过程的示例:
步骤 1:编写 Dockerfile
Dockerfile 是一个文本文件,其中包含有关如何构建映像的说明。在此示例中,我们将为基本 Node.js 应用程序创建一个 Dockerfile。
# 指定基础镜像
FROM node:14
# 设置容器内的工作目录
WORKDIR /app
# 将 package.json 和 package-lock.json 复制到容器中
COPY package*.json ./
# 安装依赖项
RUN npm install
# 复制应用程序代码复制到容器中
。。
# 公开端口(可选,如果您的应用程序需要)
EXPOSE 3000
# 定义运行应用程序的命令
CMD [ "npm" , "start" ]
在此 Dockerfile 中,我们从官方 Node.js 版本 14 基础映像开始。我们将容器内的工作目录设置为 /app 并将 package.json 和 package-lock.json 文件复制到容器中。然后,我们使用 npm install 安装应用程序依赖项。接下来,我们将其余的应用程序代码复制到容器中。(可选)我们公开端口 3000 以允许在需要时访问应用程序。最后,我们定义使用 npm start 运行应用程序的命令。
步骤 2:构建镜像
获得 Dockerfile 后,您可以使用 docker build 命令构建 Docker 镜像。打开终端,导航到包含 Dockerfile 和应用程序代码的目录,然后运行以下命令:
docker build -t my-node-app .my-node-app .
-t 标志允许您为图像指定标签。在本例中,我们将其命名为 my-node-app。这 。命令末尾的 表示 Dockerfile 和应用程序代码位于当前目录中。
此命令将使用 Dockerfile 中定义的指令构建 Docker 映像,并将应用程序及其依赖项打包到映像中。
步骤 3:运行容器
成功构建 Docker 映像后,您可以使用 docker run 命令从中运行容器。运行以下命令:
docker run -p 3000:3000 my-node-appp3000:3000 my-node-app
此命令基于 my-node-app 映像运行容器,并使用 -p 标志将容器的端口 3000 映射到主机的端口 3000。这允许您通过主机上的 localhost:3000 访问在容器内运行的应用程序。
您的 Node.js 应用程序现在应该在 Docker 容器内运行,您可以通过打开 Web 浏览器并导航到 localhost:3000 来访问它。
通过执行这些步骤,您已使用 Docker 成功构建并运行了容器化 Node.js 应用程序。这种方法提供了可移植性和一致性,使您可以轻松地在不同环境中打包和分发应用程序。
Docker 卷:管理数据持久性
在容器化环境中,数据持久性可能具有挑战性。Docker Volumes 通过提供一种在容器文件系统外部存储和管理数据的方法来解决这个问题,使其能够在容器重新启动后继续存在并在容器之间共享。这是一个例子:
docker run -v /path/on/host:/path/in/container my-node-app
在此命令中,我们使用 -v 标志来创建 Docker 卷。我们指定主机上的路径(/path/on/host)和容器内的相应路径(/path/in/container)。写入容器中该路径的任何数据都将存储在主机上的 Docker Volume 中,以确保持久性。
Docker 网络:连接容器
容器化应用程序通常需要容器之间的通信。Docker 提供网络功能来建立连接并实现无缝通信。默认情况下,容器可以使用其 IP 地址进行通信。不过,Docker 还提供用户定义的网络,以实现更好的控制和隔离。
这是一个例子:
docker network create my-networkmy-network
docker run --network my-network --name container1 my-node-app
docker run --network my-network --name container2 my-other-app
在此示例中,我们使用 docker network create 命令创建一个名为 my-network 的用户定义网络。然后,我们运行两个容器,container1和container2,并使用--network标志将它们连接到my-network。这允许容器使用各自的容器名称相互通信。
适用于 Docker 的最佳 GitHub 存储库
用于通过实时项目学习 Docker 的很棒的存储库
使用 Docker Compose 编排容器:
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序服务及其依赖项。在我们的示例中,我们将使用 Docker Compose 来编排 Node.js 应用程序和 PostgreSQL 数据库容器。
步骤 1:创建 Docker Compose 文件
在 Node.js 应用程序和 Dockerfile 所在的目录中创建一个名为 docker-compose.yml 的新文件。在文本编辑器中打开文件并定义应用程序和数据库的服务。
version:"3"
services:
web:
build:.
ports:
-3000:3000
depends_on:
-db
db:
image:postgres:12
在此 Docker Compose 文件中,我们定义了两个服务:用于 Node.js 应用程序的 web 和用于 PostgreSQL 数据库的 db。构建密钥指定 Web 服务的 Dockerfile 的路径,该路径设置为 . 来指示当前目录。ports 键将 Web 服务容器的端口 3000 映射到主机的端口 3000,从而允许访问 Node.js 应用程序。dependent_on 键确保 Web 服务在 db 服务之后启动。
步骤 2:运行 Docker Compose
要启动 Docker Compose 文件中定义的服务,请打开终端,导航到包含 docker-compose.yml 文件的目录,然后运行以下命令:
docker-compose up
此命令将构建必要的 Docker 映像、创建容器并启动 Docker Compose 文件中定义的服务。
您应该在终端中看到两个服务的输出,表明 Node.js 应用程序和 PostgreSQL 数据库正在运行。
步骤 3:访问应用程序
运行 Docker Compose 后,您可以通过 Web 浏览器中的 localhost:3000 访问 Node.js 应用程序,就像运行单个容器时一样。
Web 服务容器现已连接到数据库服务容器,允许您的 Node.js 应用程序与 PostgreSQL 数据库进行通信。这种编排简化了多容器应用程序及其依赖项的管理。
让我们包括与今天讨论的主题相关的顶级实时项目 特定面试问题!
-
Docker 如何帮助您开发和部署应用程序?
-
在您的项目中使用 Docker Volume 进行数据持久化有哪些优势?
-
您如何使用 Docker Volumes 管理项目中多个容器之间的数据一致性?
-
Docker 网络如何实现应用程序中容器之间的通信?
-
如何解决 Docker 化环境中容器之间的网络问题?
结论:
在这篇博文中,我们探讨了 Docker 和容器化的基础知识。我们学习了如何使用 Dockerfile 构建和运行容器,以及如何使用 Docker Compose 编排多个容器。Docker 容器化为应用程序部署提供了一种灵活且可扩展的方法。因此,继续探索和试验 Docker 以释放其全部潜力!
请继续关注第 7 天,我们将深入研究使用 Kubernetes 进行容器编排。 容器化快乐!
微信号 | HELLO程序员
视频号| iron.guo
