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イメージの動作へ進む

-----

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

2015年3月6日金曜日

The Docker User Guide: Dockerizing Applications: A "Hello world" を翻訳してみた



今頃気づいたのですが、The Docker User Guideを翻訳している人って
別にいたんですね。
読んでみるとこちらのほうが、翻訳がエレガントでした..

もし読みやすい方を探している方はコッチを参照することをおすすめします。

Dockerとは - Docker User Guide
http://qiita.com/zembutsu/items/bbf740839c887835f2ee



とはいえせっかく翻訳したので、私の拙い訳も
一応公開します。

今回の記事は、以下のサイトを翻訳したものです。
Dockerizing Applications: A "Hello world"
 https://docs.docker.com/userguide/dockerizing/



---

"Hello world"アプリケーションのDocker化


それで Docker に関する全てについてですか?

Dockerはコンテナ内部でのアプリケーション実行を許可します。コンテナ内部でアプリケーションを実行させるには、次のコマンドを使います:docker run
 注意:
 もしBoot2DockerのようなリモートDockerデーモンを使用しているのであれば、
 ドキュメンテーション内の例にあるdockerコマンドの先頭のsudoをタイプしないで
 ください。

 訳者注:
 rootによるログインを許可している場合も不要です。



Hello world


今すぐ次のコマンドを試してみてください。

 $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
 Hello world

そしてこれがあなたの一番最初のコンネナ起動になります。

それで、何が起こったのでしょう?docker runコマンドが実行した内容を順番に見て行きましょう。

最初に、実行したいdockerバイナリとコマンドを指定し、実行します。docker runコンビネーションはコンテナを実行します。

次に、イメージ「ubuntu:14.04」を特定します。これは実行するコンテナの元となります。Dockerはイメージを呼び出します。この場合は、Ubuntu 14.04 OS イメージを使用します。

イメージを特定すると、Dockerは、最初にDockerホスト上のイメージを見に行きます。もし発見できなかった場合は、Docker Hubのパブリックイメージをダウンロードします。

次に、なにのコマンドを新規コンネな内で実行するかDockerと対話します:


 /bin/echo 'Hello world'

コンテナが起動すると、DockerはあらたにUbuntu14.04環境を新規生成します。そして内部で/bin/echo コマンドを実行します。結果はコマンドライン上で見ることができます:

 Hello world

それで、この後コンテナに何が起こるの?ええと、Dockerコンテナは指定したコマンドが有効な限り実行し続けます。この例ではできるだけ早くHello worldをechoして、コンテナを停止します。


対話型(Interactive)コンテナ


再度docker runコマンドを試してみましょう、今度はコンテナに新たなコマンドを指定します。

 $ sudo docker run -t -i ubuntu:14.04 /bin/bash
 root@af8bae53bdd3:/#

ここでは再度docker runコマンドで「ubuntu:14.04」イメージを指定しています。ただし、2つのフラグを追加しています:「-t」と「-i」です。「-t」フラグはpseudo-ttyもしくは新しいコンテナ内部のターミナルを割り当てます。そして「-i」フラグはコンテナの標準入力(STDIN)を使った対話型接続を許可します。

/bin/bas
hを実行するためのコンテナのための新たなコマンドも指定しています。これはコンテナ内部でBashを起動することを指定しています。


そして、コンテナが起動したら、コマンドプロンプトが表示されます:


 root@af8bae53bdd3:/#

いくつかのコマンドを試してみましょう:

 root@af8bae53bdd3:/# pwd
 /
 root@af8bae53bdd3:/# ls
 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var


カレントディレクトリを表示するためにpwdを実行し、/ ルート・ディレクトリに入っていることを表示しています。また典型的なLinuxファイルシステムのようなルートディレクトリ上のディレクトリリスト表示を実行しています。

コンテナ内部で遊ぶことができ、終わったらexitコマンドもしくはCtrl-Dを入力して終了することができます。

 root@af8bae53bdd3:/# exit


一つ前のコンテナの場合のように、一度Bashプロセスを終了すると、コンテナが停止します。


デーモン化したHello world


