Translate

2015年3月9日月曜日

The Docker User Guide: Working with Containersを翻訳してみる





本記事は、Dockerユーザガイドの1セクションである
以下のサイトを翻訳したものです。
Working with Containers
https://docs.docker.com/userguide/usingdocker/


-----

コンテナの動作


前のセクションで、、初めてのコンテナを実行しました。2つのタイプのコンテナをdocker runコマンドで実行しました。


  • フォアグラウンドでの対話型コンテナ
  • バックグラウンドでのデーモン型コンテナ

そして、いくつかのDockerコマンドを学習しました:


  • docker ps - コンテナをリスト
  • docker logs - コンテナの標準出力を参照する
  • docker stop - 実行中のコンテナを停止する


 Tips:
 dockerコマンドを学習する別の方法は、対話形式のチュートリアルです。
 http://goo.gl/dB58ZF

dockerクライアントはとてもシンプルです。それぞれのアクションは1つのコマンドで実行できます、そしてそれそれのコマンドは一連のフラグや属性値をとることができます。


 # Usage:  [sudo] docker [command] [flags] [arguments] ..
 # Example:
 $ sudo docker run -i -t ubuntu /bin/bash

以下の例は、docker versionコマンドを使って、Dockerクライアントやデーモンの代わりに現在のバージョン情報を返却しています。


 $ sudo docker version

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


 Client version: 0.8.0
 Go version (client): go1.2

 Git commit (client): cc3a8c8
 Server version: 0.8.0

 Git commit (server): cc3a8c8
 Go version (server): go1.2

 Last stable version: 0.8.0



Dockerクライアントで何ができるかを参照


オプション無しでdockerバイナリを実行することによってDockerクライアントにおけるすべての有効なコマンドを参照することができます。


 $ sudo docker

現在有効なすべてのコマンドのリストを参照することができます。


 Commands:
      attach    Attach to a running container
      build     Build an image from a Dockerfile
      commit    Create a new image from a container's changes
      ...



Dockerコマンドの使い方を参照


更に拡大して、Dockerの特定のコマンドについての使い方を確認することができます。

dockerの後に[コマンド]をタイプすることで、対象コマンドの使い方を参照することができます:



 $ sudo docker attach
 Help output ...

もしくは、dockerバイナリに「--help」フラグをつけても可能です。


 $ sudo docker attach --help

ヘルプテキストとすべての有効なフラグを表示します:



 Usage: docker attach [OPTIONS] CONTAINER

 Attach to a running container
  --no-stdin=false: Do not attach stdin
  --sig-proxy=true: Proxify all received signal to the process (non-TTY mode only)


 注意:
 Dockerの全コマンドはこちらを参照してください。
 https://docs.docker.com/reference/commandline/cli/



Docker上でのWebアプリケーションの実行


dockerクライアントについて少し学習してきましたので、重要なことへ移ってきましょう:もっとコンテナを実行することです。
しかしこれまで特に役に立たないコンテナばかりでした。このため、Docker上でサンプルWebアプリケーションを実行してみましょう。

Webアプリケーションとして Python Flask アプリケーションを実行してみます。docker runコマンドを使って開始してみましょう。



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

さあ何を実行したのか確認してみましょう。「-d」と「-P」という2つのフラグを指定しました。「-d」フラグはすでにバックグラウンドでコンテナを実行することを学習しています。「-P」フラグは新たに登場しました、これはDockerに対してコンテナ内のどの必須のネットワークポートをホストにマップするかを問い合わせます。この指定によりWebアプリケーションを表示サせています。

先ほどの実行でイメージ「training/webapp」を指定しました。このイメージは事前にビルドされたイメージで、単純なPython Flask Webアプリケーションが作成済みです。


 訳者注:
 Python Flaskはpyhon上で動作する軽量のWebフレームワークです。
 http://ja.wikipedia.org/wiki/Flask

最後に、「pyhon app.py」というコマンドを指定してコンテナに実行させていました。この指定によりWebアプリケーションが開始されます。


 注意:
 docker runコマンドの詳細はコマンドリファレンスや Docker Run Reference を参照してください。
 コマンドリファレンス: https://docs.docker.com/reference/commandline/cli/#run
 Docker Run Reference: https://docs.docker.com/reference/run/



Webアプリケーションコンテナの表示


docker ps コマンドで実行中のコンテナを確認してみましょう。


 $ sudo 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化したコンテナの詳細を1つの重要な追加であるPORTSカラムつきで参照することができます。



 PORTS
 0.0.0.0:49155->5000/tcp

docker runコマンドに「-P」フラグをつけると、Dockerはイメージの中からホストへ露出されるポートをマップされます。


 注意:
 イメージのビルド方法を学習する際に、より詳しいDoucker上のポートの露出方法について学びます。

この場合は、Dockerは49155番ポートを5000番ポート(デフォルトPython Flaskポート)として露出させています。

