前回のその1では、Dockerのコマンドをいくつか使って、コンテナを組み合わせる形で仮想環境が簡単に動くということを試してみました。
実際にdocker run
コマンドを使って2つコンテナを起動し、その組み合わせでWordPressを動かすことができるというものでしたが、開発メンバーはまだしも、デザイナーのメンバーに毎回手作業でDockerコマンドを使って起動してもらうというのは少し敷居が高そうです。
そこで今回は、組み合わせたコンテナの起動・停止などを簡単に行えるようにするためのツールDocker Compose
やDockerの構成を定義してイメージを作成するDockerfile
を使って実際に社内で使える開発環境の構築を目指して行きたいと思います。
この記事の内容
Docker Composeで複数のコンテナを組み合わせる
Docker Compose
は、複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。
管理する複数のコンテナの詳細などを、docker-compose.yaml
というYAML形式のファイルで定義することにより、複数のコンテナを同時に組み合わせて実行することが可能になります。前回のその1でも試したWordPressを動かす構成をDocker Compose
を使った形で再現してみます。
version: '3' #docker-compose で使用するバージョン
services:
mysql: # コンテナの名前
image: mysql # コンテナを作るためのイメージの指定
restart: always # 実行時再起動するかどうか
environment: # 環境変数など
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on: # 対象コンテナとの依存関係
- mysql
image: wordpress
ports:
- "8080:80" # ポート番号(外部の公開ポート:コンテナ内部のポート)
restart: always
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
作成したファイルのあるディレクトリからdocker-compose up
コマンドを使ってコンテナを起動します。
$ docker-compose up -d
:
:
このあと、ブラウザを使ってhttp://localhost:8080
にアクセスすると、WordPressの初期画面が表示され一通り動作することが確認できました。
dockerコマンドだけを使って実現させた場合 --link
のオプションで接続させていたり、コマンド内にパスワードやユーザー名を設定させていたり……毎回複雑なコマンドを入力してやる必要がありますが、Docker Compose
であれば簡単なコマンドで仮想環境を立ち上げられます。
最初にdocker-compose.yaml
を作成する手間はありますが、コマンドも少なく簡潔で共有するのも楽ですし、構成の変更があった場合でもファイルの共有を再度行うだけですので管理面でも非常にメリットがあります。
Dockerfileでイメージを作成
Dockerfile
とは、Dockerのイメージを作成する際に実行するコマンドをコード化して、一つのファイルにまとめたものです。
Dockerを使う際、Docker Hub
に公開されているイメージをベースとして選択して、そのイメージに手を加えて使用することが多いですが、Dockerfile
にベースとなるイメージや手を加える部分を記載することで、独自にイメージを作成することができます。
Debianの公式イメージにApacheとPHPをインストールして PHPが動作するWebサーバのイメージを作成し、簡単なテストコンテンツを表示させてみます。
先にテストコンテンツtest.php
を作っておきます。
<?php
echo "Hello Docker!!\n";
?>
次にDockerfileを作成します。
# コンテナを作るためのイメージの指定
FROM debian
# コンテナ内で実行するコマンド(ApacheとPHPのインストール)
RUN apt-get update && apt-get install -y apache2 php7.3
# ファイルやディレクトリのコピー(実行するPHPファイルをDocument rootにコピー)
COPY test.php /var/www/html/
# コンテナ実行時の実行コマンド
CMD ["apache2ctl", "-D", "FOREGROUND"]
コメントに記載してある通り、コンテナのイメージの選択やコンテナ起動後に実行するコマンドやコンテンツのコピーなどを記載します。
作成したDockerfileから、docker build
コマンドでイメージを作成します。
$ docker build -t testdocker .
:
:
作成したイメージをdocker runでコンテナを動かします。
$ docker run -d -p 8080:80 --name testdocker testdocker:latest
cURLコマンドでテストコンテンツにアクセスしてみます。
$ curl http://localhost:8080/test.php
Hello Docker!!
今回のサンプルはシンプルなものでしたが、Dockerfile
を使うことで必要としているオリジナルのイメージをつくることができました。
Dockerfile
に必要なソフトウェアや手間の部分が記載されることになりますので、実際にどのように作られたイメージなのかが明確にわかるのもDockerfile
の良い点だと思います。
Docker ComposeでDockerfileを指定
Docker Compose
とDockerfile
を組み合わせて使うこともできます。
Docker Compose
でイメージを指定する際に、直接Dockerfile
を指定すると、イメージを作成した後にイメージを起動させることができます。
上記で作成したDockerfile
を使って試してみます。
version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:80"
restart: always
上記のようにimage
の代わりにbuild
でDockerfile
を指定することで、イメージを指定できます。
docker-composeコマンドを実行する際に--build
オプションが必要になります。
$ docker-compose up -d --build
:
:
cURLコマンドでコンテンツにアクセスしてみると、問題なく表示されました。
$ curl http://localhost:8080/test.php
Hello Docker!!
Docker Hub
などにある他のイメージとの組み合わせも、複数のDockerfile
を指定して組み合わせることも可能ですので、かなり特殊な環境であっても対応できそうです。
Dockerを使って開発環境の整備はできるか
今回は、Dockerを使って開発環境の構築を行う上では絶対に避けては通れないであろう2つの機能Docker Compose
とDockerfile
について調べてみました。
サンプルではシンプルな環境で説明していますが、実際に弊社内で必要としている開発環境はもう少し複雑だったり、テストデータを用意したりする必要があるので、まだ調査中の現段階で答えには至っていませんが、Docker Compose
とDockerfile
の組合わせを使えばなんとかなりそうな気がしています。
少し前まで食わず嫌いで仮想環境を避けてきましたが、思った以上にDocker
にはハマりそうですね。(いろんな意味で)