コマンドを実行して終了したコンテナは使い道がありますが、あまり役に立ちません。Dockerを使っておそらく実行しようとする多くのアプリケーションのように、デーモンとして実行するコンテナを作成してみましょう。

もう一度、docker runコマンドを使います:

 $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

なに待ってるの?"Hello world"がありますよ、ここで実行結果を見てみましょう。それはかなり簡単に見られるべきです。docker runを実行しましたが、この場合「-d」フラグを使います。「-d」フラグはDockerにコンテナの実行を問い合わせ、それをデーモン化するために、バックグラウンドに配置します。

同じイメージ「ubuntu:14.04」をまた指定しています。

最後に、実行コマンドを指定しています:

 /bin/sh -c "while true; do echo hello world; sleep 1; done"

これは(hello)worldの最も愚かなデーモンです:永遠にhello worldをechoし続けます。

そしてなぜたくさんのhello worldが見えないのでしょう?代わりにDockerは次のような本当に長い文字列を返しました:

 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

この長い文字列は、コンテナIDと呼ばれるものです。コンテナごとに一意に定義されており、そこで動作していることを表してます。

 注意:
 コンテナIDは、少し長くて扱いづらいです。それらが動作するコンテナを名前付けるより短いIDを使う方法を後ほど紹介します。

hello worldデーモンが何を発生させたかを見るためにコンテナIDを使用します。

最初にコンテナが動作しているか確認してみましょう。そのためにはdocker psコマンドを使います。docker psコマンドはDockerデーモンに対して知っているすべてのコンテナの情報を問い合わせます。


 $ sudo docker ps
 CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
 1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

このようにデーモン化されたコンテナを照会することができます。docker psコマンドは有益な情報を得ることができます。この時のコンテナIDは短縮されています: 1e5535038e28

ビルドに使用したイメージ(ubuntu:14.04)、実行中のコマンド、ステータス、自動的に割り当てられた名前(insane_babbage)が参照可能です。

 注意:
 Dockerは自動的にコンテナに名前をつけます、もう少し後で名前の指定方法を学習します。

OK、ここで動作中であることを知りました。しかし実行を指示したことをコンテナが実行していますか?それを見るためにはdocker log コマンドを使ってコンテナの内部を参照します。Dockerにアサインされたコンテナ名を使いましょう。

 $ sudo docker logs insane_babbage
 hello world
 hello world
 hello world
 ...

docker logコマンドはコンテナ内部を参照し標準出力を表示します:この場合はhello worldコマンドの出力になります。

すごい!デーモンが動作しています、そしてこれがあなたにとって初めてのDockerアプリケーションになります!

自分でコンテナを作成できることが確認できたので、片付けをしてデーモン化したコンテナを終了してみましょう。このためには、docker stopコマンドを使います。

 $ sudo docker stop insane_babbage
 insane_babbage

docker stopコマンドはDockerに対して実行中のコンテナ対して礼儀正しく停止を指示します。もし成功したのであれば、停止させたコンテナの名前を返却します。

docker psコマンドを使って動作状態を確認してみましょう。


 $ sudo docker ps
 CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES

完璧です、コンテナは停止済みです。


次のステップ


Dockerをはじめることがいかに簡単かわかったと思いますので、より先進的なタスクの実行方法を学習しましょう。

コンテナの動作へ進む

2015年3月5日木曜日

The Docker User Guide を翻訳してみた

Dockerを使いはじめるなら、やはりUser Guideを読まないと..

..ということで、超私的に翻訳をはじめました。
この記事では、
The Docker User Guide
https://docs.docker.com/userguide/
の範囲だけ翻訳してみました。

At Your Own Riskで参考にしてください。


なお、各セクションは少しづつ翻訳していきます。


----------

Dockerユーザガイドへようこそ


序論では、Dockerとはなにか、そして Docker がどのようにして実行されているのか知ることができます。このガイドでは、環境をDockerの基礎的な使い方を理解でき、あなたの環境に(Dockerを)融合します。

以下の内容を学習することができます:
  • アプリケーションのDocker化
  • 自分のコンテナの実行
  • Dockerイメージをビルド
  • 自分のDockerイメージを他人と共有
  • そして、もっと!

本ガイドのメジャーセクションはDockerライフサイクルを分割したものです:


