Docker 系列(11):如何使用Docker Compose

166 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

大家好,我是阿萨。上一次学习了docker compose的用法:[Docker学习笔记十:docker Compose]。本节课学习下如何使用它。

安装就不说了,上节课已经讲了。

创建 Compose 文件

  1. 在应用程序的根目录下,创建一个命名如下的文件docker-compose.yml.

  2. 在compose文件里,先定义一下版本。一般情况 下,都使用最新支持版本。

     version: "3.7"
    
  3. 下一步,定义容器或者服务列表。

     version: "3.7"
    
     services:
    

现在开始,迁移一个服务到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"

如果是 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. 首先定义服务的如何和容器镜像。可以给服务随便起个名字。这个名字会成为网络的别名。可以在定义MySQL的服务中使用.

  2. version: "3.7"
    
  3.  services:
       app:
         image: node:12-alpine
    
  4. 接下来 command 紧跟着 image 定义, 虽然没有前后顺序的要求,但是一般都是这么写。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
    
  5. 通过 -p 3000:3000 部分定义ports 。

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
    
  6. 接下来迁移路径 (-w /app) 和卷映射 (-v "$(pwd):/app") 通过 working_dir``和``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
    
  7. 最后,迁移下环境变量,通过使用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
    

定义 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

​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. 首先定义一个新的服务命名为mysql的新服务。 它会自动变成网络别名。

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
    
  2. 接下来的,开始卷映射. 运行docker run, 命名卷就会自动创建.。运行 Compose的时候,不会自定创建卷映射。需要把卷定义在最顶层volumes: 部分 .

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
         volumes:
           - todo-mysql-data:/var/lib/mysql
    
     volumes:
       todo-mysql-data:
    
  3. 最后,定义下环境变量。

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
         volumes:
           - todo-mysql-data:/var/lib/mysql
         environment:
           MYSQL_ROOT_PASSWORD: secret
           MYSQL_DATABASE: todos
    
     volumes:
       todo-mysql-data:
    

设置好的 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:

运行应用程序stack

有了 docker-compose.yml 文件, 开始启动!

  1. 确保没有其他容器或者数据库在运行 (docker ps 和 docker rm -f <ids>)命令查看。

  2. 启动用 docker compose up 命令. 添加 -d运行在后台。

     $ docker compose up -d
    

    期望输出如下:

     Creating network "app_default" with the default driver
     Creating volume "app_todo-mysql-data" with default driver
     Creating app_app_1   ... done
     Creating app_mysql_1 ... done
    

    默认卷和网络都启动了, 容器编排自动创建了指定网络和应用程序栈。

  3. 查看日志 docker compose logs -f. 你会发现每个服务名字写在每行前面。用 -f 标志 表示生成的日志都会显示。

     mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
     mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
     app_1    | Connected to mysql db at host mysql
     app_1    | Listening on port 3000
    

    查看指定应用的命令:``docker compose logs -f app).

    注意,数据库必须先于应用程序启动。

  4. 现在,应用程序启动了。

在 Docker Dashboard中查看应用程序栈

If查看 Docker Dashboard,可以看到一个组命名为 app. 这个项目名字来自 Docker Compose 用来给程序编排分组的。默认情况下项目名称被定义在文件docker-compose.yml里。

如果你下钻应用程序,你会看到我们在compose文件中定义的两个容器。这些名称也更具有描述性,因为它们遵循的模式是

<service-name>-<replica-number>. 所以,可以非常快速查看哪个是容器,那个是数据库。

关闭

准备关闭的时候用 docker compose down 或者点Dashboard里的垃圾桶按钮。

关闭了之后用 docker compose up 启动。

如果觉得阿萨的内容对你有帮助,欢迎围观点赞。