如何在内部主机上部署 Docker 容器

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面教程将指导你在内部主机上部署 Docker 容器的过程。无论你是 Docker 新手还是有经验的用户,你都将学习如何安装 Docker、创建和配置容器,以及在组织的基础架构中有效地管理它们。在本指南结束时,你将掌握利用 Docker 的强大功能在内部主机上简化应用程序部署和管理的知识和技能。

理解 Docker 容器

Docker 是一个广受欢迎的开源平台,它使用容器来实现应用程序的开发、部署和管理。容器是轻量级、独立且可执行的软件包,其中包含运行应用程序所需的所有必要依赖项、库和配置。

什么是 Docker 容器?

Docker 容器是一种将应用程序及其所有依赖项打包成单个可移植单元的方式,该单元可以轻松地部署并在任何安装了 Docker 的系统上运行。容器为运行应用程序提供了一致且可靠的环境,确保应用程序无论在何种底层基础架构上运行,其行为都是相同的。

Docker 容器的优点

  1. 可移植性:Docker 容器可以轻松地在不同环境(如开发、测试和生产环境)之间移动,而无需担心兼容性问题。
  2. 可扩展性:可以根据应用程序的资源需求轻松地扩大或缩小 Docker 容器的规模,从而更轻松地应对需求波动。
  3. 高效性:Docker 容器比传统虚拟机更轻量级、更高效,因为它们共享主机操作系统,并且只包含应用程序运行所需的必要组件。
  4. 一致性:Docker 容器确保应用程序在不同环境中以相同方式运行,降低了出现意外行为或错误的风险。

Docker 容器架构

graph TD A[Docker 主机] --> B[Docker 引擎] B --> C[Docker 镜像] B --> D[Docker 容器] D --> E[应用程序]

Docker 容器架构的关键组件包括:

  • Docker 主机:运行 Docker 引擎并承载 Docker 容器的物理机或虚拟机。
  • Docker 引擎:Docker 平台的核心,负责管理 Docker 容器的创建、执行和生命周期。
  • Docker 镜像:用于创建 Docker 容器的模板,包含应用程序代码、依赖项和配置。
  • Docker 容器:Docker 镜像的运行实例,封装了应用程序及其依赖项。

Docker 容器部署工作流程

  1. 构建 Docker 镜像:通过在 Dockerfile 中定义应用程序的依赖项、配置和构建指令来创建 Docker 镜像。
  2. 推送 Docker 镜像:将 Docker 镜像上传到容器注册表(如 Docker Hub 或私有注册表),以便可以进行部署。
  3. 部署 Docker 容器:从注册表中拉取 Docker 镜像,并在目标 Docker 主机上作为容器运行它。
  4. 管理和监控容器:管理运行中容器的生命周期,包括扩展、更新以及监控它们的性能和健康状况。

通过了解 Docker 容器的基础知识,你可以开始探索如何在内部主机上部署和管理它们,后续章节将对此进行介绍。

在内部主机上安装 Docker

前提条件

在内部主机上安装 Docker 之前,请确保你具备以下条件:

  • 基于 Linux 的操作系统(例如 Ubuntu 22.04)
  • 具有安装和配置 Docker 的 root 或 sudo 权限

在 Ubuntu 22.04 上安装 Docker

  1. 更新软件包索引并安装必要的依赖项:
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 添加官方 Docker GPG 密钥并设置 Docker 仓库:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装 Docker 引擎、Docker CLI 和 Docker Compose:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 通过运行以下命令验证安装:
sudo docker run hello-world

这将下载一个测试镜像并在容器中运行它,确认 Docker 已安装并正常运行。

为内部主机配置 Docker

  1. 网络配置:默认情况下,Docker 使用 bridge 网络驱动程序,它为容器创建一个专用网络。如果你需要从其他主机或互联网访问容器,则需要相应地配置网络设置。
  2. 存储配置:Docker 默认将容器数据存储在 /var/lib/docker 目录中。你可以根据需要配置存储驱动程序和位置,例如使用专用存储卷或网络附加存储。
  3. 用户权限:为了避免每次运行 Docker 命令时都使用 sudo,你可以将你的用户账户添加到 docker 组:
sudo usermod -aG docker $USER

然后,注销并重新登录以使更改生效。4. 代理配置:如果你的内部主机需要代理才能访问互联网,则需要配置 Docker 守护进程以使用代理设置。这可以通过创建一个 systemd 配置文件来完成。

通过遵循这些步骤,你可以在内部主机上成功安装 Docker,并为部署 Docker 容器做好准备。

创建和配置 Docker 容器

构建 Docker 镜像

要创建一个 Docker 容器,你首先需要构建一个 Docker 镜像。这是通过在 Dockerfile 中定义应用程序的依赖项、配置和构建指令来完成的。

以下是一个简单的 Node.js 应用程序的 Dockerfile 示例:

## 使用官方 Node.js 镜像作为基础
FROM node:14

## 将工作目录设置为 /app
WORKDIR /app