Docker Hubを使ってみよう


Docker Hubってどうつかったらいいの?

Docker hubとは Dockerのセントラルハブのことです。公式Dockerイメージがホストされており、Docker環境を構築ビルドを支援するサービスが提供されています。詳細はこちら:

Docker Hubの使い方へ進む



"Hello world"アプリのDocker化


どうやってコンテナ内でアプリケーションを実行するの?

Dockerはアプリケーション実行のためのコンテナベースの仮想プラットフォームを提供します。アプリケーションをDocker化して実行するには:

アプリケーションのDocker化へ進む


コンテナの動作


自分のコンテナをどうやって管理するの?

一度Dockerコンテナ内でアプリケーションを実行すると、それらのコンテナが管理されているか参照したくなるでしょう。どうやってコンテナを監査(inspect)・監視・管理するかは:


コンテナの動作へ進む


Dockerイメージの動作


どうやって自分のイメージをアクセスして、共有して、ビルドするの?

Dockerの使い方を学習したら、次はDockerを使ってアプリケーションイメージのビルド方法を学習しましょう。

Dockerイメージの動作へ進む



コンテナへのリンク


これまでは、Dockerコンテナ内部の個別のアプリケーションのビルド方法を学習してきました。次は複数のDockerコンテナ群へリンクすることでDockerでアプリケーションスタック全体のビルド方法を学習します。

コンテナへのリンクへ進む


コンテナ内データの管理


Dockerコンテナのリンク方法を学習したら、次はコンテナ内部のデータ、ボリューム、マウントの管理方法について学びます。

コンテナ内のデータ管理へ進む


Docker Hubの動作


Dockerの使い方についてもう少し学ぶために、Dockerと信頼性のあるビルドや個人のリポジトリを含むDocker Hub上で有効なサービスの連携方法についてみていきましょう。

Docker Hubの動作へ進む

Docker Compose


Docker Compose は、1つのファイルにアプリケーションのコンポーネント(コンテナ、設定、リンク、ボリューム)を定義することを許可します。そして1つのコマンドでアプリ実行準備や起動なにもかも設定することができます。


Docker Composeユーザガイドへ進む



Docker マシン


Docker マシンはDocker エンジンを素早く準備し起動を助けます。マシンはあなたのコンピュータ、クラウドプロバイダ、そして/もしくはあなたのデータセンタ上のDockerエンジンのためにホストを準備することができます。そしてそれらのホストと安全に通信するDockerクライアントを設定します。

Dockerマシンへ進む



Docker Swarm


Docker Swarm はいくつかのDocker エンジンをプールし、単一のDockerエンジンとして露出させています。Docker Swarmは標準Docker APIを提供しているので、Dockerで動作確認されたどんなツールでも複数のホストへ透過的にスケールアウトできます。


Docker Swarm ユーザガイドへ進む


参考


 訳者注:以下のリンク先は、翻訳していません。


---------

このページはユーザガイドの目次みたいなページですね。

The Docker User Guide: Managing Data in Containers を翻訳してみた



The Docker User Guideの1セクションである

 Managing Data in Containers
 https://docs.docker.com/userguide/dockervolumes/


の範囲だけ翻訳してみました。
もちろん参照する際はAt Your Own Riskでお願いします。

----------

コンテナ内データの管理


いくつかの基本的なDockerコンテナについて紹介し、Dockerイメージがいかにして動作するかだけでなくコンテナ間のネットワーキングやリンクについて見てきました。このセクションでは、内部そしてDockerコンテナ間のデータをいかにして管理することができるかを議論します。

Docker内のデータ管理方法として主に2つの手段に着目します。

  • データボリューム
  • データボリュームコンテナ

データボリューム


データボリュームは、(永続化もしくは共有されたデータのためにいくつかの有用な機能を提供する)ユニオンファイルシステムをバイパスする1つ以上のコンテナの範囲内で特別に設計されたディレクトリです:

  • ボリュームはコンテナが生成されると初期化される
  • データボリュームはコンテナ間で共有や再利用が可能
  • データボリュームへの変更によりディレクトリが作成される
  • データボリュームへの変更にはイメージの更新時は含まれない
  • データボリュームはそのコンテナ自身が削除されても永続している

