Docker Compose 基础知识(三)

Docker Compose 基础知识

什么是 Docker Compose ?

Docker Compose 是 Docker 官方提供的一个工具,用于定义和管理多个 Docker 容器的应用程序。它基于 YAML 文件格式,允许你通过
一个定义文件来描述和配置整个应用程序的组件,包括容器、网络、存储卷等。

Docker Compose 基本概念

  • Compose 文件 :Compose 文件是一个 YAML 格式的文本文件,用于定义应用程序的组件、配置和依赖关系。在 Compose 文件中,你可以指
    定容器的镜像、端口映射、环境变量、网络设置等。

  • 服务 (Services): Compose 文件中的每个容器被称为一个服务。服务定义了一个容器实例的配置和行为,并可以包含多个容器实例。每个服务
    可以基于一个或多个镜像构建。

  • 堆栈(Stack): Compose 文件中的一组服务被称为一个堆栈。堆栈是一个完整的应用程序,由多个相互关联的服务组成。

  • 网络(Networks): Compose 文件中可以定义自定义网络,用于连接堆栈中的服务。这样,堆栈内的服务可以相互通信,而堆栈之外的服务则无法访问。

  • 存储卷(Volumes): Compose 文件中可以定义存储卷,用于容器之间共享数据。

  • 命令行工具: Docker Compose 提供了一组命令行工具,用于构建、启动、停止和管理应用程序堆栈。你可以使用 docker-compose 命令来执行这些操作。

Docker Compose 工作原理:

是基于定义文件的描述和配置。通过运行 docker-compose up 命令,Compose 会解析 Compose 文件,并根据文件中的定义创
建和管理容器。Compose 会自动创建所需的网络、存储卷等资源,并将服务之间的相互依赖关系和通信配置好。

通过 Docker Compose,你可以轻松地管理多个容器组成的应用程序,并且可以通过一个简单的定义文件来描述整个应用程序的结构和配置。

Dockers Compose 学习示例

  • 创建 Docker Compose 文件 docker-compose.yml
version: '3'
services:
  backend:
    image: backend-image
    ports:
      - 8080:8080
    environment:
      - ENV_VAR=value  
    networks:
      - my-network
  frontend:
    image: frontend-image
    ports:
      - 80:80
    depends_on:
      - backend  
    networks:
      - my-network
  services:
    db:
        image: mysql
        volumes:
        - my-volume:/var/lib/mysql  
networks:
  my-network:
    driver: bridge
    external: true

volumes:
  my-volume:
   external: true

version: '3' 表示使用 Compose 文件的版本 3。

services 下定义了两个服务:backend 和 frontend。

每个服务都指定了镜像名称(使用自定义的镜像名称替换 backend-image 和 frontend-image)。

environment  参数来设置容器的环境变量。

ports 定义了容器端口与主机端口之间的映射,用于访问服务。

depends_on 参数来设置容器之间的依赖关系,在服务的配置中,通过 depends_on 参数指定依赖的服务名称,确保依赖的服务在当前服务之前
启动,frontend 服务依赖于 backend 服务。这意味着在启动 frontend 服务之前,会先启动 backend 服务。

networks 定义了自定义的网络 my-network,用于连接服务之间的通信。

external: true 是在 Docker Compose 文件中定义网络或卷时的一个属性,用于指示使用外部资源而不是在当前文件中创建新的资源。

具体来说:

当 external: true 应用于网络时,表示使用已经存在的外部网络,而不是在当前文件中创建新的网络。这可以用于多个 Docker Compose 文件之
间共享网络,或者使用外部的 Docker 网络。

当 external: true 应用于卷时,表示使用已经存在的外部卷,而不是在当前文件中创建新的卷。这可以用于多个容器组之间共享数据卷,或者使用
外部的数据卷。

使用 external: true 可以方便地在 Docker Compose 文件中引用外部资源,而不需要在当前文件中重复定义已经存在的网络或卷。这提供了更多的
灵活性和可重用性,使得多个容器组之间可以共享和重用资源。
  • docker-compose up启动
执行命令: docker compose up -d

应用程序堆栈将会启动,后端服务将监听主机的 8080 端口,前端服务将监听主机的 80 端口。

你可以通过访问 http://localhost:80 来访问前端服务,以及通过访问 http://localhost:8080 来访问后端服务。

Docekr Compose 命令

