多阶段构建

在构建镜像的时候,我们会发现:

  • rails的应用体积很大
  • 构建时间过长

于是多阶段构建出现了,它将一个镜像的构建分为多个阶段。比如rails应用,ruby环境为一个构建阶段,rails应用所需的数据库,webpacker为下一个构建阶段。

具体构建方式,可参照高效构建镜像,这篇blog详细介绍了各个构建阶段的步骤,以及为何要这么做。可根据自己的需要,构建自己的rails镜像。

Docker Compose

Docker Compose 是一个轻松、高效的管理容器,他是一个用于定义和运行多容器的Docker的应用程序。他将所管理的容器分为了三层:

  • 工程 project
  • 服务 service
  • 容器 container

Docker Compose 会运行目录下的docker-compsoe.yml配置文件组成一个工程,一个工程将包含多个服务,每个服务又定义了容器运行的镜像、参数、依赖,一个服务也可包含多个容器实例。

下面将会举一个例子来看看,具体的compose文件如何配置:

---
#声明docker-compose的版本
version: "3.6"

services:
  app: &app_base
    container_name: 'app'
    env_file:
      - docker.env
    #镜像地址
    image: app.1.0.master
    volumes:
      - assets:/home/app/app/public
      - /etc/localtime:/etc/localtime:ro
    configs:
      - source: database_conf
        target: /home/app/app_name/config/database.yml
      - source: mongoid_conf
        target: /home/app/app_name/config/mongoid.yml
      - source: puma_conf
        target: /home/app/app_name/config/puma.rb
      - source: secrets_conf
        target: /home/app/app_name/config/secrets.yml
      - source: sidekiq_conf
        target: /home/app/app_name/config/sidekiq.yml
    logging:
      options:
        max-size: "1g"
        max-file: "10"
    command: /home/app/app_name/bin/docker-start
    #docker-swarm设置worker角色
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
    ports:
      - "7000:7000"
    #健康检查,用于服务器挂了之后自动重启
    healthcheck:
      test: "curl -fs localhost:7000 || exit 1"
      interval: 30s
      timeout: 40s
      retries: 60
    networks:
      - overlay
      
 #sidekiq
  worker:
    <<: *app_base
    container_name: 'app_name_worker'
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
    ports: []
    command: bundle exec sidekiq -C config/sidekiq.yml -L /home/app/app_name/log/sidekiq.log
    healthcheck:
      test: "stat /home/app/app_name/tmp/sidekiq.pid || exit 1"
      interval: 30s
      timeout: 40s
      retries: 60

configs:
  database_conf:
    external: true
  mongoid_conf:
    external: true
  secrets_conf:
    external: true
  puma_conf:
    external: true
  sidekiq_conf:
    external: true

networks:
  overlay:

volumes:
  assets:

上面代码所用到的bin/docker-start

#!/usr/bin/env sh
bundle exec rails assets:precompile
bundle exec rails db:migrate
bundle exec puma -C config/puma.rb

在后面我们将会使用docker-compose来构建一个rails应用。

[注释]