概要
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 のインストール画面が表示されるはずです。
コメント