• 使用Docker Compose


    Docker Compose是一种用于帮助定义和共享多容器应用程序的工具。使用 Compose,我们可以创建一个 YAML 文件来定义服务,并且使用一个命令,可以启动所有内容或将其全部关闭。

    使用 Compose的一大优势是你可以在文件中定义应用程序堆栈,将其保存在项目的根目录中(它现在是版本控制的),并且可以轻松地让其他人为你的项目做出贡献。有人只需要克隆你的存储库并启动撰写应用程序。事实上,你现在可能会在 GitHub/GitLab 上看到不少项目正是这样做的。

    如果 Windows 或 Mac 安装了 Docker Desktop,那么就已经安装 Docker Compose

    查看版本信息:

    $docker-compose version
    
    • 1

    image-20220622105212007

    **docker-ompose 1.27.0+**合并了compose文件的 2.x 和 3.x 版本

    创建 Compose 文件

    1、在 app 项目的根目录下,创建一个名为docker-compose.yml.

    2、在撰写文件中,我们将从定义模式版本开始。在大多数情况下,最好使用支持的最新版本。你可以查看当前架构版本和兼容性矩阵的Compose 文件参考。

     version: "3.7"
    
    • 1

    3、接下来,我们将定义我们希望作为应用程序的一部分运行的服务(或容器)列表。

     version: "3.7"
    
     services:
    
    • 1
    • 2
    • 3

    现在,我们将开始一次将一个服务迁移到 compose 文件中。

    定义应用服务

    下面是我们用来定义应用容器的命令

    $ docker run -dp 3000:3000 \
      -w /app -v "$(pwd):/app" \
      --network todo-app \
      -e MYSQL_HOST=mysql \
      -e MYSQL_USER=root \
      -e MYSQL_PASSWORD=secret \
      -e MYSQL_DB=todos \
      node:12-alpine \
      sh -c "yarn install && yarn run dev"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果你使用的是 PowerShell,请使用以下命令:

    PS> docker run -dp 3000:3000 `
      -w /app -v "$(pwd):/app" `
      --network todo-app `
      -e MYSQL_HOST=mysql `
      -e MYSQL_USER=root `
      -e MYSQL_PASSWORD=secret `
      -e MYSQL_DB=todos `
      node:12-alpine `
      sh -c "yarn install && yarn run dev"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1、首先,为容器定义服务入口和镜像。

    我们可以为服务选择任何名称,该名称将自动成为网络别名,这在定义我们的 MySQL 服务时非常有用。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、排序没有具体要求,所以你会看到command紧接着image定义的内容。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、让我们通过定义服务的端口ports来迁移命令的-p 3000:3000部分。我们将在这里使用 短语法,但也有更详细 的长语法可用。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、接下来,我们将使用 working_dirvolumes定义迁移工作目录 (-w /app) 和数据卷映射 (-v "$(pwd):/app")

    Volumes 也有短句长句

    Docker Compose 数据卷定义的一个优点是我们可以使用当前目录的相对路径。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
         working_dir: /app
         volumes:
           - ./:/app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5、最后,我们需要使用environment键迁移环境变量定义。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
         working_dir: /app
         volumes:
           - ./:/app
         environment:
           MYSQL_HOST: mysql
           MYSQL_USER: root
           MYSQL_PASSWORD: secret
           MYSQL_DB: todos
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    定义 MySQL 服务

    定义 MySQL 服务的命令如下:

    $ docker run -d \
      --network todo-app --network-alias mysql \
      -v todo-mysql-data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=secret \
      -e MYSQL_DATABASE=todos \
      mysql:5.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果你使用的是 PowerShell,请使用以下命令:

    PS> docker run -d `
      --network todo-app --network-alias mysql `
      -v todo-mysql-data:/var/lib/mysql `
      -e MYSQL_ROOT_PASSWORD=secret `
      -e MYSQL_DATABASE=todos `
      mysql:5.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1、我们将首先定义新服务并将其命名为 mysql,以便它自动获取网络别名。我们将继续并指定要使用的图像。

     version: "3.7"
    
     services:
       app:
         # 应用服务定义
       mysql:
         image: mysql:5.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、接下来,我们将定义数据卷映射。当我们使用 docker run 运行容器时,会自动创建命名卷。但是,在使用 Compose 运行时不会自动创建。我们需要在顶级 volumes 中定义数据卷(仅提供卷名,使用默认选项),然后在服务配置中指定挂载点。当然还有更多选择

     version: "3.7"
    
     services:
       app:
         # 应用服务定义
       mysql:
         image: mysql:5.7
         volumes:
           # 指定挂载点
           - todo-mysql-data:/var/lib/mysql
    
     volumes:
       # 定义数据卷
       todo-mysql-data:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3、最后,我们只需要指定环境变量。

     version: "3.7"
    
     services:
       app:
         # 应用服务定义
       mysql:
         image: mysql:5.7
         volumes:
           - todo-mysql-data:/var/lib/mysql
         environment:
           # 指定环境变量
           MYSQL_ROOT_PASSWORD: secret
           MYSQL_DATABASE: todos
    
     volumes:
       todo-mysql-data:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这时的docker-compose.yml内容:

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos
    
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    运行应用程序栈

    现在我们有了 docker-compose.yml 文件,可以启动项目了!

    1、首先确保没有app应用或数据库副本运行。

    $ docker ps
    $ docker rm -f 
    
    • 1
    • 2

    2、使用 docker-compose up 命令启动应用程序堆栈。

    $ docker-compose up -d
    
    • 1
    • -d 表示在后台运行所有内容

    image-20220622174934150

    你会注意到该数据卷以及一个网络已创建!默认情况下,Docker Compose 会自动为应用程序堆栈创建一个网络(这就是我们没有在 compose 文件中定义的原因)。

    3、查看日志。

    $ docker-compose logs -f
    
    • 1
    • -f 标志“跟随”日志,因此会在生成时提供实时输出

    服务名称显示在行首(通常是彩色的)以帮助区分消息:

    image-20220622180306524

    查看特定的服务日志:

    $ docker-compose logs -f app
    
    • 1

    4、此时,打开你的应用程序并看到它正在运行

    image-20220622180525264

    在 Docker Dashboard 中查看应用程序堆栈

    如果我们查看 Docker Dashboard,我们会看到有一个名为 app 的组。这是来自 Docker Compose 的“项目名称”,用于将容器组合在一起。

    默认情况下,项目名称只是 docker-compose.yml 所在目录的名称。
    image-20220622180449157
    点开 app ,可以看到我们在 compose 文件中定义的两个容器。

    这些名称也更具描述性,因为它们遵循 __ 的模式。所以,很容易看出我们的应用是什么容器,哪个容器是mysql数据库。

    全部删除

    当你准备好将其全部删除时,只需运行 docker-compose down 或点击整个app的 Docker Dashboard 上的垃圾桶即可。容器将停止,网络将被删除。

    警告

    默认情况下,运行 docker-compose down 时不会删除 compose 文件中的命名卷。如果要删除卷,则需要添加 --volumes 标志。

    删除应用程序堆栈时,Docker 仪表板不会删除卷。

  • 相关阅读:
    Pytorch因nn.Parameter导致实验不可复现的一种情况
    缓存案例-架构真题(二十二)
    【推送服务】【FAQ】Push Ki常见咨询合集5--消息回执类问题
    SpringBoot配置事务、统一异常处理以及日志记录【项目实现】
    专有网络VPC 是什么
    SAP PS 第9节 合并采购申请、组合WBS之详解
    OFDM PLCP
    java计算机毕业设计基于ssm框架的校园闲置二手商品交易平台
    【计算机网络】计算机学习笔记
    【LLM】搭建RAG
  • 原文地址:https://blog.csdn.net/hyh17808770899/article/details/126261570