Posted at

Windows Server 2016 TP3 での Docker (3) コンテナの起動、Dockerfile からのイメージ作成

More than 3 years have passed since last update.


はじめに

前回 で Docker の実行環境を Azure 上に構築できたので、今回は次のように Docker を使ってみます。


  • コンテナの起動、削除などの基本的な操作

  • Dockerfile から Web サーバーとして動作するイメージを作成して起動させる

今回の全体的な構成はこうです。

WinCont00.PNG

なお、今回はホスト側(Windows Server 2016 TP3)とコンテナ側の両方で操作をするので、どちらで操作しているのか分かるような表記にしました。


ホスト側

C:\>コマンド・・・



コンテナ側

C:\>コマンド・・・


それでは、まず Azure 上の Windows Server 2016 TP3 の VM に RDP 接続しておきます。

Azure03b.PNG


基本的な操作

最初に Docker イメージを表示。


ホスト側

C:\>docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
windowsservercore latest 0d53944cb84d 11 days ago 9.697 GB
windowsservercore 10.0.10514.0 0d53944cb84d 11 days ago 9.697 GB

後でコンテナを起動した際にホストとコンテナの情報を比較したいので、ホスト側のコンピュータ名やIPアドレスを確認しておきます。


ホスト側

C:\>hostname

WS2016Cont

C:\>ipconfig
Windows IP Configuration

Ethernet adapter vEthernet (Virtual Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::ccad:a9c:abb4:a480%10
IPv4 Address. . . . . . . . . . . : 172.16.0.1
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . :

Ethernet adapter Ethernet 4:
Connection-specific DNS Suffix . : cloud-je.l4.internal.cloudapp.net
Link-local IPv6 Address . . . . . : fe80::185:ebdf:1a01:8bca%16
IPv4 Address. . . . . . . . . . . : 100.74.44.50
Subnet Mask . . . . . . . . . . . : 255.255.254.0
Default Gateway . . . . . . . . . : 100.74.44.1


そして、コンテナを起動。cmd.exe(コマンドプロンプト) を実行するだけのコンテナです。

ただ、コンテナの起動が完了するまで 30~40秒かかりました。 まだプレビュー版なので、今後改善されていくのでしょう。


ホスト側

C:\>docker run -it --name test01 windowsservercore cmd


起動するとこんな感じになります。

WinCont01.PNG

コンテナ内のコンピュータ名とIPアドレスを見てみると、コンピュータ名はホスト側と同じ WS2016Cont であることが分かります。Linux の場合はホスト側とコンテナ側でそれぞれホスト名が異なりますが、これは TP3 での制約かも?


コンテナ側

C:\Windows\system32>hostname

WS2016Cont

C:\Windows\system32>ipconfig
Windows IP Configuration

Ethernet adapter vEthernet (Virtual Switch-24b8185ae434c661104c4c37f8841b4e1fca598cf28b40777bc3588352927a0d-0):

Connection-specific DNS Suffix . : cloud-je.l4.internal.cloudapp.net
Link-local IPv6 Address . . . . . : fe80::2c0c:e10c:8e37:296d%21
IPv4 Address. . . . . . . . . . . : 172.16.0.2
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . : 172.16.0.1


また、ローカルシステムアカウントで動作しているようです。


コンテナ側

C:\Windows\system32>whoami

nt authority\system

では、いったん exit コマンドで cmd.exe を抜けて、コンテナを停止させます。

ホスト側では docker ps -a で停止させたコンテナを表示できます。


ホスト側

C:\>docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24b8185ae434 windowsserve "cmd" 7 minutes ago Exited (0) 15 seconds ago test01

最後にコンテナを削除しておきます。


ホスト側

C:\>docker rm test01

test01


Dockerfile からのイメージ作成

今度は Dockerfile からイメージを作成してみます。 Web サーバーである Nginx を組み込んだイメージを作成して、そのイメージからコンテナを起動し、Nginx にアクセスします。

まず、ホスト側に作業用ディレクトリを作成。


ホスト側

C:\>mkdir build

C:\>cd build

Notepad を起動して Dockerfile を作成します。

C:\build>notepad

Dockerfile は以下のような内容です。Windows 版の nginx をダウンロードして解凍、そして起動させるものです。


Dockerfile

FROM windowsservercore

RUN mkdir C:\nginx
RUN powershell.exe -Command wget -uri "http://nginx.org/download/nginx-1.9.3.zip" -OutFile C:\nginx\nginx-1.9.3.zip
RUN powershell.exe -Command Expand-Archive -Path C:\nginx\nginx-1.9.3.zip -DestinationPath C:\nginx -Force
ENTRYPOINT "cd C:\nginx\nginx-1.9.3 & nginx.exe"

書き終わったら C:\build\Dockerfile として保存(ただし、C:\build\Dockerfile.txt として保存されるかも)。

そして、イメージのビルドを実行。


ホスト側

C:\build>docker build -t nginx_win -f Dockerfile.txt .


Dockerfile が Dockerfile.txt として保存されていたので、-f でファイル名を指定してます。もちろん -f を使うのではなく、Dockerfile.txt を Dockerfile にリネームしてもOKです。なお、ビルドが完了するまでには数分かかります。

ビルド完了後、イメージを表示すると作成できていることが分かります。


ホスト側

C:\build>docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
nginx_win latest 2dcb24c6b099 About a minute ago 9.791 GB
windowsservercore latest 0d53944cb84d 11 days ago 9.697 GB
windowsservercore 10.0.10514.0 0d53944cb84d 11 days ago 9.697 GB

さっそくコンテナを起動したいところですが、その前に HTTP の通信が通るように設定をします。

まず、ホスト上で Windows Firewall を無効化。


ホスト側

C:\build>netsh advfirewall set allprofiles state off


それと、Microsoft Azure のポータルで、VM への HTTP 通信が通るようにエンドポイントの設定をします。

もし、下図のように、VM のエンドポイントに TCP 80 が登録されてなければ、「追加」を押します。

WinCont10.PNG

追加後、変更が反映されるまで待ちます。

WinCont13.PNG

そして、作成したイメージからコンテナを起動します。


ホスト側

C:\build>docker run -d -p 80:80 --name test02 nginx_win


コンテナの起動後、ブラウザでVM(ホスト)にアクセスしてみます。

VM の DNS名は、Azure ポータル上から確認可能。

WinCont15.PNG

ブラウザでその DNS 名にアクセスすると、コンテナ上で動作している Nginx から応答が返ってくるのが分かります。

WinCont20.PNG


参考サイト

https://msdn.microsoft.com/virtualization/windowscontainers/quick_start/manage_docker