Docker Compose入門 (1) ~アプリケーションをコンテナで簡単に扱うためのツール~

みなさん、こんにちは。さくらインターネット株式会社 技術本部ミドルウェアグループの前佛 雅人(ぜんぶつ まさひと)と申します。Dockerに関するドキュメント翻訳や、Docker紹介用の各種スライドを公開・発表しています。また、かつてはDocker公認トレーナーとして、業務を通してDockerの普及および啓蒙に携わりました。

Dockerの話はみなさんどこかで訊いたことあるかもしれません。しかし、まだまだ使っていない、あるいは、使う段階ではないとお考えの方も多いかもしれません。私は正直、勿体ないと思っています。この現状を打破すべく、"本当はこんなに使いやすいDocker" をテーマに、会社のメディアを通した記事連載の機会を頂戴しました。どうぞみなさま、お手柔らかにお願いいたします。

コンテナが当たり前のように存在する時代に私たちは

この世界にDocker(ドッカー)が登場したのは、2013年3月。アメリカのサンタクララで開催された、PyCon US 2013のライトニングトークでした。当時dotCloud社(現Docker社)のCEO、Solomon Hykes氏による発表とデモ「The future of Linux Containers(Linuxコンテナの未来)」でDockerは日の目を見たのです。

どうしてDockerは開発されたのでしょうか。それは、彼らが提供していたサービスにヒントがあります。当時のdotCloud社は、PaaS(Platform as a Service:サービスとしてのプラットフォーム)を展開していました。サーバやネットワークなど、インフラ部分を気にしなくても、(システム規模の意識する必要がない)スケール可能なアプリケーションをクラウド上に展開できるサービスです。

その彼らのお客さま(開発者)が困っていたのは、自分たちの開発環境で作っているアプリケーションが、そのままクラウド上で動かないという課題でした。Linuxディストリビューションや言語環境などが違うと、その環境ごとに再構築・調整が必要になってしまいます。お客さまが望むのは、どこでも素早くアプリケーションを動かしたいということでした。

ここに着目したのがDockerです。分かりやすい、シンプルなコマンドを実行するだけで、誰でも簡単にアプリケーションを開発し、どこでも移動・実行できるようにしました。環境が変わったとしても、Dockerが動く環境であれば、Dockerイメージを作成・移動するだけで、どこでもDockerコンテナとしてアプリケーションを実行できるようにしたのです。

PyCon 後のDockerは、間を置かずにオープンソースとしてGitHub上に一般公開されました。その後は開発スピードが加速し、世界中で多くの人たちがコンテナ技術を簡単に扱えるようになりました。そして、それが今日のKubernetesやCloud Native(クラウド・ネイティブ)と呼ばれる、Linuxコンテナを使ったアプリケーション開発・運用が当たり前のようになる時代の礎となるのです。

Docker Compose で「コンテナ」対応アプリケーションを始めましょう

しかしながら、まだまだコンテナ利用はハードルが高いとお考えの方も多いのではないでしょうか。特に、Dockerの利用方法は理解されたとしても、次のステップとして、どのように現場で使っていくのかをお悩みの方も多いと思います。

今回の連載で意図しているのは、いきなりコンテナを使ったオーケストレーションなり開発をバリバリやろうぜ!ではありません。

まず目指すのは、コンテナで簡単にアプリケーションが利用できるようになることです。そのためには、単純にDockerを使うのではなく、「Docker Compose」(ドッカー・コンポーズ)というツールで、複数コンテナのアプリケーションを扱う方法を見ていきます。Docker同様に、「docker-compose」というシンプルなコマンドを実行するだけで、WordPress や Redmine など、様々なアプリケーションが簡単かつ素早く確実に実行できるようになります。

連載に対する思いとしましては、アプリケーション活用を主眼にコンテナに対する理解を深めながら、私たちの日常作業での利用や、業務での使いどころを探るヒントになることを願っています。

Dockerやコンテナとは何なのでしょうか?

さて、既にDockerをご存じの方には「耳にタコができるような話」かもしれませんが、Linuxコンテナ(以下コンテナと省略)やDockerとは何なのでしょうか。Dockerを使う上で、混乱しがちで分かりづらいのが、Dockerとコンテナの関係性です。よくある勘違いは「Linuxコンテナ=Docker」であるというもの。

そうではなく、「Linuxカーネル技術を使って、特別な状態のプロセスを実行できるようにするプラットフォーム」がDockerです。この中でも、サーバ側で動作するDockerプログラムの総称を「Docker Engine」(ドッカーエンジン)と呼びます。そして、このDocker Engineを操作するのが、「docker」という名称のコマンドライン・ツールです。

まず「Docker」とは、特別な状態のLinuxプロセスを実行するためのプラットフォームです。特別な状態とは、プロセス実行時にLinuxカーネルの機能を使い、名前空間(namespace)を分離(isolate)します。

通常のプロセスを起動すると、プロセスが認識するPIDやホスト名、ファイルシステムなどはホスト上の情報と同じです。しかし、名前空間を分離した特別な状態であれば、自分自身のプロセスしか見えなくし、特定のファイルシステムしか見えないようにし、ネットワークも分離して直接ホスト上にポートを公開できなくします。また、cgroupによって、プロセスに対してCPUやメモリ等のリソース利用も制限できます。

このように、特別な状態のプロセスを「コンテナ」と呼び、このコンテナを実行する元になるファイルや関連情報(メタ情報)を、Dockerイメージと呼びます。そして、このDockerイメージは、Docker Hubなどのイメージ・レジストリ(保管庫の意味)を通して、コマンド1つで簡単に送受信できるようにします。

