Docker で Windows コンテナのプロセス分離を使って世界に挨拶してみた

はじめに

October 2018 Update から、 Windows 10 Professional 以上で、 開発・テスト用に Windows コンテナが使えるようになっていた。 どうやって使えばいいのか調べたら Docker から使うのか。 独自のインタフェースを提供するより、既にデファクトスタンダードに乗っかる選択をしたのは賢明だな。

Docker のインストール

Docker Desktop for Windows は下記の URL でインストーラーを入手してインストール。

https://hub.docker.com/editions/community/docker-ce-desktop-windows

Docker のトレイメニューで [Switch to Windows containers...] をクリックして、Docker が使うコンテナの種類を Windows コンテナに切り替えられた。

コンテナイメージのダウンロード

早速、Windows Server のコンテナイメージをダウンロードしてみた。

> docker pull mcr.microsoft.com/windows/nanoserver:1809

f:id:griefworker:20190619110102p:plain

ちゃんとダウンロードできたことを確認。

> docker images

f:id:griefworker:20190619110206p:plain

プロセス分離モードでコンテナ起動

プロセス分離モードで実行するには、--isolation process の指定が必要。 「Hello World!」をテキストファイルに出力してコンテナを終了するところまでやってみた。

> docker run -it --isolation process mcr.microsoft.com/windows/nanoserver:1809 cmd.exe
> echo "Hello World!" > Hello.txt
> exit

f:id:griefworker:20190619110233p:plain

コンテナが停止されていることを確認。

> docker ps -a

f:id:griefworker:20190619110300p:plain

ステータスが Exited になっている。

新しいコンテナイメージを作成

変更したコンテナから新しいコンテナイメージを作成してみた。

> docker commit <コンテナID> helloworld

f:id:griefworker:20190619110326p:plain

コンテナイメージに helloworld が追加されていることを確認しておく。

> docker images

f:id:griefworker:20190619110336p:plain

作成したコンテナイメージを使ってコンテナを起動

helloworld コンテナイメージを使って、コンテナを起動してみた。 もちろんプロセス分離モードで。 今回は、テキストファイルの中身を表示したら即コンテナを停止させている。

> docker run --rm --isolation process helloworld cmd.exe /s /c type Hello.txt

f:id:griefworker:20190619110345p:plain

おわりに

--isolation process を指定するだけで、Docker から Windows コンテナをプロセス分離モードで起動できるのは、 Docker 頑張ったなという印象。 いや、頑張ったのはMicrosoft か?

Docker で使うコンテナは Linux コンテナが多いと思うけど、 本業で開発しているアプリは Windows の資産がほとんどなので、 しばらくは Windows コンテナと仲良くすることになりそうだ。

Windows にインストールされている証明書を確認する方法メモ

いつもど忘れして調べるので、ブログにメモしておく。

  • ローカルコンピューター用の証明書を確認したい場合
    • certlm.msc を起動する
  • ログオン中のユーザーアカウント向けの証明書を確認したい場合
    • certmgr.msc を起動する

Windows10 で gem をインストールしようとしたら SSL のエラーが発生した

Middleman を Windows10 にインストールしようと思ったので

tnakamura.hatenablog.com

を参考に

  • RubyInstaller の Ruby2.3.1(x64)
  • DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe

をインストールしてみた。

インストールは何事もなく終了したので、次に bundler をインストールしようとしたら

D:\src>gem install --no-ri --no-rdoc bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

というエラーが発生。 SSL 証明書の検証に失敗しているけど、 rubygems が使っている SSL 証明書が古かったりするのか?

rubygems を更新すると解決するようだったので、 rubygems を更新するための gem をインストール。 https が使えないので http でアクセスするように指定しておく。

> gem install rubygems-update --source http://rubygems.org/

rubygems を更新。

> rubygems_update

2.6.7 に更新され、今度は

> gem install --no-document bundler

が成功した。

余談だけど、gem のドキュメントをインストールしないオプションは --no-ri --no-rdoc ではなく --no-document を使うようになったのか。 こっちの方がわかりやすくていいね。

signtool を使ってファイルに複数のデジタル署名が添付されていることを確認する

signtool は /as オプションを使うことで、1つのファイルに複数のデジタル署名を添付できる。

添付したデジタル署名の一覧はファイルのプロパティから確認できるが、 アルゴリズムとタイムスタンプだけでいいなら

signtool verify /pa /all <ファイルパス>

を実行すれば

File: <ファイルパス>
Index  Algorithm  Timestamp    
========================================
0      sha1       None         
1      sha256     None         

Successfully verified: <ファイルパス>

という風に表示できる。

ちゃんとデジタル署名が添付されているかチェックしたいファイルが多い場合に使えるかもしれない。

…と思ってたけど、遅い。 遅すぎる。 検証をしているわけで、時間がかかるのはわかるんだけど。 もっと速い方法はないものか。 とりあえずメモはしておく。

Windows に Middleman をインストールする手順メモ

WindowsMiddleman をインストールして動かせたので手順をメモしておく。 といっても難しいことはやってない。 スンナリ動いて拍子抜けしてくらいだ。

RubyInstaller と DevKit をダウンロード。

http://rubyinstaller.org/downloads

Ruby は 2.2.3 をダウンロードした。

Ruby をインストール

インストーラーを実行して、Ruby を C:\Ruby22 にインストール。

DevKit をインストール

DevKit は C:\Ruby22\devkit に解凍した。

cd C:\Ruby22\devkit
ruby dk.rb init

を実行すると Ruby のインストールパスが書かれた config.yml が作成される。

パスが間違っていないか一応確認。

# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:/Ruby22

間違っていないので

ruby dk.rb install

を実行して DevKit インストール完了。

Middleman をインストール

コマンド一発。

gem install middleman

Middleman の動作確認

Middleman がちゃんと動くか、念のため動作確認しておく。

middleman init sample
cd sample
middleman build
middleman server

あたりが動いたんで問題なさそう。

PowerShell のバージョンを調べる方法

PowerShell を起動して

$PSVersionTable

を入力して Enter を押すと

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.16406
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

と表示される。 この中の PSVersion が PowerShell のバージョン。

・・・Get-Version っていうコマンドが無いのがそもそもおかしいと思うんだけど、自分だけかな。

PowerShell で HTTP リクエストを送る

Windows でも curl みたいな手軽にコマンドラインから HTTP リクエストを送るツールが欲しい、 って思っていたら PowerShell にあった。 Invoke-WebRequest と Invoke-RestMethod がそう。 使い方は両方とも似ているので、Invoke-RestMethod を使って SOAP サービスを呼び出してみた。

$body = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <insertData xmlns="http://tempuri.org/">
      <request>
        <number>10</number>
        <name>本田</name>
        <age>29</age>
        <team>AC ミラン</team>
        <position>MF</position>
      </request>
    </insertData>
  </soap:Body>
</soap:Envelope>'
$url = 'http://localhost/SampleService/SampleService.asmx'
$headers = @{ 'SOAPAction' = 'http://tempuri.org/insertData' }
$xml = Invoke-RestMethod -Method Post -Uri $url -Headers $headers -Body $body -ContentType 'text/xml; charset=utf8'
$xml.InnerXml

Invoke-RestMethod で SOAP サービス呼び出すってギャグみたいだな。