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

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

  • dockerps - コンテナの一覧を表示。

  • dockerlogs - コンテナの標準出力を表示。

  • dockerstop - 実行中のコンテナを停止。

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

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

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

実際に動作するかどうかは dockerversion コマンドを使います。現在インストールしている 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 1302: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 1302: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 アプリケーションを実行します。dockerrun コマンドで開始します。

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

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

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

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

注釈

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

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

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

$ 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

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

注釈

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

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

PORTS0.0.0.0:49155->5000/tcp

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

注釈

Docker イメージで露出ポートを指定する方法は、 イメージの構築方法 で学びます。

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

Docker は、ネットワーク・ポートの割り当て設定を変更可能です。今回の例では、-P フラグは -p5000 を指定するショートカットにあたります。これは、コンテナの中のポート 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-machineip仮想マシン名 を実行します。例:

$ docker-machine ip my-docker-vm192.168.99.100

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

network port でショートカット

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

$ docker port nostalgic_morse 50000.0.0.0:49155

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

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

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

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

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

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

$ docker top nostalgic_morse
PID USER COMMAND854 root python app.py

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

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

最後に、Docker コンテナに低レベルでアクセスするには、dockerinspect コマンドを使います。指定したコンテナに対する便利な構成情報やステータス情報を、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_morse172.17.0.5

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

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

$ docker stop nostalgic_morse
nostalgic_morse

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

$ docker ps -l

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

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

$ docker start nostalgic_morse
nostalgic_morse

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

注釈

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

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

同僚は作業を終え、コンテナがもう不要との連絡がありました。これで、dockerrm コマンドを使い削除できます。

$ docker rm nostalgic_morse
Error: Impossible to remove a running container, please stop it first or use -f2014/05/24 08:12:56 Error: failed to remove one or more containers

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

$ docker stop nostalgic_morse
nostalgic_morse
$ docker rm nostalgic_morse
nostalgic_morse

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

注釈

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

次のステップ

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

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