【Docker】将 doceker-compose 在生产环境和开发环境中分开使用

用于生产环境的docker-compose

据说以前容器的创建通常只在开发环境中进行,但现在通过在生产环境中也使用它,可以在与开发环境相同的环境中运行,提高服务的冗余性,并减少由于环境差异而导致的故障的案例正在增加。

构建容器所需信息的文件是docker-compose.yml。而且这个文件可以在生产环境和开发环境中进行切换使用。

这次实施的内容可能更适合用“覆盖文件内容以适应生产环境”来描述,而不是简单的使用不同的文件。具体而言,我们需要创建一个名为docker-compose-prod.yml的文件,与docker-compose.yml分开,然后在容器构建时使用-f选项指定要参考的docker-compose文件。

docker-compose -f docker-compose-prod.yml up

在这里,根据以下文章中的代码,将根据环境分开docker-compose文件。请注意,我们将使用Nginx作为代理,因此要在此基础上进行。

 

目录结构是在应用程序目录(这里称为app_name)下创建以下文件和文件夹。

Dockerfile
docker-compose-prod.yml
docker-compose-dev.yml

config
└ puma.rb

nginx_docker_prod
├ Dockerfile
└ nginx.conf

nginx_docker_dev
├ Dockerfile
└ nginx.conf

Dockerfile的中文释义是什么?

这次不需要创建两个Dockerfile,只需要创建一个可以在开发环境和生产环境中共用的Dockerfile。

FROM ruby:3.0.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && curl -sL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs \
  && apt-get update -qq \
  && apt-get -y install \
  yarn \
  nodejs \
  imagemagick \
  default-mysql-server \
  default-mysql-client

WORKDIR /app_name

COPY Gemfile /app_name/Gemfile
COPY Gemfile.lock /app_name/Gemfile.lock

RUN gem install bundler
RUN bundle install

RUN mkdir -p tmp/sockets

docker-compose.yml的重述

開發時使用的docker-compose.yml設定如下。對於與正式環境的差異,已在註解中進行說明。

version: '3'
services:
  app:
    build:
      context: .
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/app_name
      - public-data:/app_name/public
      - tmp-data:/app_name/tmp
      - log-data:/app_name/log
    networks:
      - app_name-network
    depends_on:
       - db
# ↓ mysqlでDBコンテナを立てるための情報
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: app_name_development
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app_name-network

  web:
    build:
      context: ./nginx_docker_dev
 #  ↑ 開発環境用に作ったディレクトリでnginxによるコンテナを構築する。
    volumes:
      - public-data:/app_name/public
      - tmp-data:/app_name/tmp
    ports:
      - 80:80
    depends_on:
      - app
    networks:
      - app_name-network
volumes:
  public-data:

  tmp-data:
  log-data:
  db-data:

networks:
  app_name-network:
    external: true

生产环境下的docker-compose配置文件 xià de Docker Compose

以下是用于生产环境的docker-compose-prod.yml。关于与开发环境的差异,请参考注释。

version: '3'
services:
  app:
    build:
      context: .
    command: bundle exec puma -C config/puma.rb -e production
    # ↑ pumaの起動時に本番環境を指定している。
    volumes:
      - .:/app_name
      - public-data:/app_name/public
      - tmp-data:/app_name/tmp
      - log-data:/app_name/log
    networks:
      - app_name-network

# 今回、本番環境について、EC2へのデプロイとRDSの使用を前提としているため、
#  本番環境用ではDBコンテナの記述は無し。

  web:
    build:
      context: ./nginx_docker_prod
    # ↑ 本番環境用に作ったディレクトリでnginxによるコンテナを構築する。
    volumes:
      - public-data:/app_name/public
      - tmp-data:/app_name/tmp
    ports:
      - 80:80
    depends_on:
      - app
    networks:
      - app_name-network
volumes:
  public-data:

  tmp-data:
  log-data:
  db-data:

networks:
  riskbuster-network:
    external: true

nginx_docker_dev 目录

为了搭建开发用的nginx,创建一个名为nginx_docker_dev的目录。在该目录中准备两个文件,分别是Dockerfile和nginx.conf。具体内容如下所示。

    Dockerfile
FROM nginx:1.15.8

RUN rm -f /etc/nginx/conf.d/*

ADD nginx.conf /etc/nginx/conf.d/app_name.conf

CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

    nginx.conf
upstream app_name {
  server unix:///app_name/tmp/sockets/puma.sock;
}

server {
  listen 80;
    server_name localhost;
#   ↑ nginxの既定のポート番号である80番ポートを指定して、
#     server_nameをlocalhostとしている。

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /app_name/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @app_name;
  keepalive_timeout 5;

  location @app_name {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://app_name;
  }
}

nginx_docker_prod 目录

为了构建用于生产环境的nginx容器,同样需要创建一个名为nginx_docker_prod的文件夹。在这个文件夹中,还需要准备两个文件,即Dockerfile和nginx.conf。

Dockerfile
上記のDockerfileの内容と同様。

nginx.conf

upstream app_name {
  server unix:///app_name/tmp/sockets/puma.sock;
}

server {
  listen 80;
    server_name ××.×××.×××.×××;
#  ↑ EC2の固定IPを指定
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /app_name/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @app_name;
  keepalive_timeout 5;

  location @app_name {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://app_name;
  }
}

容器启动

根据环境的不同,使用以下命令进行执行,并进行容器构建。

    開発環境
$ docker-compose build
$ docker-compose up -d
    本番環境
$ docker-compose -f docker-compose-prod.yml build
$ docker-compose -f docker-compose-prod.yml up -d

以上。

请参考我提供的选项。

 

广告
将在 10 秒后关闭
bannerAds