シンプルなアプリケーションの実行

“コンテナで Hello world” で、docker run コマンドを使い、初めてのコンテナを起動しました。双方向コンテナ (interactive container) をフォアグラウンドで実行しました。また、デタッチド・コンテナ (detached container) をバックグランドで実行しました。この過程で、複数の Docker コマンドを学びました:

  • docker ps - コンテナの一覧を表示。
  • docker logs - コンテナの標準出力を表示。
  • docker stop - 実行中のコンテナを停止。

Docker クライアントについて学ぶ

気が付いていないかもしれませんが、Bash ターミナル上で毎回 docker と入力することで、Docker クライアントを使っていました。クライアントとはシンプルなコマンドライン・クライアントであり、コマンドライン・インターフェース (CLI) とも呼びます。クライアントを使った各種の動作にはコマンド(命令)を使います。各コマンドには一連のフラグや引数を持ちます。

# 使い方:  [sudo] docker [サブコマンド] [フラグ] [引数] ..
# 例:
$ docker run -i -t ubuntu /bin/bash

実際に動作するかどうかは docker version コマンドを使い、現在インストールしている Docker クライアントとデーモンのバージョン情報を確認できます。

$ docker version

このコマンドは、使用している Docker クライアントとデーモンのバージョンを表示するだけでなく、Go 言語のバージョン(Docker を動かすプログラミング言語)も表示します。

Client:
  Version:      1.8.1
  API version:  1.20
  Go version:   go1.4.2
  Git commit:   d12ea79
  Built:        Thu Aug 13 02:35:49 UTC 2015
  OS/Arch:      linux/amd64

Server:
  Version:      1.8.1
  API version:  1.20
  Go version:   go1.4.2
  Git commit:   d12ea79
  Built:        Thu Aug 13 02:35:49 UTC 2015
  OS/Arch:      linux/amd64

Docker コマンドの使い方を表示

特定の Docker コマンドに対する使い方も表示できます。help は使い方の詳細を表示します。利用可能なコマンドの一覧を表示するには、次のように実行します:

$ docker --help

典型的な使い方は、コマンドラインで --help フラグの指定です。

$ docker attach --help

Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

  --help=false        Print usage
  --no-stdin=false    Do not attach stdin
  --sig-proxy=true    Proxy all received signals to the process

注釈

各コマンドの更なる詳細や例については、当ガイドの コマンド・リファレンス をご覧ください。

Docker でウェブ・アプリケーションを実行

それでは、これまで docker クライアントについて少しだけ学んできました。多くのコンテナの実行という、より重要なことを学びます。これまで実行してきたコンテナのほとんどは、いずれも役に立つような何かを行うものではありませんでした。今度は、Docker を使ったウェブ・アプリケーションの実行に移ります。

ウェブ・アプリケーションとして、Python の Flask アプリケーションを実行します。docker run コマンドから始めます。

$ docker run -d -P training/webapp python app.py

コマンドの実行内容を精査します。-d-P という2つのフラグを指定しました。-d フラグは既出であり、コンテナをバックグラウンドで実行するよう Docker に命令します。-P は新しいフラグで、コンテナ内部のネットワークで必要なポートを、ホスト側にマップする(割り当てる)よう Docker に命令します。これにより、ウェブ・アプリケーションを観られるようになります。

ここではイメージ training/webapp を指定しました。このイメージは事前に構築しておいたイメージであり、シンプルな Python Flask ウェブ・アプリケーションが入っています。

最後にコンテナに対して python app.py を実行するコマンドを指定しました。これでウェブ・アプリケーションが起動します。

注釈

docker run コマンドについて、より詳細を知りたい場合は コマンド・リファレンスDocker Run リファレンス をご覧ください。

ウェブ・アプリケーションのコンテナを表示

さて、docker ps コマンドを使い、実行中のコンテナを表示できます。

$ docker ps -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

docker ps コマンドに新しいフラグ -l を指定しています。これは、最後に開始したコンテナの詳細を返すよう、docker ps コマンドに命令します。

注釈

標準では、docker ps コマンドは実行中のコンテナ情報のみ表示します。停止したコンテナの情報も表示したい場合は、-a フラグを使います。

始めて Docker 化したコンテナ で見てきた詳細に加え、重要な PORTS 列に情報が追加されています。

PORTS
0.0.0.0:49155->5000/tcp

docker run コマンドに -P フラグを渡すと、Docker はイメージからホスト側に対して、必要なポートを公開 (expose) します。

注釈

Docker イメージで公開ポートの指定方法については、 イメージの構築方法 で学びます。

今回の場合、Docker はコンテナのポート 5000 (Python Flask の標準ポート)をホスト上のポート 49115 上に公開しました。

Docker は、ネットワーク・ポートの割り当て設定を変更可能です。今回の例では、-P フラグは -p 5000 を指定するショートカットにあたります。これは、コンテナの中のポート 5000 を、ローカルの Docker ホスト上のハイポート(典型的な 32768 ~ 61000 の範囲にある一時利用ポート)に割り当てます。あるいは、-p フラグを使うことで、Docker コンテナに割り当てるポートの指定も可能です。例:

$ docker run -d -p 80:5000 training/webapp python app.py

これはローカルホスト上のポート 80 を、コンテナ内のポート 5000 に割り当てます。もしかすると、次の疑問を持つかもしれません。Docker コンテナをハイポートにマッピングするのではなく、常に 1:1 のポート割り当てを使わないのかと。これは、ローカルホスト上の各ポートに 1:1 で割り当て可能なポートは1つだけだからです。

例えば2つの Python アプリケーションを実行したいとします。いずれもコンテナの中でポート 5000 を使うものです。この場合 Docker のホスト上で、ポート 5000 にアクセスできるコンテナは常に1つだけです。

それではウェブ・ブラウザからポート 49155 を表示してみます。

../../_images/webapp1.png

Python アプリケーションが動いています!

注釈

Mac OS X や Windows または Linux 上の仮想マシンを使っている場合は、ローカルホスト上で仮想マシンが使っている IP アドレスを確認する必要があります。コマンドラインや端末アプリケーションを使い docker-machine ip 仮想マシン名 を実行します。例:

$ docker-machine ip my-docker-vm
192.168.99.100

この例では、ブラウザで http://192.168.99.100:49155 を開きます。

ネットワーク・ポートのショートカット

docker ps コマンドを使い、割り当てたポートを確認するのは、少々面倒です。そこで、 Docker の docker port という便利なソートカットを使います。docker port でコンテナ ID や名前を指定すると、公開ポートに割り当てられているポート番号が分かります。

$ docker port nostalgic_morse 5000
0.0.0.0:49155

この例では、コンテナ内のポート 5000 が、外部の何番ポートに割り当てられたか確認します。

ウェブ・アプリケーションのログ表示

アプリケーションで何が起こっているのか、より詳しく見られます。これまで学んだ docker logs コマンドを使います。

$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

今回は新しい -f フラグを使いました。これは docker logs コマンドに対して tail -f コマンドのように動作するもので、コンテナの標準出力を見ます。ここではポート 5000 で動作している Flask アプリケーションに対する接続ログを表示します。

アプリケーション・コンテナのプロセスを見る

コンテナのログに加え、docker top コマンドを使い、内部で実行しているプロセスを確認できます。

$ docker top nostalgic_morse
PID                 USER                COMMAND
854                 root                python app.py

ここでは python app.py コマンドのみ、コンテナ内のプロセスとして動作していることが分かります。

ウェブ・アプリケーション・コンテナの調査

最後に、Docker コンテナに低レベルのアクセスをするには、docker inspect コマンドを使います。指定したコンテナに対する便利な構成情報やステータス情報を、JSON 形式で得られます。

$ docker inspect nostalgic_morse

実行すると、次のような JSON 出力例を表示します。

[{
    "ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
    "Created": "2014-05-26T05:52:40.808952951Z",
    "Path": "python",
    "Args": [
       "app.py"
    ],
    "Config": {
       "Hostname": "bc533791f3f5",
       "Domainname": "",
       "User": "",
. . .

または、必要となる特定の情報のみ表示するように、情報を絞り込めます。次の例では、コンテナの IP アドレスのみ表示します。

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nostalgic_morse
172.17.0.5

ウェブ・アプリケーション・コンテナの停止

ここまではウェブ・アプリケーションが動作するのを見て来ました。次は docker stop コマンドを使い、nostalgic_morse という名前のコンテナを指定します。

$ docker stop nostalgic_morse
nostalgic_morse

docker ps コマンドを使い、コンテナの停止を確認します。

$ docker ps -l

ウェブ・アプリケーション・コンテナの再起動

おっと! コンテナを停止した後、他の開発者がコンテナを元に戻してと言ってきました。ここでは2つの選択肢があります。新しいコンテナを起動するか、あるいは古いものを再起動するかです。先ほどのコンテナを元に戻してみましょう。

$ docker start nostalgic_morse
nostalgic_morse

ここで素早く docker ps -l を再度実行すると、実行していたコンテナが復帰し、コンテナの URL をブラウザで開くと、アプリケーションが応答します。

注釈

docker restart コマンドも利用可能です。こちらはコンテナの停止と起動を行います。

ウェブ・アプリケーション・コンテナの削除

同僚から作業を終えたので、コンテナをもう必要としないとの連絡がありました。これで、docker rm コマンドを使って削除できます。

何が起こったのでしょうか? 実行中かもしれないコンテナを間違って削除しないように、保護されています。先にコンテナを停止してから、再び実行します。

$ docker stop nostalgic_morse
nostalgic_morse
$ docker rm nostalgic_morse
nostalgic_morse

今度はコンテナを停止し、削除しました。

注釈

常に、最後にコンテナを削除するのを忘れないでください。

次のステップ

ここまでは Docker Hub からダウンロードしたイメージのみを使ってきました。次は、自分自身にイメージの構築を共有する方法を紹介します。

Docker イメージの操作 に移動します。