使用 Docker Compose 可以方便地管理和操作容器组。以下是关于使用 Docker Compose 启动和停止容器组的方法:

在包含 docker-compose.yml 文件的目录中执行命令:

使用 docker compose up 启动容器组:

Docker Compose 会根据配置文件中定义的服务和容器设置,自动创建并启动相关的容器。
日志输出将会显示在终端上,可以使用 Ctrl + C 组合键停止容器组。

使用 `docker compose down ` 停止和删除容器组:

Docker Compose 会停止并删除相关的容器、网络和卷。


这两个命令不会删除容器,只是启动或停止已经存在的容器。


docker compose ps 命令来查看容器组中运行的容器的状态。


使用 docker compose exec 命令在容器组中执行命令:
docker compose logs  --tail=50 命令查看容器组的日志信息:可以使用 --tail 参数来限制显示的行数


docker compose exec <服务名称> <命令> 命令在容器组中执行特定服务的命令。

例如,要在名为 web 的服务容器中执行命令 ls -l,可以执行 docker compose exec web ls -l。

使用 Docker Compose 可以简化管理多个容器的过程,并提供了一种便捷的方式来定义、启动和停止容器组。对于复杂的应用程序或多容器
的架构,使用 Docker Compose 可以更好地组织和管理容器环境。

Docker Compose 扩展和更新容器组

  • 扩展容器组

在 Docker Compose 文件中,可以通过调整容器组的副本数来扩展容器组。通过增加容器的副本数,可以实现更高的并发处理能力和负载均衡。
在服务定义中,使用 replicas 关键字来指定容器的副本数

version: "3"
services:
  app:
    image: my-app
    deploy:
      replicas: 3

replicas 属性指定了 app 服务的副本数为 3,这将创建和管理 3 个具有相同镜像和配置的容器副
  • 更新容器组

更新容器组可能包括更新镜像、重新构建容器等操作。
更新镜像:在 Docker Compose 文件中,将容器的 image 属性指定为新的镜像名称或标签。然后使用 docker-compose up 命令重新构建和启
动容器组。Docker Compose 会自动检测到镜像的变化,并更新容器组。

重新构建容器:如果需要重新构建容器,可以使用 docker compose build 命令。它会根据 Docker Compose 文件中的定义重新构建容器。

version: "3"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile

在扩展和更新容器组时,可以根据实际需求进行调整。通过增加容器的副本数来扩展容器组,可以提高容器组的性能和可伸缩性。通过更新镜像
或重新构建容器,可以使用新的代码或配置来更新容器组。

Docker 安全机制

Docker 提供了一些安全机制和功能来管理用户、隔离容器和限制资源使用。

用户和用户组管理:

  • Docker 允许在容器内部使用不同的用户和用户组来运行进程。可以使用 USER 指令在 Dockerfile 中指定容器内的用户或用户组。

  • 通过将容器内的进程与特定的用户或用户组关联,可以限制容器内进程的权限,提高容器的安全性。

命名空间和控制组:

  • Docker 使用 Linux 内核的命名空间和控制组功能来实现容器的隔离和资源限制。
  • 命名空间提供了进程、网络、文件系统和用户等方面的隔离,使得容器内的进程无法感知和访问其他容器的资源。
  • 控制组用于限制容器可以使用的资源,如 CPU、内存、磁盘和网络带宽等。

容器的权限和访问控制:

  • 可以使用 --cap-drop 和 --cap-add 参数来限制容器内进程的特权。
  • 可以使用 --security-opt 参数来设置容器的安全选项,如 SELinux 标签、AppArmor 配置等。
  • 可以使用 --ulimit 参数来限制容器的资源使用,如最大 CPU 使用时间、内存限制等。
可用于增强容器的安全性,限制容器内进程的特权级别。
docker run --cap-drop=SYS_ADMIN ubuntu:latest
docker run --cap-add=NET_ADMIN nginx:latest

使用不同的选项来启用或禁用特定的安全功能,如 SELinux 标签或 AppArmor 配置等。
docker run --security-opt=label=disable alpine:latest
docker run --security-opt=apparmor=docker-nginx-profile nginx:latest

它来限制容器的资源使用,如最大 CPU 使用时间、内存限制等。
docker run --ulimit cpu=1 --ulimit mem=512m my-app:latest

你可能感兴趣的:(docker,容器,运维)