Docker入門(第六回)〜Docker Compose〜

こんにちは、Acroquest Technologyの横山です。

先日、DockerCon 2018がサンフランシスコでありました。WindowsやMac上で利用するためのツールとして、Docker for WindowsDocker for Macがありますが、次期バージョンのDocker for Windows Desktopでは、テンプレートから選んでコンテナを起動させたりすることも可能になるようで、より使いやすくなりそうです。

[速報]次期Docker for Win/Mac、GUIの数クリックで簡単にアプリケーションのコンテナ化と実行が可能に。DockerCon 2018

他にも、choice、agility、securityという点から、より使いやすさが向上されていきそうなので、とても気になるところです。
DockerConに行った方の記事があったので、そちらも紹介しておきます。

おなかいっぱいすぎる・・・DockerCon SF 18に行ってきた

はじめに

これまでの連載で、各種オプションを使っての起動やDockerネットワーク、複数コンテナの起動、などを説明してきました。ただ、扱うコンテナ数が増えたり、いろいろなオプションを使って起動するものが増えたりすると、その管理が大変になってきます。

そこで本連載の最後となる第六回では、その管理を簡単にするDocker Composeについて説明します。

Docker Composeとは

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

これまでの連載の中でも、複数のコンテナを起動させる場面がありました。その際、各コンテナを起動するために、それぞれ起動コマンドを実行する必要がありました。また、コンテナを起動する際に、いろいろなオプションを利用していました。コマンドや手順が複雑になると、他の環境で使う/使ってもらう場合に、ミスが発生しやすくなります。他の環境でも同じ構成(同じDockerイメージ)で動かせるというDockerのメリットを生かすには、起動手順なども簡単であってほしいですよね。

そこで活躍するのが、Docker Composeです。

Docker Composeでは、Dockerビルドやコンテナ起動のオプションなどを含め、複数のコンテナの定義をymlファイルに書き、それを利用してDockerビルドやコンテナ起動をすることができます。一つの簡単なコマンドで複数のコンテナを管理できるようになります。

本記事でDocker Composeの使い方も知ってもらい、よりDockerを使いこなしてもらいたいと思います。

Docker Composeのインストール

それでは、Docker Composeをインストールしてみましょう。

Docker Composeをインストールしても、Docker自体はインストールされませんので、事前にDockerのインストールは済ませておいてください。(第二回参照)

Dockerがインストールされている環境で以下を実行します。

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

実はこれだけで完了です。以下のコマンドを実行し、Docker Composeが使用できるか確認してみましょう。

# docker-compose --version
docker-compose version 1.21.2, build 1719ceb

Docker Composeのバージョン情報が表示されれば問題ありません。

Docker Composeを使ってみよう

それでは実際にDocker Composeを使用してみましょう。

Docker Composeを使用する際、「docker-compose.yml」というファイルが必要となります。

このファイルには、

  • Dockerイメージをビルドするための情報(使用するDockerfile、イメージ名など)
  • コンテナ起動するための情報(ホストとの共有ディレクトリ設定やポートフォワードなどの起動オプションなど)
  • 使用するDockerネットワーク

などを定義します。

WordPressをコンテナ起動する場合を例にdocker-compose.ymlについてみていきましょう。

docker-compose.ymlについて(既存のDockerイメージを使用する場合)

WordPressの構成については、第五回で紹介したように、WordPressコンテナとMySQLコンテナで構成されています。

その構成のコンテナを起動するためのdocker-compose.ymlが以下になります。

version: '3'
services:

  wordpress:
    image: wordpress
    container_name: some-wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: my-secret-pw

  mysql:
    image: mysql:5.7
    container_name: some-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw

「services」の下に「wordpress:」と「mysql:」とありますが、これが起動するコンテナに相当すると考えてください。コンテナ起動するコマンドと比較してみましょう。

# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
# docker run --name some-wordpress -e WORDPRESS_DB_PASSWORD=my-secret-pw --link some-mysql:mysql -d -p 8080:80 wordpress

コマンドのオプションとdocker-compose.ymlを比較すると以下のようになります。

設定内容 docker run コマンド docker-compose.yml
コンテナ名 --name container_name
環境変数 -e environment
ポートフォワード -p ports
使用するDockerイメージ コマンドの最後 image

