読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Docker 入門 #1 — Windows に Boot2Docker をインストールして既存イメージを扱ってみる

開発環境 仮想マシン

Docker 使えるようにならないとなー、ということで、まずは Docker を使える環境を準備して、ユーザーガイドをちょっと読んでみた。 既存イメージを使ってコンテナの生成をするなどの操作をするところまで。 完全なる入門者向け (あるいは自分用) だけどメモしておく。

Docker のバージョンは 1.1.2 を使用した。

Docker についての参考文献

そもそもの Docker についての説明はこのエントリでは行わない。 次の記事が参考になる。

Windows での Docker 環境の構築

Windows ユーザーでない場合はそれぞれの環境用のインストールガイドを参照のこと。

Docker Engine は Linux カーネルの機能を使用しているので、Windows の上に直接 Docker 環境を構築することはできない。 VirtualBox なりなんなりで仮想マシンとして Linux マシンを Windows 上に起動する必要がある。

Boot2Docker というアプリケーションが Docker より提供されているので、(Docker Engine 用の仮想マシンを立てるつもりなら) これを使うのが便利である。 Boot2Docker を使うことで、VirtualBox 上に Docker 環境用の仮想マシンをインストールし、Docker デーモンを走らせることができる。

Boot2Docker のインストールで VirtualBox もインストールできるようなので、まだ VirtualBox をインストールしていない人でもいきなり Boot2Docker をインストールして良い。 次のエントリも参考になる。

使い方

「Boot2Docker Start」 というのがスタート画面のアプリケーション一覧に追加されているはずなので、これをクリックする。 すると、VirtualBox に Docker 用の仮想マシンが登録されて、Linux のインストールなどが実行される。 そして仮想マシンが起動して、そこに SSH 接続される。

この仮想マシン上で docker コマンドを使い、Docker コンテナを作ったりする。

また、インストール時にパスを通すかどうかのオプションを選択できるが、パスを通しておけば boot2docker コマンドが使えるようになる。「Boot2Docker Start」 を使わなくても、PowerShell を開いて boot2docker コマンドを使うことで、仮想マシンの操作ができる。

他のコマンドは boot2docker --help で調べられる。

Docker を使ってみる

ユーザーガイドに従って Docker を使ってみる。 これ以降は、基本的に boot2docker ssh して、仮想マシン上でコマンドを実行するものとする。

ユーザーガイドとは別にオンラインチュートリアルもあって、こっちの方が最初は良いかもしれない。

アプリケーションの Docker 化 (?)

docker run コマンド
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

上のようなコマンドを実行すると、何やらダウンロードしてきて、最終的に 「Hello world」 が出力される。 何をしているかというと、「ubuntu:14.04」 というイメージからコンテナを新たに生成し、そのコンテナ上で 「/bin/echo 'Hello world'」 というコマンドを実行している。

指定されたイメージは、まず Docker ホスト上で探される。 そこで見つからなければ、Docker Hub 上で探される。 今回の場合、「ubuntu:14.04」 というイメージは Docker Hub からダウンロードされる。

新たに生成されたコンテナは、指定のコマンドを実行し終えると停止 (?) するようである。 (コンテナ自体は残っている。 後で出てくるが、docker ps コマンドに -a オプションを渡すと、停止しているコンテナも表示される。)

-t オプション *1-i オプション *2 を渡すことで、対話型コンテナを立ち上げることもできる。

-d オプションでコンテナのデーモン化ができる。 docker run -d ... コマンドを実行すると、長い文字列が表示される。 これはコンテナ ID である。 コンテナの名前は (明示的に指定しなければ) 自動的につけられる。

docker ps コマンド

docker ps コマンドで、実行中のコンテナの情報が表示される。 コンテナ ID やコンテナ名などが確認できる。

上で書いたように、-a オプションを付ければ停止中のコンテナも表示される。

docker logs コマンド

