コンテナ型仮想化技術Dockerを使って開発環境を整備できるか その2

スタッフブログ

こんにちは。ITインフラエンジニアのキリヤマです。

前回のその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の公式イメージにApachePHPをインストールして 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 ComposeDockerfileを組み合わせて使うこともできます。
Docker Composeでイメージを指定する際に、直接Dockerfileを指定すると、イメージを作成した後にイメージを起動させることができます。

上記で作成したDockerfileを使って試してみます。

version: '3'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    restart: always

上記のようにimageの代わりにbuildDockerfileを指定することで、イメージを指定できます。
docker-composeコマンドを実行する際に--buildオプションが必要になります。

$ docker-compose up -d --build
  :
  :

cURLコマンドでコンテンツにアクセスしてみると、問題なく表示されました。

$ curl http://localhost:8080/test.php
Hello Docker!!

Docker Hubなどにある他のイメージとの組み合わせも、複数のDockerfileを指定して組み合わせることも可能ですので、かなり特殊な環境であっても対応できそうです。

Dockerを使って開発環境の整備はできるか

今回は、Dockerを使って開発環境の構築を行う上では絶対に避けては通れないであろう2つの機能Docker ComposeDockerfileについて調べてみました。
サンプルではシンプルな環境で説明していますが、実際に弊社内で必要としている開発環境はもう少し複雑だったり、テストデータを用意したりする必要があるので、まだ調査中の現段階で答えには至っていませんが、Dokcer ComposeDockerfileの組合わせを使えばなんとかなりそうな気がしています。

少し前まで食わず嫌いで仮想環境を避けてきましたが、思った以上にDockerにはハマりそうですね。(いろんな意味で)