データボリュームは、コンテナのライフサイクルに独立して、データを永続させるために設計されています。Dockerはそれゆえコンテナを削除した時でも決して自動的にボリュームを削除しません。コンテナによって参照されない"ガーベージコレクト"ボリュームも削除しません。

データボリュームの追加


docker createコマンドやdocker runコマンドに「-v」フラグを使うことで、コンテナにデータボリュームを追加することができます。複数のデータボリュームをマウントするために複数の「-v」フラグを使用することができます。Webアプリケーションコンテナに1つのデータボリュームをマウントしてみましょう。


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

このコマンドは /webappのコンテナ内部に新規ボリュームを生成します。

 注意:
 イメージから生成されたコンテナに対して1つ以上のボリュームを追加するために
 Dockerfile内のVOLUMEインストラクションもまた使用可能です。

データボリュームとしてホストディレクトリをマウント


「-v」フラグを使用したボリュームの新規作成に加えて、コンテナ内のDockerデーモンのホストからディレクトリをマウントすることも可能です。

注意:
もしBoot2Dockerを使用するのであれば、Dockerデーモンだけは OSX/Windows ファイルシステムへのアクセスが制限されます。Boot2Dockerは /Users(OSX) もしくは C:\Users(Windows) ディレクトリへの自動共有を試行します。-「docker run -v /Users/:/ ... 」(OSX)もしくは「 docker run -v /c/Users/:/ 」することができます。他のすべての経路はBoot2Docker仮想マシンのファイルシステムからとなります。


 $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上記のコマンドは、ホストのディレクトリ/src/webapp をコンテナの/opt/webappへマウントします。
 

注意:
もし /opt/webapp がコンテナイメージの内部ですでに存在していた場合、コンテナは期待されるマウント動作と一致し続けるために、ホスト上の/src/webappのコンテンツに置き換えられます。

これはテストの際にはとても有効です、例えばコンテナ内へソースコードをマウントして、ソースコードを変更した際のアプリケーションの動作を確認することができます。ホスト上のディレクトリは絶対パスで指定しなくてはなりません。もしディレクトリが存在しないと、Dockerは自動的に作成します。
 

注意:
これはビルドされたイメージのポータビリティや共有を目的としたDockerfileからは有効ではありません。ホストディレクトリはもともとホスト依存であるため、おそらくDockerfile内で指定したホストディレクトリはすべてのホスト上ではおそらく動作しないでしょう。

Dockerはデフォルトでは読み書きボリュームですが、読み込みのみのディレクトリをマウントすることもできます。

 $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

ここでは同一の /src/webapp ディレクトリをマウントしていましたが、ro オプションを追加することで読み込みのみでマウント
指定できます。

データボリュームとしてホストファイルをマウント


「-v」フラグで、ホストマシンからディレクトリの代わりに、単一のファイルをマウントすることもできます。

 $ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

このコマンドは、ホスト上のbashヒストリを新規のコンテナのbashシェルへ投入します、そしてコンテナから出た際にコンテナ内でタイプしたコマンドのヒストリがホスト側にも反映しています。

 注意:
 viやsedを含むファイル編集のための多くのツールは結果としてinodeを変更します。Docker v1.1.0 以降、以下の様なエラーが発生します。
 "sed: cannot rename ./sedKdJ9Dy: Device or resource busy"
 マウントされたファイルを編集したい場合は、親ディレクトリをかわりにマウントする方法がおそらく最も簡単です。


データボリュームコンテナの新規作成とマウント


永続データを複数のコンテナ間で共有したい場合、もしくは非永続コンテナから使用したい場合、データボリュームコンテナ(Data Volume Container)と名付けられたものを作成してそこからデータをマウントする方法がベストです。

共有ボリュームを持つ新たな名前のコンテナを作成しましょう。このコンテナはアプリケーションが動作せず、「training/postgres」イメージとして再利用されます、このためすべてのコンテナは保存するためのディスクスペースのレイヤとして一般的に使用されます。

 $ sudo docker create -v /dbdata --name dbdata training/postgres

次に「--volumes-from」フラグを使って、別のコンテナの /dbdata ボリュームをマウントすることができます。

 $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres

