シンプルなアプリケーションの実行¶
「 コンテナで 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 を表示してみます。
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 イメージの操作 に移動します。
参考
- Run a simple application
- https://docs.docker.com/engine/userguide/containers/usingdocker/