docker-compose.ymlの分離

2021年6月16日

最近は少しメモリ関連の記事を書いていましたが、この記事はそれとは直接関係なく、以下のサーバー運用系の記事の続きになります。

前回最後に、「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に起動を諦めさせない回避策です。

https://stackoverflow.com/questions/32845674/setup-nginx-not-to-crash-if-host-in-upstream-is-not-found

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機能の復旧になります。

未分類docker,linux

Posted by first_user