更に他のコンテナでは:

 $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

複数の「--volumes-from」パラメータを使って、複数のコンテナから複数のデータボリュームを持ち出すことができます。

db1もしくはdb2コンテナを経由して更に別のコンテナがdbdata コンテナのボリュームをマウントすることによってチェーンを延長することができます。

 $ sudo docker run -d --name db3 --volumes-from db1 training/postgres

もしもとのdbdataコンテナを含む、もしくは以降のコンテナdb1、db2を含むマウントボリュームを削除したとしても、ボリュームは削除されません。ディスクからボリュームを削除するには、ボリュームを参照する最後のコンテナに対して「docker rm -v」と明記して実行しなくてはなりません。これを使って更新や、コンテナ間のデータボリュームを効果的に移すことができます。
 

注意:
ボリューム削除のために「-v」オプションを使わないでコンテナを削除する場合、Dockerは警告しません。もし「-v」オプションなしでコンテナを削除したなら、これ以上コンテナから参照できない"dangling(ぶらさがった)"ボリュームとなります。Danglingボリュームは削除が困難で、全体として大量のディスクスペース専有します。我々はボリューム管理の改善に取り組んでおり、リクエスト8484を調べることで進捗を確認することができます。


バックアップ、リストア、データボリュームの移動


ボリュームで実行できるもうひとつの役に立つ機能として、バックアップ、リストア、移動があります。次のような「--volumes-from」フラグを使って対象ボリュームをマウントした新規コンテナを作成することで操作します:

 $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

ここでは、新規コンテナを用意して、dbdataコンテナのボリュームをマウントしています。そしてローカルホストのディレクトリを /backup としてマウントしています。最終的に、tar コマンドを使って dbdata ボリュームのコンテンツを backup.tar にアーカイブするコマンドを実行します。コマンドが完了すれば、コンテナがストップした場合でも、dbdata ボリュームのバックアップが残ります。

そして、同じコンテナや別に作成したコンテナへリストアすることができます。新規コンテナを作成します。

 $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

次に、バックアップファイルの tar をはずしてコンテナのデータボリュームへ格納します。


 $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

適当なツールを使い自動バックアップ、移動、リストアテストを上記の技術を用いることで可能になります。

次のステップ


Dockerの使い方についてより深く学習してきました、次に自動化したビルドや個人のリポジトリを含むDocker Hub上の有益なさービスをどうやって結びつけていくかを見て行きましょう。

Docker Hubの動作へ進む


----------

簡単にいえばマウント元専用のコンテナを作りなさいということらしい。

バックアップ先としてマウントしてデータをtarで集めさせて、コピりなさいよ..か。もうすこし考えて構成設計しないと足元すくわれそう..

The Docker User Guide: Getting Started with Docker Hubを翻訳してみる


The Docker User Guideの1セクションである以下のページを翻訳してみました。

 Getting Started with Docker Hub
 https://docs.docker.com/userguide/dockerhub/


参照の際はAt Your Own Riskでお願いします。

----------

Docker Hub を使ってみよう


このセクションでは新規アカウント作成を含めたDocker Hubの概要を説明します。

Docker Hubは、DockerやDockerコンテナで動作するリソースを集約しています。Docker Hubは、Dockerの外部であなたが同僚が協力することを助けます。次のようなサービスを提供しています:

  • Dockerイメージのホスティング
  • ユーザ認証
  • 自動化されたイメージビルドや、ビルドトリガやwebフックのようなワークフローツール
  • GitHub や BitBucket とのインテグレーション

Docker Hubを使うために、最初に新規アカウントを作成します。気にしないでください、新規アカウント作成は単純で無料です。


Docker Hubアカウントの新規作成


新規アカウントの登録・作成をおこなうには以下の2つの方法があります:

Web経由、と
コマンドライン経由、です


Web経由のアカウント登録


氏名、パスワード、ずっと有効なメールアドレスをサインアップフォームに入力してください。何がDockerの世界中で続けられているかについてのたくさんの情報が投稿されるDocker ウィークリーメーリングリストによるサインアップも可能です。




コマンドライン経由のアカウント登録