つまりDockerとは、Dockerイメージを送受信できる機能を持ち、Dockerイメージに含まれるファイルを使い、Dockerコンテナとしてプロセスを実行できるプラットフォームであるとも言えます。

たとえば、1つのホスト上で複数の Nginx ウェブサーバの起動を試みるとしましょう。通常であれば、1つのNginxがホスト側のポートを利用すると、2つめのNginxは起動できません。しかしDockerコンテナは、ネットワークも分離(isolate)した状態で起動します。

ホスト側にポートを開きたい(listenする)場合は、コンテナ起動時にポート公開の明示が必要です。そのため、ホスト側のポート重複がなければ、メモリ等のシステムリソースが利用可能な範囲で、ポート80を開いているつもりのNginxをいくつも起動できます。

そのため、1つのホスト上やノートPC上で、バージョンの異なる開発言語やフレームワークの環境を切り替えたり、テストしたり、動かしたりが素早くスムーズに行えるようになります。

以上がDockerやコンテナ、イメージに関する基本概念の説明になります。

Docker Compose の基本概念

次に、Docker Composeとは何なのでしょうか。ドキュメントでは「Compose is a tool for defining and running multi-container Docker applications.」とあります。日本語訳にすると「Composeとは複数コンテナの Docker アプリケーションを定義・実行するツールです」といった意味。

簡単に説明しますと、「docker-compose」という名前のコマンドライン・ツールを使えば、アプリケーションの定義(YAMLファイルに記述します)を使って、簡単に複数のコンテナを立ち上げたり操作したりできるようになるのです。

ここでのポイントは、単に複数のコンテナを一斉に操作できるだけではありません。アプリケーションの定義時、Dockerがコンテナ間で内部通信するために必要な「ネットワーク」と、コンテナ間でデータを共有するために必要な「ボリューム」も定義できます。

Dockerが特別な状態としてプロセスを起動するように、Docker Composeは特別な状態のアプリケーション(およびネットワーク、ボリューム)を起動・停止といった管理ができます。適切にYAMLファイルを記述しておけば、1つのホストまたはPC上でも、複数のアプリケーションをお互い独立した状態で動かすのも容易になるのです。

ちなみに、Docker Composeを使ってアプリケーションを起動するには、docker-compose のコマンドライン・ツールと、Docker Engineが動作しているだけで大丈夫です。その他の特別な環境を必要としません。

Docker Compose のインストール方法

Docker Compose を使うために必要なものは、Docker Engine(dockerコマンドを使うための環境)と、「docker-compose」という名前のバイナリ・ファイルを準備するだけです。

Docker Desktop for Mac / Windows を使う場合

Docker Desktopがセットアップ済みの場合は、自動的にDocker Compose(docker-composeバイナリ)もセットアップされています。そのため、何か特別なセットアップを行う必要はありません。Docker Desktopがセットアップされ、dockerコマンドが利用可能であれば、すぐにdocker-composeコマンドを利用できます。

Linux 版 Docker を使う場合

Linux版の Docker(Community Edition)に含まれている配布物は、Docker Engine本体側の関連ファイルのみです。Docker Composeを使いたい場合は、別途docker-composeバイナリファイルを設置する必要があります。

まずはじめに、Dockerが入っていない環境であれば、セットアップします。CentOS 7、最近のFedora、Debian、Ubnutuの環境であれば、便利なセットアップ用スクリプトを使うと、簡単です。

次のようにコマンドを実行して Docker をセットアップできます(自動的にDockerのリポジトリを参照可能にし、docker-ceパッケージをセットアップします)。

# curl -fsSL https://get.docker.com -o get-docker.sh
# sh ./get-docker.sh

CentOS 7の場合は、次のコマンドを実行して Docker Engine用デーモンを起動します。

# systemctl start docker

また、サーバ起動時に自動的にDocker Engineも起動したい場合は、こちらのコマンドも実行しておきます。

# systemctl enable docker

Docker Engineのセットアップが終わっていれば、次は Docker Compose のセットアップです。次のコマンドを実行し、現時点のバージョンのバイナリをダウンロードし、パスの通った場所に設置します。

# curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Docker Compose が利用可能になったかどうかを確認するには、次のようにしてバージョン情報が表示されるかどうかを確認します。

# docker-compose -v
docker-compose version 1.23.2, build 1110ad01

Docker Compose で WordPress を起動しましょう

CMSとしてお馴染みのWordPress(ワードプレス)も、Docker Composeを使って起動できます。もしもComposeを使わなければ、PHPのコンテナとMySQL等のデータベース用コンテナを手動で起動し、ネットワークの接続や設定を行う必要があります。

Docker Composeを使う場合は、まずディレクトリを作成し、移動します。

$ mkdir wordpress
$ cd wordpress

そして、このディレクトリ内に「docker-compose.yml」というファイルを作成し、内容は以下の通りにします。

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

後は、起動コマンドを実行します。

# docker-compose up -d

コマンドを実行後、バックグラウンドで(デタッチド・モードとして)WordPressとMySQLのコンテナが起動します。30秒から1分ほど待った後、ブラウザで「http://localhost:8080」を開くとWordPressの初期画面が表示されるでしょう。たったこれだけで、簡単にWordPressが起動しました。

起動後に停止するには「docker-compose stop」を実行します。また、起動するには「docker-compose start」を実行するたけ。

使い終わったら、次のコマンドを実行して停止・終了、削除しておきます。

# docker-compose down -v

以上がDocker Composeを使った簡単なアプリケーション実行例でした。次回以降は、Docker Composeの使い方や、ネットワーク、ボリューム等の概念や使い方について掘り下げていきます。