Dockerをインストールしたら、次はコンテナ連携ツールのDocker-Composeをインストールします。Docker公式マニュアルによるとコンテナは1つで1タスクが望ましいとのことなのでそれに従うとコンテナ連携は必須です。Dockerコマンドで同じことは実現できますが先人の方々によると効率が段違いとのことなのでDocker-Composeを最初から使用することにします。ここでは、Docker-ComposeのインストールとDocker-Composeを使用したNginxコンテナとphpコンテナの連携を扱います。
1.Docker-Composeのインストール
参考にしたのは公式サイトのインストールマニュアルです。
最新版のバージョンをGitHubの変更履歴から確認します。このリンクを開いて確認します。2017年3月5日時点では、「1.11.0」が最新のようです。下記のようにCurlコマンドで「1.11.0」を指定してインストールします。バージョンが上がったら「1.11.0」の部分を変更してください。
1 |
# curl -L https://github.com/docker/compose/releases/download/1.11.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
Docker-Composeに実行権限を付与します。
1 |
# chmod +x /usr/local/bin/docker-compose |
バージョンを確認します。
1 2 3 4 5 |
# docker-compose version docker-compose version 1.11.0, build 6de1806 docker-py version: 2.0.2 CPython version: 2.7.13 OpenSSL version: OpenSSL 1.0.1t 3 May 2016 |
指定した最新のバージョンでインストールできました。
2.nginxとphpのコンテナ連携
Docker-Composeでnginxコンテナとphpコンテナを連携します。参考にさせて頂いたのはこちらの記事でほとんどそのまんまです。この方法はBuildイメージを作成してコンテナ連携をするようです。起動するコンテナはBuildイメージを作成した時点で設定等が固定されるので最初からコンテンツが固まっていて変更予定がない場合は有効な選択肢です。コンテナ作成後にコンテンツを育てていきたいのであればこちらの記事を参考にしてください。
(1)コンテナの設計
以下のフォルダ構成でディレクトリと設定ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 |
/home/docker/test/phpfpm phpfpm │ docker-compose.yml │ ├─nginx │ Dockerfile │ server.conf │ └─php7 Dockerfile index.html |
(2)各設定ファイル内容
下層から上層への順に記述します。
・php7/Dockerfile
1 2 3 |
FROM php:7-fpm MAINTAINER gtrt7@ COPY index.php /var/www/html/ |
【DockerFile使用命令一覧】
命令 | 意味 | 値 |
FROM <イメージ>:<タグ> | ベースイメージを指定します | php:7-fpm |
MAINTAINER <名前> | 生成するイメージの Author (作者)フィールド | gtrt7@ |
COPY <ソース>… <送信先> | ソースファイルを送信先にコピーします | index.php /var/www/html/ |
・php7/index.php
1 2 3 |
<?php phpinfo(); ?> |
・nginx/Dockerfile
1 2 3 |
FROM nginx:latest MAINTAINER gtrt7@ ADD server.conf /etc/nginx/conf.d/server.conf |
【DockerFile使用命令一覧差分】
命令 | 意味 | 値 |
ADD <ソース>… <送信先> | ソースファイルを送信先にコピーします。ソースの変更があればキャッシュをクリアします。 |
server.conf /etc/nginx/conf.d/server.conf |
・nginx/server.conf
テンプレートの設定ですが、特記点は「fastcgi_pass phpfpm_php7_1:9000;」の行です。後述する「docker-compose.yml」でnginxコンテナからphpコンテナをlinkしていますがlinkで使用するのはサービス名です。ネットワーク接続で使用するのはコンテナ名になります。従って、コンテナ名の命名ルールにより(後述)” phpfpm_php7_1”となります。ちょっと混乱しやすいのできちんと整理しておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 phpfpm_php7_1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
・docker-compose.yml
1 2 3 4 5 6 7 8 9 10 |
version: '2' services: nginx: build: ./nginx ports: - "80:80" links: - php7 php7: build: ./php7 |
docker-composeで使用する「docker-compose.yml」という設定ファイルはyml形式をとります。PGソースのインデント形式でキーと値のセットを階層構造で表現できます。今回のymlファイルで使用しているキーと値を以下にまとめました。
【Docker-Compose YML形式キー値説明】
キー | 意味 | 値 | 値の意味 |
version | Docker-Compose.ymlのバージョン | ‘2’ | Version’2’形式をとります |
services | 以降にコンテナ記述をする | nginx,php7… | nginxとph7サービスを定義します |
build | コンテナをBuilしてから起動します | .nginx,.php7 | nginx,php7をBuilします |
port | ホストとコンテナ間のポートマッピングを指定します | -80:80 | nginxコンテナはホストの80ポートをコンテナの80ポートにフォワードします |
link | 連携するサービス名を指定します | php7 | nginxサービスはphp7サービスに連携(ネットワーク接続)します |
(3)Docker-Composeの起動
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 38 39 40 41 |
# cd /home/docker/test/phpfpm/ # docker-compose up -d Creating network "phpfpm_default" with the default driver Building php7 Step 1/3 : FROM php:7-fpm 7-fpm: Pulling from library/php 693502eb7dfb: Pull complete 16328c296404: Pull complete 8b3c97761df6: Pull complete 26f382970c8d: Pull complete 2030de85ff59: Pull complete 7397b4857318: Pull complete fee703085a0d: Pull complete d0e9c4adf52c: Pull complete 78fd7ad7bf06: Pull complete Digest: sha256:f4aa616561a63b3f4997fd25d8d4ae146c2213922961f158d5a0037cd805c97e Status: Downloaded newer image for php:7-fpm ---> 7191c638ed10 Step 2/3 : MAINTAINER gtrt7@ ---> Running in 71e685eec049 ---> 276bd00e0a54 Removing intermediate container 71e685eec049 Step 3/3 : COPY index.php /var/www/html/ ---> af3c85c1e226 Removing intermediate container a65bd831b4fe Successfully built af3c85c1e226 WARNING: Image for service php7 was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Building nginx Step 1/3 : FROM nginx:latest latest: Pulling from library/nginx 693502eb7dfb: Already exists 6decb850d2bc: Pull complete c3e19f087ed6: Pull complete Digest: sha256:52a189e49c0c797cfc5cbfe578c68c225d160fb13a42954144b29af3fe4fe335 Status: Downloaded newer image for nginx:latest ---> 6b914bbcb89e Step 2/3 : MAINTAINER gtrt7@ ---> Running in a1e948198b24 ---> f5626901008c Removing intermediate container a1e948198b24 Step 3/3 : ADD server.conf /etc/nginx/conf.d/server.conf |
(4)起動確認
・コンテナイメージの起動確認
1 2 3 4 |
# Docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aef0e45f41a1 phpfpm_nginx "nginx -g 'daemon ..." About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp phpfpm_nginx_1 261b5cec6669 phpfpm_php7 "docker-php-entryp..." About a minute ago Up About a minute 9000/tcp phpfpm_php7_1 |
起動されたコンテナは、「フォルダ名_サービス名_連番」のルールでコンテナ名が自動付与されます。
・ブラウザからの確認
nginxコンテナは80ポートをフォワードしているので外部ホストに接続すればコンテナのnginxに接続できるはずです。ホストのIPアドレスは「192.168.1.9」としてWebラウザで接続してみます。http://192.168.1.9/
Nginx→php7と連携しindex.phpに記述したphpinfo()の結果が表示されました。
Nginxコンテナとphpコンテナの連携は成功です。