docker loginコマンドを使うとコマンドライン経由でDocker Hubアカウントの新規作成が実行できます。

 訳者注:プロクシ経由の場合は、環境変数http_proxyを指定してください。
  以下のファイルに記述してもOKです。
  CentOS7: /etc/sysconfig/docker
  Ubuntu12: /etc/default/docker

 $ sudo docker login


メールによる確認


フォームを埋めると、指定したメールアドレスへようこそメッセージと確認依頼が送信されます。到着したら、メールの内容に従ってアクティベートを実施してください。

ログイン


確認プロセスを完了したら、Webコンソールからログイン可能です:



もしくは、docker loginコマンドを使えばコマンドライン経由でログイン可能です:

 $ sudo docker login

Docker Hubアカウントはこれで使用可能になりました。


次のステップ


次にアプリケーションのDocker化の方法を練習"Hello world"で学習しましょう

アプリケーションのDocker化へ進む

----------

docker pullはアカウントがなくてもできるらしいので、
上記の作業はいらないかも..

2015年2月25日水曜日

Docker上のCentOSコンテナでsystemdを使えるようにする方法

CloudStack、OpenStackときたら、Dockerにも手をつけないと..

というよくわからない強迫観念にかられ
私もついに Docker に手を出しました。


..こりゃ簡単だ..

できることはVMware PlayerのNATで仮想イメージ上げたような
感じだけど、むちゃくちゃ軽い。

OSはCentOS/ubuntuだけなのが残念。

だからこれまでのハイパーバイザ型の仮想化技術に
完全に取って代わることはできないけど、
アプリ開発をやっている人がちょいと
tomcatやhttpdを起動させたい時とか
開発で使うsubversion/redmine/jenkinsサーバを必要なときに起動して
必要なくなったらイメージで固めて保管すればいい。

インストールなんてCloudStackやOpenStackなんか死ぬほど難しいけど
CentOSやubuntuならyumやapt-getでさっくりはいってしまう。

なによりホスト(?)OSはCentOSやubuntuのデフォルト最小構成インストールでOK
ゲストOSのインストールは一切不要(だからライセンス問題のある有料OSはなかなか対応できないだろうけど)。


デモ環境やアプリや向きの仮想化技術だ。

DockerfileもCentOS/ubuntuを普通につかってる人ならだれでも書ける。
コマンドラインに打ち込んでいたコマンドの先頭に"RUN"つけて列挙するだけ。
あとVOLUMEやEXPOSEやいろいろあるけど、
サンプルパクればさくっと作れる。


ただ..そこまでいくまでの情報が少ない。

現時点で紙で出版されている書籍はなく、
Kindleで以下の本が販売されていた。



(この記事を書いた時点で)星3つなのは、
最初の概要がとってもおざなりでどういう技術をもとに
動いているのか読んでもさっぱりわからない。
その後は、それなりにコマンドを理解している人なら有益だけど
さいしょのとっっかりには不親切な本だ。

..星3つなのはさいごの

「Dockerを
 ドカドカ使う
 春の空

  米村正明」
が、イラッとさせたのかもしれない..



雑誌ではSoftwareDesignがある。



Docker情報にみな飢えているのか
定価1220円の雑誌が2100円(この記事書いた時点)になってる..

こちらは、Dockerが登場することになったのかのLinux上の技術の変遷が
かたられており最初のKindle本の補填をしてくれた。

Docker上のネットワーク構成の絵があるのもありがたかった。

実際の動くところ紹介は端折り過ぎなので
初心者向きにはちょっと足りないかんじ。

たぶん初心者はここから入った方がいい。

いまさら聞けないDocker入門
http://goo.gl/uMIEv2

このリンクの周辺の記事をよんで
事前情報をえるとよいとおもう。


チュートリアルも英語だけど用意されている。
DockerHubへアカウント作った翌日にサイトから
チュートリアルのリンク付きメールが送られてきた。

The best way to understand Docker is to try it!
http://goo.gl/dB58ZF

このサイト、画面左側の英語を読んででてくる
指示にあったコマンドを右側のコンソールに入力して実行すると
つぎにすすめるこうせいになっていて、
Docker環境がなくてもよく使うコマンドをひととおりおぼえることができる。

