docker-compose.ymlの分離
最近は少しメモリ関連の記事を書いていましたが、この記事はそれとは直接関係なく、以下のサーバー運用系の記事の続きになります。
前回最後に、「VALUE SERVER→ConoHa VPS移行作業で漏れた部分」をやっていくということにしてました。まずはgit関連のアプリ追加などを行いたいので、今回はWebとデータベースとアプリを個別に起動/停止できるよう、docker-compose.ymlファイルを分離してみます。
分離前
version: "3"
services:
wordpress:
image: wordpress:fpm
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wordpress:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
db:
image: mysql
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./db:/var/lib/mysql
nginx:
image: nginx
restart: always
volumes:
- ./wordpress:/var/www/html
- ./wordpress-fpm.conf:/etc/nginx/conf.d/default.conf
- ./(certbotへの相対パス)/etc/letsencrypt:/etc/letsencrypt/
ports:
- 443:443
こうなってます。各コンテナ(サービス)、wordpress、db、nginxを個別に停止することは出来るのですが、このYAMLファイル自体を修正する場合、docker-compose downが必要になってしまい、そうなると全てのコンテナが停止することになります。次あたりまたコンテナを追加したいので、そうなると何度か編集することになって、その際何度も全体が止まるのは嫌だなぁ…と思ったのが経緯です。
分離後
ディレクトリ構成
-+-base/
| +-docker-up.sh
| +-docker-down.sh
+-nginx/
| +-docker-compose.yml
| +-wordpress-fpm.conf
+-wordpress_fpm/
| +-docker-compose.yml
| +-php.ini
+-mysql/
+-docker-compose.yml
base
dockerのネットワークを起動/停止するスクリプトを置いています。対象コンテナがないのでYAMLではなく、ただのシェルスクリプトです。
docker network create frontend
docker network create backend
docker network rm frontend
docker network rm backend
nginx
version: "3"
services:
nginx:
image: nginx
restart: always
volumes:
- ./../wordpress_fpm/wordpress:/var/www/html
- ./wordpress-fpm.conf:/etc/nginx/conf.d/default.conf
- ./(certbotへの相対パス)/etc/letsencrypt:/etc/letsencrypt/
ports:
- 443:443
networks:
- frontend
networks:
frontend:
external: true
YAMLはネットワーク定義が外部になってる点だけ違います。
server {
listen 443 ssl;
server_name (ドメイン);
root /var/www/html;
ssl_certificate /etc/letsencrypt/live/(ドメイン)/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/(ドメイン)/privkey.pem;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
resolver 127.0.0.11 valid=30s;
set $variable wordpress;
fastcgi_pass $variable:9000;
fastcgi_index index.php;
}
}
nginxのサーバー設定は、元の設定のままだと、fastcgiのリクエスト先ホストが存在しない場合にnginxが起動失敗し、ひたすら起動を繰り返すようになってしまったので、その回避策を入れています。転送先を変数に入れて、かつDNS使用を強制することで、nginxに起動を諦めさせない回避策です。
127.0.0.11は固定で入れてますが、Dockerがデフォルトで使用するDNSのアドレスです。ドキュメンテーションはないので、バージョンアップなど何かのタイミングでアドレスが変わる可能性があります。
wordpress_fpm
version: "3"
services:
wordpress:
image: wordpress:fpm
restart: always
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wordpress:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
networks:
- frontend
- backend
networks:
frontend:
external: true
backend:
external: true
データベースホスト名がdbからmysqlに変わり、ネットワークが外部定義になっただけですね。php.iniは空です。
mysql
version: "3"
services:
mysql:
image: mysql
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./db:/var/lib/mysql
networks:
- backend
networks:
backend:
external: true
ネットワークが外部定義になっただけですね。
使い方
起動
$ cd base
$ bash docker-up.sh
$ cd ../nginx
$ docker-compose up -d
まずはWebサーバーが起動して、phpで502を表示できるようになりました。
$ cd ../wordpress_fpm
$ docker-compose up -d
fastcgiのphpリクエストを処理できるようになったので、データベースに接続しにいって失敗するエラーを表示できるようになりました。
$ cd ../mysql
$ docker-compose up -d
$ cd ..
起動完了で、いつもの画面が表示できるようになりました。
停止
$ cd nginx
$ docker-compose down
$ cd ../wordpress_fpm
$ docker-compose down
$ cd ../mysql
$ docker-compose down
$ cd ../base
$ bash docker-down.sh
$ cd ..
コンテナは独立に停止・起動できますが、起動で分けたので、停止は一気に落としてます。
まとめ
dockerコンテナを独立に起動・停止できるようになりました。次回は今動作していないgit機能の復旧になります。
ディスカッション
コメント一覧
まだ、コメントがありません