ここで、wordpressコンテナのdocker runコマンドにある「--link」オプションは、docker-compose.ymlには出てきていませんね。docker-compose.ymlを使用すると、自動でDockerネットワークを作成するため、service名(mysql、wordpress)を使って自動で名前解決ができるようになっています。そのため、--linkオプションについては、docker-compose.ymlでは指定する必要はありません。

上記以外にも設定可能な項目は多数ありますので、「Compose file version 3 reference」を参照ください。

それでは、このdocker-compose.ymlを使用して、コンテナを起動してみましょう。コンテナの起動には以下のコマンドを実行してください。「-d」オプションはバックグラウンド起動のオプションです。

# cd <docker-compose.ymlが置かれているディレクトリ>
# docker-compose up -d

これだけでコンテナの起動ができます。docker runのときのように、オプションをいろいろと書かなくてもよいので、とても楽ですね。起動状態を以下のコマンドで確認してみましょう。

# docker-compose ps

「State」が「Up」になっていれば、コンテナ起動が完了しています。

docker-compose.ymlについて(自分でDockerイメージを作成する場合)

上記の例は、公開されているDockerイメージを使用する場合の説明でした。

第四回でTomcatのDockerイメージを自分で作成しましたが、その場合のdocker-compose.ymlの設定、コマンドについて説明します。

以下のようにファイルを作成、配置します。

<任意のディレクトリ>
 /tomcat-sample
  docker-compose.yml
  /tomcat
   Dockerfile
   /files
    apache-tomcat-9.0.6.tar.gz

tomcatディレクトリ配下は、第四回で作成したものと同じものを配置してください。
docker-compose.ymlについては、以下のように作成します。

version: '3'
services:
  tomcat:
    build: ./tomcat
    image: tomcat-image
    container_name: tomcat1
    ports:
      - 8081:8080
    volumes:
      - ./tomcat/share/logs:/share/logs

既存のイメージを使う場合との差分は、「build:」の部分です。「build:」でDockerfileの存在するディレクトリを指定します。また、ホストとの共有ディレクトリ設定は「volumes:」で設定可能です。

それでは、Dockerイメージのビルドから行いましょう。以下のコマンドでDockerイメージの作成ができます。

# docker-compose build

イメージが作成できたか確認します。

# docker images

次にコンテナを起動します。

# docker-compose up -d
# docker-compose ps

これでdocker-composeを使って、Dockerイメージのビルドからコンテナ起動までができました。

その他Docker Composeコマンドについて

コンテナ起動までできましたので、停止、削除のやり方についても説明します。

以下のコマンドで停止します。

# docker-compose stop

以下のコマンドでコンテナを削除します。

# docker-compose rm

(yes/noを聞かれずに削除する場合)
# docker-compose rm -f

また、停止、削除、ネットワーク削除を全て実行する場合は、以下のコマンドで実行できます。

# docker-compose down

イメージも合わせて削除する場合は、以下のようなオプションを付けて実行します。

# docker-compose down --rmi all

プロキシ配下の環境でDockerイメージを作成する場合

プロキシ配下でDockerイメージのビルド(docker-compose build)を行う場合、yumなどを実行するには、プロキシ設定をする必要があります。その場合は、以下のようなオプションを付けて実行することで、Dockerイメージのビルドの際に環境変数でプロキシ情報を渡して実行することができます。

# docker-compose build \
  --build-arg http_proxy=http://<プロキシサーバのIP>:<プロキシサーバのポート> \
  --build-arg https_proxy=http://<プロキシサーバのIP>:<プロキシサーバのポート>

まとめ

今回は、Docker Composeの使い方を説明しました。複数のコンテナを使う場合は管理がしやすくなり、一つのコンテナでもオプション設定を何度も入力しなくてよくなります。Docker Composeを活用して、より効果的にDockerを使っていただければと思います。

最後に

本連載は今回の第六回で最後となります。開発環境や試験環境としてDockerを利用したり、CIツールなどでビルド環境用コンテナとして利用したりするなど、いろいろな使い方ができますので、ぜひ活用していただければと思います。自分なりの使い方を発見するのも楽しいです。

そして、最近ではコンテナを使うのは当たり前になってきている流れもあり、多数のコンテナを管理するケースも増えてきていて、コンテナのオーケストレーションツールであるKubernetesはかなり注目が集まっています。コンテナ関係のセミナーに行くと、ほとんどのセッションがKubernetesの内容である、といったこともあります。Dockerを使ってみたこの機会に、ぜひKubernetesなどの動向も追ってみると面白いと思います。

これまで読んでくださった方々、ありがとうございました。