ネットワークポートバインディングはDockerにおいてとても柔軟に設定可能です。最後の例における「-P」フラグはローカルのDockerホスト上のハイポート(49153から65535)から5000番ポートへ割り当てる「-p 5000」のショートカットです。「-p」フラグを使って特定のポートへDockerコンテナをバインドすることも可能です。例えば:


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

これはコンテナ側の5000番ポートをローカルホスト上の5000番ポートに割り当てています。あなたは今こう思っているかもしれませんね:ハイポートへのマッピングをするよりも、1:1 ポートマッピングをつかいたくなりませんか?1:1マッピングはローカルポート上のそれぞれのポートの1つへマップすることだけ可能という制約があります。
2つのPythonアプリケーションをテストしたいと言ってみましょう:ともにそれぞれのコンテナ内部の5000番ポートへつなぎます。Dockerのポートマッピングなしでは、Dockerホストへ一度に1つポートをマップできるだけです。

だから49155番ポートをブラウズして、アプリケーションを見てみましょう。




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


 注意:
 もしOS X, Windows, Linu上でboot2docker仮想マシンを使うのであれば、
 localhost の代わりに仮想マシンのIPアドレスを取得する必要があります。
 boot2dockerシェルで次のように実行することで取得可能です。

 $ boot2docker ip
 The VM's Host only interface IP address is: 192.168.59.103

 この場合は、「http://192.168.59.103:49155」をブラウズしてください。



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


マップされたポートを返却するdocker ps コマンドを使う方法は少し使いづらいので、Dockerはdocker ポートというショートカットを用意しています。docker ポートを使うために、コンテナのIDもしくは名前を指定し、次にpublic-facing(外部に見せる)ポートを指定します。


 $ sudo docker port nostalgic_morse 5000
 0.0.0.0:49155

このケースでは、コンテナ内で外部の5000番ポートにマップされている対象を調べています。


Webアプリケーションログの表示

アプリケーションで何が発生しているかもう少し詳しく探し出すために、これまでに学習した別のコマンドdocker logも使ってみましょう。


 $ sudo docker logs -f nostalgic_morse
 * Running on http://0.0.0.0:5000/ [#s05efc41]
 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」を追加しています。これはtail -fコマンドのような動作をdocker logコマンドにさせて、コンテナの標準出力を監視します。ここでは5000番ポートで実行中のFlaskアプリケーションのログとアプリのアクセスログエントリを参照することができます。



Webアプリケーションコンテナプロセスの参照


コンテナのログに加えて、docker topコマンドを使ってコンテナ内で実行中のプロセスも調べることができます。


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

上記の例では、コンテナ内部で python app.py のみのプロセスが動作している状態を参照することができます。



Webアプリケーションコンテナの調査


docker inspect コマンドを使ってDockerコンテナ内部の低レベル情報を取得することができます。docker inspectコマンドは、Dockerコンテナについての便利な設定や状態をハッシュ値をJSON形式にして返却します。


 $ sudo 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アドレスを返却するには:


 $ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
 172.17.0.5



Webアプリケーションコンテナの停止


これまでアプリケーションの動作について参照してきました。次にdockerストップコマンドとコンテナ名(nostalgic_morse)を使ってWebアプリケーションコンテナを停止してみましょう。

 $ sudo docker stop nostalgic_morse
 nostalgic_morse


コンテナが停止したかを確認するためにdocker ps コマンドを使って確認します。

 $ sudo docker ps -l



Webアプリケーションコンテナの再起動


おっと!コンテナを停止した直後に別の開発者からコンテナを戻すように要求されました。この場合2つの選択肢があります:新規コンテナの作成、もしくは再起動です。直前のコンテナを開始してもどしてみましょう。


 $ sudo docker start nostalgic_morse
 nostalgic_morse

すぐに docker ps -l を再度実行して、実行中のコンテナが戻ったことを確認するか、アプリケーションのレスポンスがあるかコンテナのURLをブラウズしてください。


 注意:
 コンテナを停止後起動する docker restart コマンドもあります。



Webアプリケーションコンテナの削除


あなたの同僚がコンテナの使用が終わり、これ以上必要ないといってきました。docker rm コマンドを使って削除してみましょう。


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

何が起こりましたか?実行中のコンテナを削除することができませんでした。これは必要かもしれない実行中のコンテナの削除から保護しています。最初にコンテナを停止してから再度試してみましょう。


 $ sudo docker stop nostalgic_morse
 nostalgic_morse
 $ sudo docker rm nostalgic_morse
 nostalgic_morse

これで、コンテナは停止し、削除されました。


 注意:
 削除したコンテナは戻せないことを常に忘れないで!



次のステップ


ここまではDocker Hubからダウンロードしたイメージだけ使用していました。これからは独自のイメージを構築し共有する方法を説明します。

Dockerイメージの動作へ進む

-----

これを読むとポート指定にくせがあるように読めたが
ショートカットは使わなければ大丈夫そう。

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...