【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
以上。
请参考我提供的选项。