Blow Up by Black Swan

Dockerとは③〜応用編(docker composeの使い方)〜

今回は、docker composeについてまとめています。dockerの基本とdockerfileの使い方については、以前書いた記事を参考にして頂ければと思います。

1. docker composeとは

一番最初の記事でも軽く触れましたが、docker composeとは複数のコンテナを一元的に管理するためのものです。dockerでは、1コンテナ1プロセス(or 1ロール)が良いとされています。そのため、実用的な環境を構築する際に、複数のコンテナを生成・起動し、それらをまとめて扱うことがあります。こういった複数のコンテナ間の諸設定や接続などを簡易的に行う上で利用されるのが、docker composeです。

2. docker composeの使い方

ここでは、docker composeの使い方についてまとめています。様々なサイトをみていると、docker composeのインストール手順などが説明されていることがあります。しかし、今ではもうdocker composeは、Dockerに標準装備されている機能の一つになっており、Docker for MacとDocker for Windowsでは個別にインストールする必要などはありません。

また、docker composeを利用するには、.ymlまたは.yamlという拡張子を持ったファイルに諸設定を記述し、コンテナを生成するコマンドを打つだけという非常に簡便なものです。但し、個人的に難しいなと感じているのは、コンテナ間を繋いだり、ホストからリモートアクセスしたりする際のネットワークなどの知識が必要である点で、docker compose自体よりも関連で必要になる周辺知識の体得や理解が伴うところが、docker composeの難しさだと感じています。docker-compose.ymlファイルのの記述や機能のイメージは下記のようなものかなと思います。

 Docker(app)-------------------------------------+
 |                                    +volume+   |
 |  Service1---------------------+    |      |   |
 |  |  container1(webapp)-----+  |    |      |   |
 |  |  |   build: ~~          |  |    |      |   |
 |  |  |   container-name: ~~ |  |    |      |   |
 |  |  |   volume: ~~  ==============>|      |   |
 |  |  |   command: ~~        |  |    |      |   |
 |  |  +----------------------+  |    |      |   |
 |  |                            |    |      |   |
 |  |  container2(nginx)------+  |    |      |   |
 |  |  |   build: ~~          |  |    |      |   |
 |  |  |   container-name: ~~ |  |    |      |   |
 |  |  |   volume: ~~  ==============>|      |   |
 |  |  |   command: ~~        |  |    |      |   |
 |  |  +----------------------+  |    |      |   |
 |  +----------------------------+    |      |   |
 |                                    |      |   |
 |  Service2---------------------+    |      |   |
 |  |                            |    |      |   |
 |  |                            |    |      |   |
 |  +----------------------------+    +------+   |
 |                                               |
 +-----------------------------------------------+

2-1. docker compose.ymlの記述方法

docker composeのファイル名は、基本的に「docker-compose.yml」か「docker-compose.yaml」とします。docker-composeファイルは、階層構造になっており、インデントでその階層を表すようになっています(下記のようなイメージ)。

version: “3”  #最上位の階層
services:  #下記でserviceの内容を定義していく
  firtst-container-tag: ~~  #第2階層  
    build: ~~  #第3階層
      buildのoption群  #第4階層
        ~~ : ~~  #さらなる階層

 second-container-tag: ~~  #次のコンテナの第2階層

volumes:  #ボリューム情報を記載

networks:  #ネットワーク情報を記載

最上位階層のservices、volumes、networksはそれぞれ下記について記載します。

  • service -> コンテナ作成のコマンド
  • network -> 利用するネットワークの明確化
  • volume -> 利用するボリュームの明確化

なお、dockerfileの中に記載されるオプション(CMD, ENV, VOLUMEなど)はそのまま尊重され、実行されます。どの階層でも基本的な記載方法は「コマンド:(コロン) 名称等」となります。

2-2. docker-compose.ymlの主な命令文

docker-compose.ymlファイルの主な命令文は下記になります。一部の命令文では、簡易的に記載する「ショート・シンタックス」と明確的に記載する「ロング・シンタックス」と呼ばれる2つの記述の仕方存在します。

  • image -> ベースイメージの指定(dockerfileで定義している場合は不要)。
  • build -> コンテクストへのパスを指定する(簡単に言えばdockerfileを指定する)。
    • 相対pathの場合、カレントディレクトリからの相対pathと認識される
    • コンテクストへのパスはロング・シンタックスで明示的に指定することもできる。
  • command -> デフォルトのコマンドを書き換える
  • container_name -> コンテナに名前をつける
  • depends_on -> サービス間の依存関係を表現する
  • environment -> 環境変数を加える(辞書型でもイコール記号(=)でつなぐ形でも良い)
  • expose -> リンクされたサービス間でアクセスを可能とするポート番号を指定する

2-3. docker-composeの主なコマンド

docker-composeの主なコマンドは下記になります。「docker-compose」という表記でひとまとまりのコマンドになっています。

  • $ docker-compose –help -> docker-composeコマンドのヘルプ画面
  • $ docker-compose up -> コンテナを作成し、起動するコマンド。dockerのrunコマンドのようなイメージ
    • 基本はdocker-compose.ymlファイルがあるディレクトリ下で実行。”-f”オプションでファイルを明示することもできる。
  • $ docker-compose build -> コンテナのビルド
  • $ docker-compose run < tag名 > -> 該当コンテナの稼働
    • コンテナ名ではなく、タグ名をつける必要がある
  • $ docker-compose ps -> コンテナの確認
  • $ docker-compose stop -> コンテナの停止
  • $ docker-compose rm -> コンテナの削除
  • $ docker-compose down -> コンテナの停止・削除、ネットワークの削除全てを一気通貫で行うコマンド
    • イメージも合わせて削除する場合は、”-rmi all”オプションをつける

3. docker composeでコンテナを構築してみる

最後に自身でdocker-compose.ymlファイルから作ったコンテナ生成のまとめです。jupyter用のコンテナとボリューム用のコンテナを構築しています。ある程度うまく構築できたはずなのですが、ホストコンピュータからブラウザ経由でjupyterサーバにアクセスができません。。。目下改善策を調査中ですが、参考にして頂ければと思います。なお、jupyter用コンテナのdockerfileには2つ目の記事で作成したdockerfileを使っています。

1. "docker-compose.yml"設定ファイルに立ち上げるコンテナを記述

・記述内容

version: '3'
  services:
    app: build: .
    container_name: test-compose
    ports: - "8888:8888"
    volumes: - data-v:/workbook
  db:
    image: centos
    container_name: vcontainer
    volumes: - data-v:/workbook volumes: data-v:

2. 複数のコンテナを一斉にビルド・起動

$ docker-compose up

戻り値

Creating network "docker_test_default" with the default driver
(省略)
Step 1/14 : FROM centos:latest
---> 5182e96772bf
Step 2/14 : RUN yum -y upgrade
(省略)
Step 14/14 : RUN touch ~/.jupyter/jupyter_notebook_config.py
---> Using cache
---> 31cd9937bd7f
Successfully built 31cd9937bd7f
Successfully tagged docker_test_app:latest
(省略)

3. 完成!!のはずが・・・ホストのブラウザから接続できず・・・

解決策を探し中・・・

4. まとめ

現在dockerについて調べ、まとめたことは以上になります。ある程度使い方はわかったので、どんどん活用して色々なアプリ開発につなげていきたいなと思います。

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

5. 主要参考サイト

今回参考にさせていただいたサイトの中で主なものは以下になります。