如何使用 docker-compose 快速部署 Docker 容器

DockerDockerBeginner
立即练习

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

简介

在本全面教程中,你将学习如何使用强大的docker-compose工具快速部署Docker容器。我们将引导你了解Docker架构、安装和配置Docker,以及开始使用Docker Compose。在本教程结束时,你将能够定义和配置多容器应用程序,使用Compose部署和管理Docker容器,并轻松扩展和联网你的Docker环境。让我们深入探索“docker-compose up -d”的强大功能,快速让你的应用程序运行起来!

Docker 与容器化简介

Docker 是一个广受欢迎的开源平台,可用于在容器化环境中开发、部署和管理应用程序。容器化是一种将应用程序及其依赖项打包并分发到称为容器的隔离且自包含单元中的方法。

什么是 Docker?

Docker 是一个软件平台,可让你在容器中构建、部署和运行应用程序。容器是轻量级、可移植且自包含的环境,其中包含应用程序运行所需的一切,例如代码、运行时、系统工具和库。这种方法可确保应用程序在从开发人员的笔记本电脑到生产服务器的不同计算环境中始终以相同的方式运行。

Docker 和容器化的优势

  • 一致性:无论底层基础架构如何,容器都能确保应用程序以相同的方式运行。
  • 可扩展性:可以轻松扩展或缩减容器以满足不断变化的需求。
  • 高效性:容器是轻量级的,比传统虚拟机更有效地使用资源。
  • 可移植性:容器可以在不同的计算环境之间移动,例如从开发人员的机器移动到生产服务器。
  • 隔离性:容器提供高度隔离,确保一个容器的进程不会干扰另一个容器的进程。

Docker 架构与组件

Docker 的架构由几个关键组件组成:

  • Docker 引擎:管理容器的核心运行时。
  • Docker 镜像:用于创建容器的蓝图,包含必要的文件、库和依赖项。
  • Docker 容器:运行应用程序的 Docker 镜像实例。
  • Docker 注册表:用于存储和分发 Docker 镜像的存储库。
graph TD A[Docker 引擎] --> B[Docker 镜像] A --> C[Docker 容器] A --> D[Docker 注册表]

Docker 的用例

Docker 在各个行业和场景中都有广泛应用,例如:

  • Web 应用程序:在不同环境中部署和扩展 Web 应用程序。
  • 微服务:构建和管理由小型独立服务组成的复杂分布式应用程序。
  • 持续集成与部署:自动化应用程序的构建、测试和部署。
  • 机器学习与数据科学:打包和部署机器学习模型及数据处理管道。
  • 物联网和边缘计算:在网络边缘部署应用程序和服务。

通过了解 Docker 和容器化的基础知识,你可以利用这些强大的工具简化应用程序开发、部署和管理流程。

理解 Docker 架构与组件

Docker 引擎

Docker 引擎是驱动整个 Docker 生态系统的核心运行时。它负责管理 Docker 容器的生命周期,包括构建、运行和监控容器。Docker 引擎由以下关键组件组成:

  • Docker 守护进程:管理 Docker 对象(如图像、容器、网络和卷)的后台进程。
  • Docker API:程序和工具用于与 Docker 守护进程进行交互的 API。
  • Docker CLI:允许用户与 Docker 守护进程进行交互的命令行界面。

Docker 镜像

Docker 镜像是创建 Docker 容器的蓝图。它们包含运行应用程序所需的必要文件、库和依赖项。Docker 镜像是使用 Dockerfile 构建的,Dockerfile 是一个基于文本的脚本,用于定义创建镜像的步骤。

以下是一个 Dockerfile 示例:

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

此 Dockerfile 基于 Ubuntu 22.04 基础镜像创建一个新镜像,安装 Nginx 网络服务器,将 index.html 文件复制到容器中,公开端口 80,并设置启动 Nginx 服务器的默认命令。

Docker 容器

Docker 容器是 Docker 镜像的实例。它们是运行应用程序的隔离环境。容器是轻量级且可移植的,因为它们将应用程序及其依赖项打包成一个单一的、自包含的单元。

你可以使用 docker run 命令创建并运行一个新容器:

docker run -d -p 80:80 --name my-nginx nginx

此命令基于 Nginx 镜像创建一个新容器,将主机上的端口 80 映射到容器中的端口 80,并以分离模式启动容器。

Docker 注册表

Docker 注册表是用于存储和分发 Docker 镜像的存储库。它允许你上传、下载并与他人共享 Docker 镜像。最流行的公共 Docker 注册表是 Docker Hub,但你也可以设置自己的私有注册表。

通过了解 Docker 架构的关键组件,你可以有效地构建、部署和管理你的容器化应用程序。

在你的系统上安装和配置 Docker

在 Ubuntu 22.04 上安装 Docker

