Docker 入門 #1 — Windows に Boot2Docker をインストールして既存イメージを扱ってみる
Docker 使えるようにならないとなー、ということで、まずは Docker を使える環境を準備して、ユーザーガイドをちょっと読んでみた。 既存イメージを使ってコンテナの生成をするなどの操作をするところまで。 完全なる入門者向け (あるいは自分用) だけどメモしておく。
Docker のバージョンは 1.1.2 を使用した。
Docker についての参考文献
そもそもの Docker についての説明はこのエントリでは行わない。 次の記事が参考になる。
- Docker とは何か: 今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。Docker Meetup Tokyo #2 - Publickey
- 背景 (ウェブシステムにおける Docker の立ち位置):
Windows での Docker 環境の構築
Windows ユーザーでない場合はそれぞれの環境用のインストールガイドを参照のこと。
- Windows 上への Docker 環境インストールガイド: Microsoft Windows - Docker Documentation
Docker Engine は Linux カーネルの機能を使用しているので、Windows の上に直接 Docker 環境を構築することはできない。 VirtualBox なりなんなりで仮想マシンとして Linux マシンを Windows 上に起動する必要がある。
Boot2Docker というアプリケーションが Docker より提供されているので、(Docker Engine 用の仮想マシンを立てるつもりなら) これを使うのが便利である。 Boot2Docker を使うことで、VirtualBox 上に Docker 環境用の仮想マシンをインストールし、Docker デーモンを走らせることができる。
- Boot2Docker: boot2docker/boot2docker · GitHub
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 を使っている場合は、Windows の PowerShell 上で 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} コマンドで削除できる。
そういえば同僚が 「要らなくなったコンテナのごみ掃除が大変だ!」 とか言ってたけど、これのことなのかなー。
今回はここまで
既存のイメージを使うところまではこんな感じ。 さらにイメージをビルドしたりする話が続くけど、それはまた別のエントリに。

Docker入門 Immutable Infrastructureを実現する
- 作者: 松原豊,米林正明
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/25
- メディア: Kindle版
- この商品を含むブログ (5件) を見る