## 复制 package.json 和 package-lock.json 文件
COPY package*.json./

## 安装应用程序依赖项
RUN npm install

## 复制应用程序代码
COPY..

## 构建应用程序
RUN npm run build

## 暴露应用程序端口
EXPOSE 3000

## 启动应用程序
CMD ["npm", "start"]

你可以使用以下命令构建 Docker 镜像:

docker build -t my-node-app.

这将根据当前目录中的 Dockerfile 创建一个名为 my-node-app 的新 Docker 镜像。

运行 Docker 容器

要从你刚刚创建的镜像运行 Docker 容器,请使用以下命令:

docker run -d -p 8080:3000 --name my-node-container my-node-app

此命令:

  • 以分离模式运行容器 (-d)
  • 将主机的端口 8080 映射到容器的端口 3000 (-p 8080:3000)
  • 为运行中的容器分配名称 my-node-container
  • 使用 my-node-app 镜像启动容器

配置 Docker 容器

你可以配置 Docker 容器的各个方面,例如:

  1. 环境变量:使用 -e--env 标志设置环境变量,例如 docker run -e DB_PASSWORD=mypassword...
  2. :使用 -v--volume 标志将主机目录或命名卷挂载到容器,例如 docker run -v /host/path:/container/path...
  3. 网络配置:使用 --network 标志将容器连接到特定网络,例如 docker run --network my-network...
  4. 资源限制:使用 --cpus--memory--blkio-weight 标志为容器设置资源限制,例如 CPU、内存或 I/O,例如 docker run --cpus 2 --memory 512m...

通过了解如何构建 Docker 镜像并使用各种配置运行 Docker 容器,你可以开始在内部主机上部署你的应用程序。

在内部主机上部署 Docker 容器

准备内部主机

在内部主机上部署 Docker 容器之前,请确保你已完成以下步骤:

  1. 按照上一节所述,在内部主机上安装 Docker。
  2. 确保内部主机具有必要的网络连接和防火墙规则,以访问任何所需资源,如数据库、外部服务或互联网(如有需要)。
  3. (可选)如果你不想使用像 Docker Hub 这样的公共注册表,可以设置一个私有容器注册表来存储你的 Docker 镜像。

部署 Docker 容器

根据你的特定需求和基础架构设置,有几种方法可以在内部主机上部署 Docker 容器。

使用 Docker CLI

在内部主机上直接使用 Docker 命令行界面(CLI)是部署 Docker 容器最简单的方法。以下是如何部署你之前创建的 my-node-app 容器的示例:

docker run -d -p 8080:3000 --name my-node-container my-node-app

此命令将以分离模式启动容器,并将主机的端口 8080 映射到容器的端口 3000。

使用 Docker Compose

对于包含多个容器和服务的更复杂部署,你可以使用 Docker Compose。创建一个 docker-compose.yml 文件,定义服务及其配置,然后使用以下命令部署堆栈:

docker-compose up -d

这将以分离模式启动 docker-compose.yml 文件中定义的所有容器。

使用容器编排平台

对于大规模的、可用于生产的部署,你可能希望使用容器编排平台,如 Kubernetes 或 LabEx 平台。这些平台提供了用于在多个主机上管理、扩展和监控 Docker 容器的高级功能。

要使用容器编排平台部署 Docker 容器,你需要定义必要的配置文件(例如 Kubernetes 清单),并使用平台的 CLI 或基于 Web 的界面来部署容器。

验证部署

部署 Docker 容器后,你可以使用以下命令验证它们的状态并访问正在运行的应用程序:

## 列出正在运行的容器
docker ps

## 查看容器日志
docker logs my-node-container

## 访问正在运行的应用程序
curl http://localhost:8080

通过遵循这些步骤,你可以在内部主机上成功部署你的 Docker 容器,并使它们可供用户或其他应用程序访问。

管理和监控 Docker 容器

管理 Docker 容器

一旦你的 Docker 容器部署完成,你需要管理它们的生命周期,包括启动、停止、扩展和更新。以下是一些常见的 Docker 管理命令:

## 启动容器
docker start my-node-container

## 停止容器
docker stop my-node-container

## 重启容器
docker restart my-node-container

## 扩大/缩小容器副本数量
docker scale my-node-container=3

## 使用新镜像更新容器
docker pull my-node-app:v2
docker stop my-node-container
docker run -d -p 8080:3000 --name my-node-container my-node-app:v2

监控 Docker 容器

监控 Docker 容器的健康状况和性能对于确保应用程序的可靠性和可扩展性至关重要。你可以使用各种工具和技术来监控你的 Docker 环境:

Docker CLI

Docker CLI 提供了基本的监控命令,例如:

## 列出正在运行的容器
docker ps

## 查看容器日志
docker logs my-node-container

## 检查容器详细信息
docker inspect my-node-container

Docker 指标

Docker 提供了内置指标,你可以使用 Docker API 或通过与监控工具集成来访问这些指标。你可以收集容器的 CPU、内存、网络和存储使用情况等指标。

