連載
» 2015年04月13日 05時00分 公開

山市良のうぃんどうず日記(31:特別編):所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門 (2/2)

[山市良,テクニカルライター]
前のページへ 1|2       

標準のUbuntuイメージにApacheを追加してWebサーバーを実行してみる

 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


画面5 画面5 「ubuntu」イメージの「/bin/bash」を実行し、「apt-get」コマンドでApache Webサーバーをインストールする

 「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> <ユーザー名>/<イメージ名>


画面6 画面6 「docker commit」コマンドでイメージに対する変更を確定し、新しいカスタムイメージを作成する

 先ほど、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


画面7 画面7 カスタムイメージの「/usr/sbin/apache2ctl」コマンドを実行して、Apache Webサーバーを開始する

 「curl」コマンド(これはCoreOSのコマンドです)でローカルホストのポート80に接続すると、Webサーバーが動作していることを確認できます。

 AzureのLinuxやCoreOSの仮想マシンは、既定でSSHのポートだけをエンドポイントとして許可しています。Apache Webサーバーにインターネット経由で接続できるようにするには、CoreOSの仮想マシンにエンドポイントを追加します(画面8)。

画面8 画面8 CoreOSの仮想マシンのパブリックIPに対するHTTP接続を許可するようにエンドポイントを構成する

 これで、Azure仮想マシンに割り当てられたパブリックIPやクラウドサービスDNS名(*.cloudapp.net)を使用して、Dockerエンジン上で実行されているコンテナーのApache Webサーバーに接続できるようになります(画面9)。

画面9 画面9 Azure仮想マシンに割り当てられたパブリックIPやクラウドサービスDNS名で、Dockerコンテナーで動いているApache Webサーバーに接続できた

 コンテナーの終了方法やイメージの削除方法にも触れておきましょう(画面10)。お片付けも大事な仕事です。次の五つのコマンドを覚えておけば何とかなるでしょう。

コマンド 実行内容
docker ps 稼働中のコンテナーのコンテナーIDの確認
docker stop <コンテナーID> コンテナーの停止
docker rm <コンテナーID> コンテナーの削除
docker images イメージの確認
docker rmi <イメージ名>:<タグ名> イメージの削除
画面10 画面10 「docker stop」コマンドでコンテナーを終了し、「docker rm」コマンドと「docker rmi」コマンドでコンテナーとイメージをクリーンアップする

 今回は説明しませんが、「docker push」コマンドでカスタムイメージをDocker Hubやその他のプライベートなレジストリに登録することで、別のDockerエンジンに展開して実行することができます。

 先ほども述べましたが、Docker Hubにイメージをアップロードするには、Dockerアカウントが必要になります。また、Azureストレージをプライベートレジストリとして使用するように構成することも可能です。方法については、以下のブログ記事を参考にしてください。

Dockerのリモート管理とWindows版Dockerクライアント

 今回は、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)。

画面11 画面11 コマンドプロンプト(手前)でWindows版のDockerクライアント(docker.exe)を実行し、Azure上のDockerのコンテナーを管理しているところ。奥のコンソールは「PuTTY」によるコンソールへの接続

 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」をビルドします。

Windows Server版Dockerを想像してみる

 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サイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。