Docker Compose での Web/DB 環境構築例

概要

Docker Compose を使って、Web+DB の環境を作成する例です。
Web サーバは CentOS7、DB は MySQL を使うことにします。
確認用の Web アプリとして WordPress を使ってみます。
当然、Docker Compose 環境がつかえる状態になっていることが前提です。

ちなみに、WordPress であれば、WordPress 用の Docker イメージがありますし、PHP が動く Web サーバであれば PHP 用の Docker イメージにでいろいろあります。
Web サーバは今回はあえていろいろ出来そうな CentOS7 のイメージをチョイスしましたが、アプリケーションの構成によってはイメージを細分化した方が良いかもしれないし、それに適したイメージがあると思います。
Docker Hub を探してみるといろいろなイメージがあるので、一度探してみるとおもしろいです。

設定

まず、今回の Docker Compose で構築する環境用のディレクトリを用意します。
以降は、そのディレクトリ以下で作業を行います。

Docker Compose の設定ファイルは docker-compose.yml ですので、まずはこのファイルを作成します。

version: '3.7'
services:
  mysql:
    container_name: memo_mysql
    build: ./mysql
    image: memo_mysql
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_pass
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - ./mysql/conf.d:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
  apache:
    container_name: memo_apache
    build: ./apache
    image: memo_apache
    restart: always
    ports:
      - "8080:80"
    volumes:
      - ./html:/var/www/html
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    depends_on:
      - mysql
#    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined

以下、簡単に説明していきます。

ファイル形式にはバージョンがあります。
https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix
これに従って、バージョンを設定します。

 version: '3.7'

次に、services: 以降にコンテナとなるサービス設定を記載していきます。
今回は、DB 用に “mysql”, Web 用に “apache” の2つのサービスを記載しています。
DB の設定は、Docker Compose で MySQLを構築 とほぼ同等なのでこちらを参照。

Web の設定

以下、”apache” に属する設定です。
mysql とかぶる部分は省略します。

    build: ./apache

Web 用のイメージは apache/Dockerfile でビルドします。
長くなるので後述します。

    ports:
      - "8080:80"

Web サーバは外部から参照させたいのでポートフォワードします。
この場合、ホストの 8080 番をコンテナの 80 番にポートフォワードします。

    volumes:
      - ./html:/var/www/html
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

ボリュームを設定します。
html/ はコンテナの DocumentRoot に mount します。
これにより、DocumentRoot はホスト上で更新可能となり、コンテナが削除されてもファイルは残るようになります。

    depends_on:
      - mysql

依存関係を設定します。
Webサーバから mysql を参照するので記載します。

    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined

Apache, Postfix を起動するための設定。
詳細は、DockerコンテナのCentOS7上でsystemctlを使う どうぞ。

CentOS7のDockerファイル

前項で省いた apache/Dockerfile についてです。

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
RUN unlink /etc/localtime
RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime

RUN yum update -y \
 && yum -y install postfix httpd  epel-release \
 && rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
 && yum -y install php73-php php73-php-mysqlnd lv

RUN rm -f /etc/httpd/conf.d/autoindex.conf; \
    rm -f /etc/httpd/conf.d/userdir.conf; \
    rm -f /etc/httpd/conf.d/welcome.conf;

RUN systemctl enable httpd.service
RUN systemctl enable postfix.service

COPY httpd/httpd.conf /etc/httpd/conf/httpd.conf
COPY postfix/main.cf /etc/postfix/main.cf
#COPY conf/php.ini-production "$PHP_INI_DIR/php.ini"

EXPOSE 80

CMD ["/usr/sbin/init"]

以下、説明です。
まず、CentOS7 のイメージは下記のものを使用しました。
https://hub.docker.com/_/centos

上記ページの “Dockerfile for systemd base image” に下記の記載があるので、そのまま流用。

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

次にタイムゾーンと LANG の設定。

 RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
 ENV LANG ja_JP.UTF-8
 RUN unlink /etc/localtime
 RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime

とりあえず yum update しつつ、必要なパッケージをインストール。
用途的に httpd, php は必須。sendmail コマンドでメール送信したいので Postfix も入れました。
また、個人的に lv を使いたいのでついでにインストール。
PHP はせっかくなので 7.3 をチョイス。
EPEL と REMI リポジトリが必要なので、これらも追加します。

 RUN yum update -y \
  && yum -y install postfix httpd  epel-release \
  && rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
  && yum -y install php73-php php73-php-mysqlnd lv

Apache の不要な設定ファイルを削除します。

RUN rm -f /etc/httpd/conf.d/autoindex.conf; \
    rm -f /etc/httpd/conf.d/userdir.conf; \
    rm -f /etc/httpd/conf.d/welcome.conf;  

自動起動設定します。

 RUN systemctl enable httpd.service
 RUN systemctl enable postfix.service

Apache と Postfix の設定ファイルをホストからコピーします。
この辺はボリュームで永続化しても良いですが、ほぼ変更することは無さそうであればイメージに含めてしまってよいと思います。
必要であれば PHP の設定も同様に。

 COPY httpd/httpd.conf /etc/httpd/conf/httpd.conf
 COPY postfix/main.cf /etc/postfix/main.cf

必要かどうか検証していませんが、https://hub.docker.com/_/centos にも記載があったのでなんとなく追加。

 EXPOSE 80

WordPress インストール

通常のサーバと同じです。
html/ を DocumentRoot としましたので、html/ に WordPress をインストールします。

コンテナ起動

すべて設定が終わったらコンテナを起動します。

 % docker-compose up -d

もし、とりあえずビルド(イメージ作成)だけしたい場合には、下記です。

 % docker-compose build

すべて正しく設定できていれば、ホストの 8080 番を参照すると、WordPress のインストール画面が表示されるはずです。

コメント

タイトルとURLをコピーしました