チュートリアルを済ませた後
PC上にVirtualBoxなり、VMware playerなりでCentOS7を最小インストールで
たちあげて、「yum -y install docker」すればOK。

この環境で色々試していけばいい。




で、CentOSをdocker上でごそごそ動かしてみたら
色々と不都合なことがでてきた。

大きくは以下の2点。

  1. ネットワーク系のコマンドがないし設定できない
  2. systemdがない

最初の問題、Docker上のコンテナはIPアドレスがかえられない。
nmclientとかip addr showとかが使えない..

ホスト側のNICにブリッジ接続するからで、そのあたりは変えてくれるなということのようで、"ありき"で構築しないとダメらしい。

DNSは/etc/sysconfig/docker上のオプション指定でできるようだ。


で問題なのは2つめだ。

CentOSのバージョンが7になって
適応するのに困るのがsystemdとfirewall-cmd/chconがらみ。

これまでserviceで起動停止していたのを
またこんどはsystemdに変えられて
必死で対応していたのに
おぼえたとおもったら
Dockerのデフォルトコンテナではsystemdが入っていない..

Googleってみると
みんないろいろがんばっている。

そもそもわざわざfakesystemdなんていれて
隠しているので何かこのデザインに意図があるように思えた。


で、ブログではなくDockerHubのCentOSサイトを開いてみたら
案の定systemdに関する記述が見つかった。

DockerHub: OFFICIAL REPO CentOS
http://goo.gl/aKYzXi

英語なので翻訳してみた。
以下翻訳した日本語であるが
当然 at your own risk で参照してほしい。


-------

サポートしているタグおよびDockerfile


    latest, centos7, 7 (docker/Dockerfile)
    centos6, 6 (docker/Dockerfile)
    centos5, 5 (docker/Dockerfile)
    centos7.0.1406, 7.0.1406 (docker/Dockerfile)
    centos6.6, 6.6 (docker/Dockerfile)
    centos5.11, 5.11 (docker/Dockerfile)

イメージと履歴については、docker-library/official-images GitHubリポジトリのマニフェストファイル(library/centos)を参照してください。

CentOS


CentOS Linuxは、RHEL(Red Hat Enterprise Linux)のために Red Hat により公式に提供されているフリーソースをもとに構成されたコミュニティサポートされたディストリビュージョンです。このため、CentOS LinuxはRHELと機能的に互換性を持つことを目的としています。CentOS プロジェクトは、主にベンダーの商標や意匠を必要とするものを削除したパッケージに変更しています。CentOS Linux はノーコストで再配布自由です。

CentOS Linux の各バージョンは10年以上維持され続けています(セキュリティアップデートの維持:Red Hatによるサポートの間隔はソース側リリースにより異なる)。CentOS Linux の新しいバージョンはほぼ2年毎にリリースされ、各バージョンは新規ハードウェアサポートのために定期的に更新されます(だいたい6ヶ月間隔)。この結果、安全で、低メンテナンスで、信頼性がたかく、予測可能で、再現可能なLinux環境を提供します。各々のCentOS Linux版は、最高10年の間維持されます(セキュリティ最新版によって Red Hatによる支持間隔の長さは、リリースされる源に関して、時間とともに異なりました)。 新しいCentOS Linux版は、ほぼ2年おきにリリースされます、そして、各々のCentOS Linux版は、より新しいハードウェアを支持するために、定期的に更新されます(ざっと6ヵ月ごと)。これは、安全で、低-メンテナンス、信頼できて、予想できて、再生可能なLinux環境に終わります。

https://wiki.centos.org/FrontPage


CentOS イメージ ドキュメンテーション


「centos:latest」タグは現時点でほぼ最新な状態となっています。


定期ビルド


CentOS プロジェクトは、すべてのアクティブリリースのイメージを定期的に更新します。これらのイメージは毎月、もしくは緊急フィックスが必要な際に更新されます。これらのローリングアップデートはメジャーバージョン番号のみでタグ付けされています。

例:「docker pull centos:6」、「docker pull centos:7」

マイナータグ


さらに、インストールメディアと一致するマイナーバージョンタグのついたイメージも提供します。これらのイメージは、インストール用ISOコンテンツとマッチさせることが目的なので更新しません。