第三方监控工具

你可以使用第三方监控工具,如 LabEx 平台、Prometheus 或 Grafana,来收集和可视化更高级的 Docker 指标。这些工具可以帮助你监控 Docker 环境的整体健康状况和性能。

以下是如何使用 LabEx 平台监控你的 Docker 容器的示例:

graph TD A[内部主机] --> B[Docker 容器] B --> C[LabEx 代理] C --> D[LabEx 平台] D --> E[监控仪表板]

LabEx 平台为 Docker 环境提供了全面的监控解决方案,使你能够跟踪容器级指标、设置警报并生成自定义报告。

通过利用这些管理和监控工具,你可以有效地维护和优化在内部主机上运行的 Docker 容器。

Docker 容器的网络与存储

Docker 容器的网络

Docker 提供了多种网络驱动程序来连接和隔离你的容器,包括:

  1. 桥接网络:默认的网络驱动程序,它为主机上的容器创建一个专用网络。
  2. 主机网络:允许容器使用主机的网络堆栈,有效地消除网络隔离。
  3. 覆盖网络:实现跨多个 Docker 主机的容器之间的通信,对于集群和编排很有用。
  4. Macvlan 网络:允许为容器分配 MAC 地址,使它们在网络上看起来像物理设备。

你可以使用以下命令创建和管理 Docker 网络:

## 创建一个新的桥接网络
docker network create my-network

## 将一个容器连接到网络
docker run -d --name my-container --network my-network my-node-app

## 检查一个网络
docker network inspect my-network

Docker 容器的存储

默认情况下,Docker 容器使用主机的文件系统来存储数据,但此数据是临时的,当容器被删除时将丢失。为了持久化数据,你可以使用 Docker 卷,它独立于容器的生命周期。

有几种类型的 Docker 卷:

  1. 命名卷:具有唯一名称的卷,由 Docker 管理。
  2. 绑定挂载:将主机上的一个目录映射到容器中的一个目录。
  3. tmpfs 挂载:在容器的内存中创建一个临时文件系统。

以下是创建一个命名卷并将其挂载到容器的示例:

## 创建一个命名卷
docker volume create my-volume

## 使用命名卷运行一个容器
docker run -d --name my-container -v my-volume:/app my-node-app

你还可以使用网络附加存储(NAS)或云存储服务为你的 Docker 容器提供持久存储。

通过了解 Docker 的网络和存储选项,你可以确保你的容器正确连接,并且它们的数据能够可靠地存储和访问。

Docker 容器部署的最佳实践

在内部主机上部署 Docker 容器时,遵循最佳实践对于确保应用程序的可靠性、安全性和可扩展性非常重要。以下是一些需要考虑的关键最佳实践:

对所有内容进行容器化

采用“对所有内容进行容器化”的方法,将所有应用程序和服务打包为 Docker 容器。这可确保在不同环境中的一致性、可移植性以及更轻松的管理。

使用不可变基础设施

将你的 Docker 容器视为不可变基础设施,这意味着你绝不应该直接对正在运行的容器进行更改。相反,更新 Dockerfile 并重新构建镜像以部署更改。

优化 Docker 镜像

通过以下方式优化你的 Docker 镜像:

  • 使用尽可能小的基础镜像
  • 尽量减少 Dockerfile 中的层数
  • 利用多阶段构建来减小镜像大小
  • 定期扫描和更新基础镜像以查找安全漏洞

实施安全实践

通过以下方式确保 Docker 环境的安全:

  • 对 Docker 镜像进行签名和验证
  • 扫描镜像以查找漏洞
  • 限制容器的权限和功能
  • 启用 AppArmor 或 SELinux 等安全功能

安全地管理机密信息

使用安全的机密信息管理解决方案,如 LabEx Vault 或 HashiCorp Vault,来存储和管理敏感信息,如 API 密钥、数据库凭据或 SSL/TLS 证书。

监控和记录容器

为你的 Docker 容器实施全面的监控和日志记录,以确保了解它们的健康状况、性能以及可能出现的任何问题。像 LabEx 平台这样的工具可以在这方面提供很大帮助。

使用容器编排

对于可用于生产的部署,利用容器编排平台,如 LabEx 平台或 Kubernetes,来管理 Docker 容器的扩展、高可用性和生命周期。

自动化部署工作流程

使用 Docker Compose、Jenkins 或 LabEx 平台等工具自动化你的 Docker 容器部署工作流程,以确保一致性、可重复性和效率。

通过遵循这些最佳实践,你可以确保在内部主机上的 Docker 容器部署是可靠、安全且可扩展的。

总结

在本教程中,你已经学习了如何在内部主机上部署 Docker 容器。你涵盖了从安装 Docker 到创建、配置和管理 Docker 容器的基本步骤。通过遵循这些最佳实践,你现在可以有效地利用 Docker 的优势,简化在内部主机上的应用程序部署和管理。凭借所学知识,你可以继续探索和扩展你的 Docker 技能,以进一步增强组织的基础设施和工作流程。