docker logs {container} コマンドを使えば、コンテナ内部の標準出力を表示できる。 {container} としては、コンテナ ID とコンテナ名のどちらかを指定できるっぽい。

docker stop コマンド

docker stop {container} コマンドを使えば、動いているコンテナを止めることができる。

コンテナの扱い方

バージョン確認

docker version コマンドで、Docker クライアントと Docker サーバーのバージョン情報が表示される。 Go のバージョンや Git コミットのリビジョンも表示される。

Docker クライアントのコマンド一覧

オプションなしの docker コマンドで、docker コマンドが受け付けるアクション一覧が表示される。 各アクションについては、docker {action} --help コマンドでヘルプを表示できる。

コマンド一覧については Web 上のヘルプを参照してもよい。

Web アプリケーションを Docker 内で動かす
$ sudo docker run -d -P training/webapp python app.py

上記コマンドで、トレーニング用の web アプリケーションを Docker 内で動かすことができる。 「training/webapp」 というイメージは Docker Hub からダウンロードされる。

-P オプションは、コンテナ内部で必要なネットワークポート (exposed port) をホストのそれにマップするように Docker に伝えるためのものである。 上のコマンドを実行した後、docker ps -l コマンド *3 を実行すると、PORTS の項に以下のような表示が出るはずである。

PORTS
0.0.0.0:49155->5000/tcp

ローカル Docker ホストの 49155 ポートが、コンテナの 5000 ポートにマップされていることがわかる。 コンテナ側のどのポートを露出させるかを指定する方法は、後で (イメージ作成方法のところ) で説明される。 ホスト側のポートは 49000 から 49900 の間 (high port と表現されている) から自動的に選ばれる。

-P オプションの代わりに、docker run コマンドに -p {container_port} オプションを渡すことで、コンテナの指定のポートをホスト側の high port にマップすることもできる。 -P オプションは、コンテナの exposed port をホストの high port にマップするものであるが、-p オプションはコンテナ側の指定のポートが exposed port かどうかは関係ないようである。

また、-p {host_port}:{container_port} という形式で、コンテナの指定のポートを、ホストの指定のポートにマップすることもできる。

ちなみに、Windows 上で Boot2Docker を使っている場合は、WindowsPowerShell 上で boot2docker ip コマンドを実行することで、Docker ホストの IP アドレスを取得できる。

docker port コマンド

docker port {container} {private_port} コマンドで、指定のコンテナの指定のポートがどのポートにマッピングされているかを知ることができる。

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

docker logs コマンドの -f オプションは、tail コマンドの -f オプションのようなものである。

コンテナのプロセス

docker top {container} コマンドで、指定のコンテナのプロセス一覧を見ることができる。

コンテナの詳細

docker inspect {container} コマンドで、指定のコンテナの詳細情報を JSON 形式で得ることができる。

さらに、-f オプションを使うことで、特定の情報のみを取りだすこともできる。

$ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
172.17.0.5
コンテナの再起動

停止されたコンテナは、docker start {container} コマンドで再度起動できる。 実行中のコンテナの再起動は docker restart {container} コマンド。

そういえばコンテナが停止される際に、コンテナ内のプロセスがどうなるのか、とか、再起動時にはどうなるのか、とかわかってない。

コンテナの削除

停止されたコンテナは docker rm {container} コマンドで削除できる。

そういえば同僚が 「要らなくなったコンテナのごみ掃除が大変だ!」 とか言ってたけど、これのことなのかなー。

今回はここまで

既存のイメージを使うところまではこんな感じ。 さらにイメージをビルドしたりする話が続くけど、それはまた別のエントリに。

*1:新しいコンテナ内に pseudo-tty または terminal を割り当てる。

*2:コンテナの標準入力に引っ掛けることで対話型のコネクションを張る。

*3:「-l」 オプションは、最後に開始されたコンテナの情報を表示するためのオプション。