もしこれらのイメージを選択するのであれば、「RUN yum -y update && yum clean all」をDockerfileに記述するか、もしくは利用者に潜在的なセキュリティ問題を含む可能性を申し入れることを強く推奨します。
これらのイメージを使用する場合は、マイナーバージョンタグを指定してください:

例:「docker pull centos:5.11」、「docker pull centos:6.6」

パッケージ ドキュメンテーション


特に指定がない場合は、CentOSコンテナは、イメージのサイズを削減するために nodocs オプションを付けたyumをつかってビルドされます。
もしパッケージをインストールして行方不明になったファイルを発見するならば、「/etc/yum.conf」内の「tsflags=nodocs」をコメントアウトして再インストールしてください。

systemd インテグレーション


現時点では、CentOS7 に含まれる systemd は削除され、依存性解決のためにかわりに fakesystemd に入れ替わっています。これは、systemdが「CAP_SYS_ADMIN」ケーパビリティ(訳者注:root の持つ細かい権限のこと、CAP_SYS_ADMIN は quota や swap、mount などの操作が可能)を必要としているためです(ホストOS側の cgroups を読むことができるだけではありません)。
もしあなたが fakesystemd を置き換え systemd を不通に使いたいのであれば、以下のステップに従ってください。

systemd ベースイメージのための Dockerfile


FROM centos:7
MAINTAINER "あなたの名前" <あなたの@メールアドレス>
ENV container docker
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

この Dockerfile は fakesystemd を実際のパッケージと交換しますが、問題を起こしそうな多くのユニットファイル群を削除します。ここからあなたのベースイメージファイルを構築することができます。

「docker build --rm -t local/c7-systemd .」

systemd が使用可能なアプリケーションコンテナの例

上記で作成した systemd が使用可能なベースコンテナをつかって、以下のような Dockerfile を作る必要があります。


FROM local/c7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

このイメージのビルド:

「docker build --rm -t local/c7-systemd-httpd」


systemd が使用可能なアプリケーションコンテナの実行


systemd が使用可能なコンテナを実行するためには、ホスト側のcgroupボリュームをマウントするだけでなく、「--privileged」オプションを使う必要があります。

以下は、事前に作成した systemd が使用可能な httpd コンテナを実行するためのコマンド例です。

「docker run --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd」

このコンテナは制限されたコンテキスト内でsystemdが使用可能な状態で実行していますが、ほぼcgroupsファイルシステムをマウントした特権が付与されたコンテナとしての実行となります。

サポートされている Docker バージョン


このイメージは Docker バージョン 1.5.0 を公式にサポートしています。

(1.0下の)古いバージョンのサポートは基本ベストエフォートで提供されています。

ユーザフィードバック

Issues


もしこのイメージについての問題や質問がある場合は、https://bugs.centos.org もしくは GitHub issue のチケットを発行してください。

Freenode(https://freenode.net/)上の「#docker-library」IRCチャネル経由で多くの公式イメージメンテナーへ連絡をとることができます。

寄贈・貢献(Contributing)


ぜひ新機能、フィックス、更新、大きいもの少ないものにかかわらず、寄贈(contribute)してください;私達はいつもぞくぞくして pull request を受け取り、可能な限り早く最善を尽くします。

コーディングを開始する前に、特に野心的な寄贈の場合は、 https://bugs.centos.org のチケットもしくは GitHub issue に計画を投稿して我々と議論することをおすすめします。ほかの寄贈に対しての正しい方向性を指し示すチャンスをあたえることになり、あなたの設計上のフィードバックを受けることができ、他の人が同様の作業をしているかどうかの発見を助けてくれます。

-------


なるほど、
ホスト側のcgroupsとの兼ね合いでゲスト・ホスト間の疎結合性が崩れるのと
パッケージコマンド管理による依存関係をだまくらかす意味で
fakesystemdをやむをえず入れたわけか..


このサイトに有るように systemd をむりくり入れてもいいけど..
わざわざ特権許可したコンテナでうごかすより
CMDで起動スクリプト叩いたほうが安全かもなあ..

ケースバイケースでえらぶしかないか..


Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...