Dockerfile から docker-compose.yaml を作る


docker で nginx と php-fpm 環境を構築してみる で作成した Dockerfile をもとに docker-compose.yaml を作成して、docker イメージを docker-compose コマンドでコンテナの生成と起動ができるようにする。

手順の流れ

  1. docker-compose.yaml の作成
  2. nginx と php-fpm の Dockerfile の設定を変更する
  3. docker-compose で両イメージを起動する
  4. コンテナへの接続を確認する
  5. コンテナの停止と削除をする

docker-compose.yaml の作成

$ pwd
$HOME/works/docker-sample/php-tcp
$ touch docker-compose.yaml
$ vim docker-compose.yaml
$ cat docker-compose.yaml

docker-compose.yaml の設定内容は次の通り。

version: '3'

services:
  php-sample:
    restart: always
    build:
      context: .
      dockerfile: ./php/Dockerfile

  nginx-sample:
    restart: always
    ports:
      - 80:80
    build:
      context: .
      dockerfile: ./nginx/Dockerfile

nginx と php-fpm の Dockerfile の設定を変更する

このまま docker-compose コマンドからコンテナを作成すると、nginx と php-fpm のイメージに取り込む設定ファイル読み込み時にエラーが発生するので、両 Dockerfile に変更を加える。

php-fpm の Dockerfile

変更前にオリジナルの複製を作り、変更点がわかるようにする。

$ cp php/Dockerfile php/Dockerfile.orig
$ vim php/Dockerfile
$ diff -uw php/Dockerfile.orig php/Dockerfile

変更点は次の通り。
(行頭 (-) は変更前の記述。行頭 (+) は変更後の記述)

--- php/Dockerfile.orig	2022-03-27 13:43:21.000000000 +0900
+++ php/Dockerfile	2022-03-27 13:43:50.000000000 +0900
@@ -1,5 +1,5 @@
 FROM php:8.1.4-fpm-alpine

 RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
-COPY settings/php.ini /usr/local/etc/php/conf.d/php.ini
-COPY src /usr/share/nginx/html
+COPY php/settings/php.ini /usr/local/etc/php/conf.d/php.ini
+COPY php/src /usr/share/nginx/html

Dockerfile から参照する相対パスを docker-compose.yaml から参照した場合の相対パスに変更している。

nginx の Dockerfile

$ cp nginx/Dockerfile nginx/Dockerfile.orig
$ vim nginx/Dockerfile
$ diff -uw nginx/Dockerfile.orig nginx/Dockerfile

nginx の Dockerfile の変更点は次の通り。

$ diff -uw nginx/Dockerfile.orig nginx/Dockerfile
--- nginx/Dockerfile.orig	2022-03-27 13:44:42.000000000 +0900
+++ nginx/Dockerfile	2022-03-27 13:45:20.000000000 +0900
@@ -1,3 +1,3 @@
 FROM nginx:1.21.6-alpine

-COPY settings/default.conf /etc/nginx/conf.d/default.conf
+COPY nginx/settings/default.conf /etc/nginx/conf.d/default.conf

docker-compose で両イメージを起動する

$ docker-compose up -d --build
Creating network "php-tcp_default" with the default driver
Building php-sample
...
Creating php-tcp_nginx-sample_1 ... done
Creating php-tcp_php-sample_1   ... done

docker-compose でコンテナを起動すると、Creating network "php-tcp_default" with the default driver と実行されて、一時的なネットワークを自動的に生成してくれる。

コンテナへの接続を確認する

コンテナの起動を確認して、nginx に接続をしてみる。

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                NAMES
b4fc4a4e62ee   php-tcp_nginx-sample   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   php-tcp_nginx-sample_1
1f6bbef6b036   php-tcp_php-sample     "docker-php-entrypoi…"   2 minutes ago   Up 2 minutes   9000/tcp             php-tcp_php-sample_1
$ curl -I -s localhost:80
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Sun, 27 Mar 2022 08:27:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/8.1.4

WEB ブラウザから http://localhost/ にアクセスをして、phpinfo(); の実行結果が表示されることを確認する。

コンテナの停止と削除をする

$ docker-compose down
Stopping php-tcp_nginx-sample_1 ... done
Stopping php-tcp_php-sample_1   ... done
Removing php-tcp_nginx-sample_1 ... done
Removing php-tcp_php-sample_1   ... done
Removing network php-tcp_default
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES