今回はDocker-Composeを使用して本格的なWebサーバ環境を構築する準備をします。前回のnginxとphpコンテナ連携に加えてmysqlコンテナを追加して3コンテナを連携します。さらに永続データ用にWeb用とMysql用に2つのデータボリュームコンテナをBysyBoxで用意します。バージョンアップに迅速に対応できるようになるべく公式イメージをそのまま使用し不足分だけ追加インストールするようにしています。3コンテナの連携確認と今後の環境カスタマイズ用にphpmyadminをインストールして動作設定を行います。常駐コンテナ3つとデータボリュームコンテナ2つの5つの連携ですがDocker-Composeを使用すれば思ったよりも簡単に環境を構築できます。失敗してもコンテナなら簡単に破棄できて起動も瞬時ですので何度もやり直しが利きます。Docker-Composeはなかなか良さそうです。
目次
1.全体コンテナ設計
連携したコンテナ内のデータと設定を永続化させるために以下の設計でフォルダと設定ファイルを作成します。
(1)データボリューム
data/mysqlディレクトリをmysqlコンテナにマウント
data/wwwディレクトリをnginxとphpコンテナにマウント
(2)設定ファイル
nginxコンテナでserver.confをコンテナ内にマウント
phpコンテナでphp.iniをコンテナ内にマウント
・フォルダ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/home/docker/test/phpsql phpsql │ docker-compose.yml ├─data │ │ │ ├─mysql │ │ │ └─www │ └ index.php │ ├─nginx │ Dockerfile │ server.conf │ └─php7 Dockerfile php.ini |
2.Docker-Composeの設計
(1)docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
version: '2' services: sqldata: image: busybox volumes: - ./data/mysql:/var/lib/mysql wwwdata: image: busybox volumes: - ./data/www:/var/www/html nginx: build: ./nginx ports: - "80:80" links: - php7 volumes: - ./nginx/server.conf:/etc/nginx/conf.d/server.conf volumes_from: - wwwdata php7: build: ./php7 links: - db volumes: - ./php7/php.ini:/usr/local/etc/php/php.ini volumes_from: - wwwdata depends_on: - "db" db: image: mysql volumes_from: - sqldata environment: MYSQL_ROOT_PASSWORD: "password" TZ="Asia/Tokyo" |
【コンテナサービス一覧】
コンテナサービス名 | 役割 | 関連サービス |
sqldata | データボリュームコンテナ(mysqlの永続データ用) | dB(マウント) |
wwwdata | データボリュームコンテナ(nginxの永続データ用) | nginx(マウント) php (マウント) |
nginx | nginxタスク | php(リンク) |
php | php-fpmタスク | dB(リンク) |
db | mysqlタスク |
【Docker-Compose YML形式キー値差分説明】
キー | 意味 | 値 | 値の意味 |
volumes | コンテナ内の永続データエリアの設定。:で区切ると左がホストと右がコンテナのフォルダ対応になる。 | 例)
./php7/php.ini:/usr/local/etc/php/php.ini |
php.iniをコンテナ内にマウント。永続化。 |
volumes_from | FROM先のサービスのボリュームを同一構造でマウント | 例)
– wwwdata |
nginxとphp でwwwdataをマウント |
depends_on | コンテナはdepends_onのコンテナが起動してから起動します | db | dbコンテナが起動してから自コンテナを起動 |
environment: | 環境設定 | MYSQL_ROOT_PASSWORD | mysqlのrootパスワードを指定します。 |
TZ | mysqlのタイムゾーンを指定します。 |
・前回からの差分説明
≪追加分≫
sqldataとwwdataサービスをデータボリュームコンテナとして登録しました。このコンテナは起動してもすぐに停止します。dbサービスを公式イメージメージから起動します。
≪変更分≫
nginxサービスはVolumesとしてServer.confをコンテナにマウント。Volume-fromとしてwwwdataサービスのボリュームをマウントします。php7サービスはVolumesとしphp.iniをコンテナにマウント。Volume-fromとしてwwdataサービスのボリュームをマウントします。
(2)各種設定ファイル
・php7/Dockerfile
1 2 3 |
FROM php:7-fpm RUN apt-get update && docker-php-ext-install pdo_mysql mysqli MAINTAINER gtrt7@ |
【DockerFile使用命令一覧差分】
命令 | 意味 | 値 |
Run |
コンテナでプロセスを実行します |
apt-get update && docker-php-ext-install pdo_mysql mysqli |
phpコンテナからmysqlへ接続をする際に必要となるモジュールをインストールします。インストールが済んだらイメージをBuildします。
・php7/php.ini
1 2 3 4 5 |
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" |
タイムゾーンをAsia/Tokyoに変更。エンコードをUTF-8に言語設定を日本語にしています。
・nginx/Dockerfile
1 2 |
FROM nginx:latest MAINTAINER gtrt7@ |
前回記事にあったserver.confのAdd命令はマウントに変更したので削除します。
・nginx/server.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 80 default; server_name localhost; root /var/www/html; index index.php index.html index.htm; charset utf-8; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_pass phpsql_php7_1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ ^/phpmyadmin/(.+\.php)$ { fastcgi_pass phpsql_php7_1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
前回と同様の設定です。後程使用するphpmyadmin用の設定を追加しておきます。
3.Docker-Composeの起動と確認
Docker-Compose.ymlファイルのあるディレクトリに移動し以下のコマンドでコンテナを起動します。
1 2 |
# cd /home/docker/test/phpsql/ # docker-compose up -d |
・コンテナイメージの起動確認
1 2 3 4 5 |
# Docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68677bf420ed phpsql_nginx "nginx -g 'daemon ..." 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp, 443/tcp phpsql_nginx_1 c0b13f5d1ea8 phpsql_php7 "docker-php-entryp..." 3 hours ago Up 3 hours 9000/tcp phpsql_php7_1 aa0779047685 mysql "docker-entrypoint..." 2 days ago Up 3 hours 3306/tcp phpsql_db_1 |
mysqlのイメージが「phpsql_db_1」のコンテナ名で起動しています。
・非常駐も含めたコンテナイメージの確認
1 2 3 4 5 6 7 |
# Docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68677bf420ed phpsql_nginx "nginx -g 'daemon ..." 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp, 443/tcp phpsql_nginx_1 c0b13f5d1ea8 phpsql_php7 "docker-php-entryp..." 3 hours ago Up 3 hours 9000/tcp phpsql_php7_1 aa0779047685 mysql "docker-entrypoint..." 2 days ago Up 3 hours 3306/tcp phpsql_db_1 ed9f40ca3a3e busybox "sh" 2 days ago Exited (0) 3 hours ago phpsql_sqldata_1 5bc1f4b08366 busybox "sh" 3 days ago Exited (0) 3 hours ago phpsql_wwwdata_1 |
上記3コンテナイメージに加えてデータボリュームコンテナの「phpsql_sqldata_1」と「phpsql_wwdata_1」コンテナイメージが存在しているのがわかります。
・Webブラウザからの確認
data/www に置いたindex.phpが参照されphpinfo()の結果が表示されます。
4.phpmyadminのインストール
php7コンテナイメージにphpmyadminをインストールします。といってもphp7コンテナに接続するのではなくphp7コンテナがマウントしているデータボリュームdata/www(ホストディレクトリ)にモジュールを配置します。
(1)phpmyadminモジュールの取得
当サイト記事「CentOS7にphpMyAdminをインストール」を参考にインストールします。
Wgetでモジュールを取得しunzip解凍します。Centosのminimal版にunzipがインストールされていないようなので、yumでインストールします。
1 2 |
# wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.zip # unzip phpMyAdmin-4.6.6-all-languages.zip |
(2)Webディレクトリへ配置
解凍したディレクトリ「phpMyAdmin-4.6.6-all-languages」をWeb公開用ディレクトリに移動します。カレントディレクトリは/home/docker/test/phpsqlの前提。
1 |
# mv phpMyAdmin-4.6.6-all-languages data/www/phpmyadmin |
(3)phpmyadmin用設定ファイル変更
data/www/phpmyadmin/config.sample.inc.phpをコピーしてconfig.inc.phpを作成します。以下の設定を変更します。
1 2 3 4 5 |
# vi phpmyadmin/config.inc.php $cfg['blowfish_secret'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; $cfg['Servers'][$i]['host'] = 'phpsql_db_1'; //←DB接続先ホストにコンテナ名を指定します $cfg['DefaultLang'] = 'ja'; //Web の日本語化対応 $cfg['DefaultCharset'] = 'utf-8'; |
5.phpmyadminの動作確認
(1)接続確認
webブラウザからhttp://192.168.1.9/phpmyadminで接続します。
接続できました。
(2)ログイン確認
docker-compose.ymlのenvironment:で指定したRootパスワードでログインします。
上記のように接続できたら成功です。サーバに接続できないエラーが出ることがあります。
その場合は、$cfg[‘Servers’][$i][‘host’] の値を再確認してください。
これでnginx+php+mysqlのDockerコンテナ連携環境が構築できました。
この環境設定手順をベースにDockerコンテナにwordpressインストールもできそうです。
6.参考にさせて頂いたサイト
Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築
Docker Compose で PHP 7.0 の開発環境を構築する
備忘録:DockerのPHP公式のfpmイメージでどハマりしたこと
ありがとうございます。