Docker Compose を単体のコンテナで使う

Dockerに慣れる : ボリュームをマウントする では、ホストのディレクトリをコンテナ側から参照する方法を試した。

今回は Docker Compose を利用してみる。

Docker Composeとは

Docker Compose は、複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。

実際には「複数のコンテナを組み合わせて動かす」場合がほとんどだと思います。 その場合、コンテナの起動順序や個別のパラメータ設定、オプションなどの情報を管理していくことが規模に応じて複雑化し、大変になっていきます。

そのような場合、Docker Composeを使用する(=複数コンテナ同士の依存関係や設定をymlファイルに記述する)ことで、手順の簡略化・手順誤りを軽減することができます(ファイル内容を変更しない限り、何度でも同じ条件で再現が可能です)。

と、本来複数のコンテナからなるサービスを制御するためのソフトウェアらしいのだが、 いきなり複数台を制御しようとしても複雑になるので、単体からやることにした。

docker run でディレクトリをマウントする時に絶対パスなのが大変なのだが、 Docker Compose だと相対パスで行けそうだった、というのもある。

参考 :

Docker Compose から httpd を立ち上げる

Docker Compose の確認

$ docker-compose --version
docker-compose version 1.23.1, build b02f1306

インストールされていることを確認できたら、ここから実際に定義ファイルを作成していきます。

やってみる。

$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

大丈夫そうだ。

Docker Compose のファイルを作成する

まず準備として、作業ディレクトリを用意します。 今回はユーザーディレクトリ直下に docker_wp ディレクトリを作成し、 そこへ docker-compose.yml を作成することとします。

$ mkdir docker_wp
$ touch docker_wp/docker-compose.yml
$ vi docker_wp/docker-compose.yml

ファイルの内容は以下の様にしました。

version: '3'

services:
  wordpress:
    image: wordpress:latest
    depends_on:
      - mysql
    ports:
      - "10080:80"
    env_file: .env

  mysql:
    image: mysql:5.7
    volumes:
      - "./.data/db:/var/lib/mysql"
    env_file: .env

記述の内容を簡単に解説しますと

version
定義ファイルの書式バージョン(現在は3が最新)
services
アプリケーションの要素名
image
ベースとするコンテナイメージの指定
depends_on
コンテナの依存関係の指定(今回の例では「wordpress」サービスは「mysql」サービスに依存します)
ports
起動ポートの指定
volumes
ボリュームマウントの指定
env_file
環境変数を定義したファイルの指定

となっています。

これを httpd 単体用にカスタマイズしていく。やりたいことは

  1. ベースイメージの指定
  2. ポート設定
  3. ボリュームマウントの指定

なので、参考サイトからこの辺りの設定を行う。

まずはディレクトリを作って移動する。

$ cd sandbox/docker_test
$ mkdir docker-compose
$ cd docker-compose 

docker-compose.yml を作成する。

$ vimr docker-compose.yml
version: '3'

services :
  httpd :
    image : httpd:latest
    ports : 
      - "8080:80"
    volumes :
      - "./htdocs:/usr/local/apache2/htdocs"

volumeshtdocs ディレクトリをマウントする設定をしているのでディレクトリを作成する

$ mkdir htdocs

htdocs 内に index.html を作成する。

$ vimr htdocs/index.html
<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>Test page</p>
  </body>
</html>

ものが揃ったので Docker Compose で起動してみる。

Docker Compose で httpd を起動する

準備が整ったら、以下のコマンドで起動します。

$ docker-compose up -d

やってみる。

$ docker-compose up
Creating network "docker-compose_default" with the default driver
Pulling httpd (httpd:latest)...
latest: Pulling from library/httpd
8559a31e96f4: Pull complete
bd517d441028: Pull complete
f67007e59c3c: Pull complete
83c578481926: Pull complete
f3cbcb88690d: Pull complete
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:latest
Creating docker-compose_httpd_1 ... done
Attaching to docker-compose_httpd_1
httpd_1  | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
httpd_1  | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
httpd_1  | [Fri Jul 17 09:28:56.502949 2020] [mpm_event:notice] [pid 1:tid 140531077407872] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations
httpd_1  | [Fri Jul 17 09:28:56.503106 2020] [core:notice] [pid 1:tid 140531077407872] AH00094: Command line: 'httpd -D FOREGROUND'
httpd_1  | 172.18.0.1 - - [17/Jul/2020:09:29:21 +0000] "GET / HTTP/1.1" 200 141

動いたらしい。ブラウザからアクセスしてみる。

動作確認できた

あっさりと動いてしまって戸惑っている。

バックグラウンド起動をさせ、 htdocs/index.html を変更してみる。

$ docker-compose up -d
$ vimr htdocs/index.html
<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>Test page</p>
    <p>and more</p>
  </body>
</html>

こちらもあっさりと反映された