要在 Ubuntu 22.04 系统上安装 Docker,请遵循以下步骤:

  1. 更新软件包索引并安装必要的依赖项:

    sudo apt-get update
    sudo apt-get install -y \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  2. 添加官方 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
  3. 安装 Docker 引擎、containerd 和 Docker Compose 软件包:

    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  4. 通过运行 docker version 命令验证安装:

    sudo docker version

配置 Docker

安装 Docker 后,你可以根据需要对其进行配置。以下是一些常见的配置任务:

以非 root 用户身份管理 Docker

默认情况下,Docker 守护进程以 root 用户身份运行。要允许非 root 用户运行 Docker 命令,你可以将他们添加到 docker 组:

sudo usermod -aG docker $USER
newgrp docker

配置 Docker 守护进程选项

你可以通过编辑 /etc/docker/daemon.json 文件来自定义 Docker 守护进程的行为。例如,要更改默认日志驱动程序:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

启用 Docker Compose

Docker Compose 是一个用于定义和运行多容器应用程序的工具。它作为 Docker 安装的一部分进行安装,但你可能需要手动启用它:

sudo systemctl enable docker-compose-plugin

通过遵循这些步骤,你可以在 Ubuntu 22.04 系统上成功安装和配置 Docker,为使用 Docker 和 Docker Compose 奠定基础。

开始使用 Docker Compose

什么是 Docker Compose?

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你创建一个 YAML 文件,描述构成你的应用程序的服务、网络和卷,然后使用单个命令来启动、停止和管理所有服务。

安装 Docker Compose

在 Ubuntu 22.04 上,Docker Compose 作为 Docker 安装的一部分进行安装。你可以通过运行以下命令来验证安装:

docker-compose version

编写 Docker Compose 文件

Docker Compose 文件是一个 YAML 文件,用于定义构成你的应用程序的服务、网络和卷。以下是一个 docker-compose.yml 文件示例,它定义了一个带有 Nginx 网络服务器和 MySQL 数据库的简单 Web 应用程序:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes: -./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

此文件定义了两个服务:webdbweb 服务使用最新的 Nginx 镜像,公开端口 80,并将本地 html 目录挂载到 Nginx 文档根目录。db 服务使用 MySQL 5.7 镜像,设置根密码,并为 MySQL 数据挂载一个命名卷。

管理 Docker Compose 应用程序

你可以使用 docker-compose 命令来管理你的 Docker Compose 应用程序。以下是一些常见命令:

  • docker-compose up -d:以分离模式启动应用程序。
  • docker-compose down:停止并移除应用程序。
  • docker-compose ps:列出正在运行的服务。
  • docker-compose logs:查看应用程序的日志。
  • docker-compose scale web=3:将 web 服务扩展到 3 个实例。

通过使用 Docker Compose,你可以轻松地定义、部署和管理多容器应用程序,使其成为简化 Docker 工作流程的强大工具。

定义和配置多容器应用程序

在 Docker Compose 中定义服务

在 Docker Compose 文件中,你要定义应用程序的服务,这些服务代表构成应用程序的各个容器。每个服务都有其自己的配置,例如要使用的 Docker 镜像、环境变量、要公开的端口以及要挂载的卷。

以下是一个多服务 Docker Compose 文件的示例:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes: -./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
volumes:
  mysql-data:

此文件定义了三个服务:“web”、“db”和“redis”。每个服务都有其自己的配置,例如要使用的 Docker 镜像、要公开的端口以及要挂载的卷。

配置服务依赖项

你可以使用 Docker Compose 文件中的 depends_on 指令来定义服务之间的依赖项。这可确保服务按正确的顺序启动,并且在启动服务之前满足依赖项。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes: -./html:/usr/share/nginx/html
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

在此示例中,“web”服务依赖于“db”服务,因此数据库将在 Web 服务器之前启动。

配置网络和卷

除了定义服务之外,你还可以在 Docker Compose 文件中配置网络和卷。网络允许你的服务相互通信,而卷为你的应用程序数据提供持久存储。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes: -./html:/usr/share/nginx/html
    networks:
      - frontend
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend
volumes:
  mysql-data:
networks:
  frontend:
  backend:

在此示例中,“web”服务连接到“frontend”网络,“db”服务连接到“backend”网络。这允许 Web 服务器与数据库通信,而无需将数据库直接暴露给公共互联网。

通过了解如何使用 Docker Compose 定义和配置多容器应用程序,你可以轻松构建复杂、可扩展且易于维护的应用程序。

使用 Compose 部署和管理 Docker 容器

部署 Docker Compose 应用程序

要部署 Docker Compose 应用程序,你可以使用 docker-compose up 命令。此命令读取 Docker Compose 文件,创建必要的网络和卷,并启动指定的服务。

docker-compose up -d

-d 标志以分离模式运行容器,这意味着它们在后台运行。

管理 Docker Compose 容器

一旦你的 Docker Compose 应用程序运行起来,你可以使用以下命令来管理容器:

  • docker-compose ps:列出正在运行的容器。
  • docker-compose logs:查看容器的日志。
  • docker-compose stop:停止正在运行的容器。
  • docker-compose start:启动已停止的容器。
  • docker-compose down:停止并移除容器、网络和卷。

例如,要查看 web 服务的日志:

docker-compose logs web

扩展 Docker Compose 服务

Docker Compose 使你能够轻松地扩展服务的规模,增加或减少实例数量。你可以使用 docker-compose scale 命令来更改特定服务的实例数量。

docker-compose scale web=3

此命令会将 web 服务扩展到 3 个实例。

更新 Docker Compose 应用程序

当你需要更新 Docker Compose 应用程序时,你可以对 Docker Compose 文件进行更改,然后使用 docker-compose up 命令来应用这些更改。

## 更新 Docker Compose 文件
vim docker-compose.yml

## 应用更改
docker-compose up -d

Docker Compose 将自动拉取新镜像,创建新容器,并更新正在运行的应用程序。

通过利用 Docker Compose 的强大功能,你可以轻松地部署、管理和扩展多容器应用程序,使开发和部署过程更加高效和可靠。

扩展 Docker 容器及网络配置

扩展 Docker 容器

使用 Docker 的一个主要优势在于能够轻松地根据不断变化的需求扩展应用程序的规模,扩大或缩小实例数量。Docker Compose 通过提供 scale 命令,使这个过程变得更加简单。

要在 Docker Compose 应用程序中扩展某个服务,你可以使用以下命令:

docker-compose scale web=3

这会将 web 服务扩展到 3 个实例。你可以通过将 web 替换为你想要扩展的服务名称,来扩展应用程序中的任何服务。

Docker 容器的网络配置

Docker Compose 会自动为你的应用程序创建一个默认网络,但你也可以定义自定义网络,以控制服务之间的通信方式。

以下是一个 Docker Compose 文件示例,它定义了两个自定义网络,即 frontendbackend

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - frontend
  app:
    image: myapp:latest
    networks:
      - frontend
      - backend
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      - backend
networks:
  frontend:
  backend:

在此示例中,webapp 服务连接到 frontend 网络,而 appdb 服务连接到 backend 网络。这样一来,Web 服务器就能与应用程序通信,应用程序也能与数据库通信,同时又不会将数据库直接暴露给公共互联网。

你还可以使用 Docker Compose 文件的 networks 部分来配置网络级别的设置,例如 IP 地址范围和 DNS 设置。

通过了解如何扩展 Docker 容器以及配置其网络,你可以构建高可用性、可扩展且安全的应用程序,使其能够适应不断变化的需求和要求。

Docker 部署与维护的最佳实践

优化 Docker 镜像

  • 使用最小化的基础镜像(例如 alpinescratch)来减小镜像大小并降低攻击面。
  • 利用多阶段构建来优化最终镜像大小。
  • 通过定期更新基础镜像和依赖项来保持镜像为最新状态。
  • 使用像 dive 这样的工具来分析和优化你的 Docker 镜像。

实施安全措施

  • 使用可信赖的官方 Docker 镜像仓库(例如 Docker Hub)来拉取镜像。
  • 使用 Snyk 或 Trivy 等工具扫描镜像中的漏洞。
  • 通过以非 root 用户身份运行容器来应用最小权限原则。
  • 启用 Docker Content Trust 来验证镜像的完整性和真实性。
  • 根据最佳实践配置 Docker 守护进程和容器安全设置。

自动化构建和部署流程

  • 使用像 LabEx 这样的持续集成(CI)工具来自动化 Docker 应用程序的构建、测试和部署。
  • 通过将 Docker Compose 文件存储在版本控制系统中来实现 GitOps 工作流程。
  • 使用特定于环境的配置文件或环境变量来管理不同的部署环境。

监控和维护 Docker 环境

  • 为你的 Docker 容器和主机设置日志记录和监控。
  • 使用 Prometheus、Grafana 或 LabEx 等工具来监控容器和系统指标。
  • 定期审查和更新你的 Docker Compose 文件和容器配置。
  • 实施一个用于优雅处理容器故障和重启的流程。

利用 Docker 生态系统工具

  • 使用 Docker Swarm 或 Kubernetes 来大规模编排和管理 Docker 容器。
  • 探索 Docker Secrets、Docker Volumes 和 Docker Networks 等工具来增强你的 Docker 部署。
  • 集成 LabEx 或其他 DevOps 平台来简化基于 Docker 的工作流程。

通过遵循这些最佳实践,你可以确保你的 Docker 部署是安全、高效且可维护的,从而帮助你充分利用 Docker 平台。

总结

在本教程中,你已经学习了如何使用docker-compose工具快速部署Docker容器。你探索了Docker架构,安装并配置了Docker,还掌握了定义和配置多容器应用程序的技巧。通过利用“docker-compose up -d”的强大功能,你现在可以轻松地部署和管理你的Docker环境,扩展你的应用程序,并确保最佳的网络配置。凭借从本教程中学到的知识,你已做好充分准备来简化你的Docker部署流程,并将你的容器化工作提升到新的高度。