Dockerの基本は、以下のような流れになります
1.Docker Hubなどのパブリックなレジストリから、Linuxコンテナーの標準イメージ(アプリケーションを含むイメージもある)をダウンロードする(docker pull)。
2.ダウンロードしたイメージをコンテナーとして実行(docker run)およびカスタマイズして、カスタムイメージを作成する(docker commit)。
3.作成したカスタムイメージをプライベートなレジストリに登録して(docker push)、別のDockerエンジンに展開する(docker pull/run)。
カスタムイメージの作成は、「Dockerfile」というテキストファイルを使用する方法(docker build)もあります。
上記の流れがよく分かる例として、Docker Hubのパブリックレジストリで公開されているLinuxコンテナーの一つ「ubuntu」イメージをベースにしてApache Webサーバーを含むカスタムイメージを作成し、DockerエンジンでWebサーバーを実行してみましょう。
以下のように「docker run」コマンドを実行すると、レジストリにある最新の「ubuntu」イメージをダウンロードして「ubuntu」コンテナーを作成し、「/bin/bash」プロセスを実行して対話モードに入ります。
sudo docker run -t -i ubuntu /bin/bash
なお、ローカルにイメージが見つからない場合は、自動的に標準のレジストリからダウンロードを開始します。「docker pull」コマンドで、事前にイメージをローカルにダウンロードしておくこともできます。
Dockerエンジンの「ubuntu」コンテナーで実行された「/bin/bash」は、Ubuntuのコンソールに「root」でログインした場合と同じような環境を提供します。以下の「apt-get」コマンドを実行することで、このUbuntuの環境にApache Webサーバーをインストールできます(画面5)。
apt-get update && apt-get install apache2
「apt-get」コマンドは「ubuntu」コンテナーに含まれるものであり、CoreOSには存在しないコマンドであることに注目してください。
Apache Webサーバーのインストールが完了したら、「exit」コマンドを実行して「/bin/bash」プロンプトを終了します。「/bin/bash」プロセスを終了した時点で「ubuntu」コンテナーも終了しますが、コンテナーやイメージは削除されません。以下のコマンドを実行すると、終了したコンテナーの「コンテナーID(CONTAINER ID)」を取得できます。
sudo docker ps -a
コンテナーIDを確認したら、以下の「docker commit」コマンドでコンテナーのイメージに対する変更を確定し、新しいイメージを作成します(画面6)。なお、「<ユーザー名>」の部分には、「Dockerアカウント」の名前を指定します。Dockerアカウントを取得していない場合は、適当な名前で構いません。Dockerアカウントは、Docker Hubにイメージをアップロードする場合に必要になります。
sudo docker commit <コンテナーID> <ユーザー名>/<イメージ名>
先ほど、Apache Webサーバーはインストールしただけで、実行していませんでした。Apache Webサーバーを実行するには、作成したカスタムイメージをDockerエンジンのコンテナーとして実行します。
次のコマンドラインを実行すると、カスタムイメージの「/usr/sbin/apache2ctl」コマンドを実行して、TCPポート80でApache Webサーバーのサービスを開始します(画面7)。「-d」オプションを付けることで、プロセスの実行が成功してもコンテナーを終了せずに、ホストOSのプロンプトに戻ります。
sudo docker run -d -p 80:80 <ユーザー名>/<イメージ名> /usr/sbin/apache2ctl -D FOREGROUND
「curl」コマンド(これはCoreOSのコマンドです)でローカルホストのポート80に接続すると、Webサーバーが動作していることを確認できます。
AzureのLinuxやCoreOSの仮想マシンは、既定でSSHのポートだけをエンドポイントとして許可しています。Apache Webサーバーにインターネット経由で接続できるようにするには、CoreOSの仮想マシンにエンドポイントを追加します(画面8)。
これで、Azure仮想マシンに割り当てられたパブリックIPやクラウドサービスDNS名(*.cloudapp.net)を使用して、Dockerエンジン上で実行されているコンテナーのApache Webサーバーに接続できるようになります(画面9)。
コンテナーの終了方法やイメージの削除方法にも触れておきましょう(画面10)。お片付けも大事な仕事です。次の五つのコマンドを覚えておけば何とかなるでしょう。
コマンド | 実行内容 |
---|---|
docker ps | 稼働中のコンテナーのコンテナーIDの確認 |
docker stop <コンテナーID> | コンテナーの停止 |
docker rm <コンテナーID> | コンテナーの削除 |
docker images | イメージの確認 |
docker rmi <イメージ名>:<タグ名> | イメージの削除 |
今回は説明しませんが、「docker push」コマンドでカスタムイメージをDocker Hubやその他のプライベートなレジストリに登録することで、別のDockerエンジンに展開して実行することができます。
先ほども述べましたが、Docker Hubにイメージをアップロードするには、Dockerアカウントが必要になります。また、Azureストレージをプライベートレジストリとして使用するように構成することも可能です。方法については、以下のブログ記事を参考にしてください。
今回は、CoreOSのローカルのDockerクライアントを使用して、Dockerの基本操作を確認しました。Dockerはリモート管理用のAPI(Application Programming Interface)を備えており、リモートのDockerクライアントからコンテナーを管理することができます。ただし、CoreOSの既定の設定では、Dockerのリモート管理機能は無効になっています。
Dockerのリモート管理を有効にする方法は、以下のドキュメントで説明されています。CoreOSをAzureで実行している場合はこのDockerの構成に加えて、Azure仮想マシンのエンドポイントを追加する必要があります。
マイクロソフトとDocker社の提携の最初の成果として、DockerクライアントのWindowsへの対応があります。手元のPCにWindows版のDockerクライアントを導入すれば、Azure仮想マシンにSSHで接続しなくても、ローカルのコマンドプロンプトから「docker.exe」コマンドを使用してコンテナーを管理することができます(画面11)。
Windows版のDockerクライアントのインストール方法については、次のブログ記事が参考になります。
なお、Dockerをリモート管理するには、DockerクライアントとDockerサーバーのAPIのバージョンが一致している必要があります。本稿執筆時点(2015年4月上旬)でCoreOSのAPIは「1.17」、Windows版DockerクライアントのAPIは「1.19」なので、このままではリモート管理できません。
この問題を解決するには、Dockerクライアントのソースファイルの「api\common.go」をテキストエディターなどで開き、「APIVERSION」を「version.Version = "1.19"」から「version.Version = "1.17"」に変更して「docker.exe」をビルドします。
LinuxベースのDockerの基本操作を体験してみると、Windows Server版のDockerがどのようなものになるのか想像が膨らみます。
4月8日に発表されたNano Serverは、CoreOSの部分と考えればよいでしょう。CoreOSのDockerエンジンでLinuxコンテナーを実行できるように、Nano ServerでWindows Serverコンテナーを実行すれば、その上でさまざまなWindowsのプロセスを動かせるのでしょう。
Windows Serverコンテナーはカーネルを含まないでしょうから、Hyper-Vの仮想化環境で仮想マシンを実行するよりも、より多くのサーバーを集約できそうです。
Nano ServerでLinuxコンテナーを動かせるのかどうかは不明です。LinuxベースのDockerエンジンでWindows Serverコンテナーを動かせるのかどうかも分かりません。しかし、Nano Server上でHyper-Vコンテナーを実行すれば、Hyper-Vコンテナーの中のHyper-V環境でフルバージョンのWindows ServerやLinuxの仮想マシン、あるいはCoreOSのDockerエンジンを実行できると思います。あくまでも筆者の想像ですが……。
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。
Copyright © ITmedia, Inc. All Rights Reserved.