Photon OS をデプロイして Docker を動かす

Photon OS を使いたい

先のエントリ で以下のように書きました。

とりあえず vSphere 6.5 の環境をざっと触ってみたいので、ひとまず vCSA を立てていろいろ様子をみて、あとは素直に小さな仮想化基盤としておもちゃにします。

vCSA をお行儀よく(きちんと vCenter Server に FQDN を持たせる形で)立てたい場合は、DNS サーバがないとそもそもインストールができません。

今回はせっかくなのでお行儀のよい構成にしたいのですが、DNS サーバが欲しいからといって適当に CentOS に bind を入れるというのは自分にとって何も新しいことがなくてつまらないので、どうせなら触ったことがないものを触りましょう。

というわけで、引き続き VMware つながりで、今回は Photon OS を使ってみます。Photon OS は、VMware が公開している、コンテナホスト用の軽量 Linux ディストリビューションです。

同じ分野だと CoreOS とか CentOS Atomic Host とか、Snappy Ubuntu Core とか、そのあたりが有名です。今回のこの Photon OS は、VMware プラットフォーム上での動作に最適化されているとのことで、この点がおそらく類似のコンテナホスト用 OS との差別化要素になるのかと思われます。最近、VMware vSphere Integrated Containers という製品も GA になりましたし、VMware がこの分野に注力しているのは確かなようですね。

ちなみに Photon OS は、コンテナホスト用ではあるものの、実は vCenter Server Appliance 6.5(vCSA 6.5)のベース OS としても採用されています。vCSA 6.0 までは、Photon OS ではなく SUSE Linux Enterprise Server でした。

さて、今回の目的は DNS サーバを立てることなので、Photon OS 上に bind を動かすための Docker コンテナを作ることを目指します。本エントリではひとまず、Photon OS をデプロイして、そこで何らかの Docker コンテナを動かす、というところまで進めます。

  • OVA テンプレートのダウンロードとデプロイ
  • 初回起動とパスワードの変更
  • キー配列の変更
  • IP アドレスと DNS の設定
  • ホスト名の変更
  • タイムゾーンと時刻同期の設定
  • ロケールの変更
  • 一般ユーザの追加
  • Docker を動かす

以下、当然ですが執筆時点の情報なので、時間経過に伴って陳腐化する可能性があります。

リソース

公式の Wiki が比較的充実しているので、そこを見ながら作業します。

日本語のリソースでは、gowatana さんの VMTN のウェブログがおそらくいちばん詳しそうです。ただし、こちらは Photon OS をフルインストールした前提で記述されているので、ミニマルの構成では手順が不足する部分がある点は注意が必要です。

今回は、ISO イメージからのインストールではなく、OVA テンプレートを利用して、ミニマル構成での構築を行います。

OVA テンプレートのダウンロードとデプロイ

ダウンロードページから OVA ファイルをダウンロードします。OVA テンプレートは、ミニマル構成のみの提供です。

今回は、手元の環境が vSphere 6.5 なので、仮想ハードウェアバージョンが 11 のものを選びます。

ダウンロード後、vSphere 環境にインポートします。この部分は特に書くほどの手順でもないですが、Wiki にもガイドがあります。

記載通り、パワーオンする前の仮想マシンをテンプレートに変換して保存しておくと、今後インスタンスを増やしたくなったときに便利かもしれません。

At this point, you’ve got a Photon OS instance ready to go; but before you power on that Photon OS instance, consider first converting this VM into a template. By converting this imported VM to a template, you have a master Photon OS instance that can be combined with vSphere Guest Customization to enable rapid provisioning of Photon OS instances.

以降、文字ばかりになるので、せめてかわいいねこの写真でも載せておきます。

初回起動とパスワードの変更

ネットワークアダプタを適切なポートグループに接続させることで、パワーオン後、IP アドレスが DHCP サーバから取得されます。あらかじめ open-vm-tools が導入されているので、付与された IP アドレスは vSphere Client から確認できます。root ユーザでの SSH 接続もデフォルトで許可されています。

よって、起動後、ただちに SSH による接続が可能です。任意の SSH クライアントから root ユーザでログインして初期構築を進めます。初期パスワードは changeme です。

初回ログイン後、root ユーザのパスワードの変更が求められるので、指示に従います。

(current) UNIX password:
New password:
Retype new password:

キー配列の変更

SSH で接続しての操作では通常は意識する必要はありませんが、トラブル時など、どうしても仮想マシンのコンソールで直接操作しなければならない状態に陥ることがあります。これに備えて、キー配列を日本語キーボードに合わせて変更しておきます。

実際の設定方法は上記が参考になりますが、ミニマル構成の場合、そもそもキー配列のライブラリが入っていません。

root@photon-machine [ ~ ]# localectl list-keymaps
Couldn't find any console keymaps.

よって、キー配列のパッケージのインストールから始めます。

root@photon-machine [ ~ ]# tdnf install kbd

Installing:
kbd                             x86_64      2.0.3-2.ph1           3.30 M

Total installed size: 3.30 M
Is this ok [y/N]:y

Downloading:
kbd                                    1599403    100%
Testing transaction
Running transaction

Complete!

tdnf は、Photon OS のパッケージマネージャで、yum の後継である dnf の簡易版(Tiny DNF)です。/etc/yum.repos.d/ 配下の設定ファイルを読むとわかりますが、Photon OS はデフォルトで https://dl.bintray.com/vmware/ 以下のリポジトリを参照するように構成されています。

さて、これで日本語キーボードの情報が使えるようになったので、あとは実際に割り当てて完了です。

root@photon-machine [ ~ ]# localectl list-keymaps | grep jp106
jp106
root@photon-machine [ ~ ]# localectl set-keymap jp106
root@photon-machine [ ~ ]# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

反映は即時です。この変更は恒久的に保持されます。

IP アドレスと DNS の設定

続いて、DHCP による動的取得ではなく、静的 IP アドレスを利用するように構成します。

構成するインタフェイスは eth0 です。

root@photon-machine [ ~ ]# networkctl
IDX LINK             TYPE               OPERATIONAL SETUP
  1 lo               loopback           carrier     unmanaged
  2 eth0             ether              routable    configured

2 links listed.

基本的にドキュメント通り進めればよいです。systemd を利用した一般的な設定手順と同じです。

まずは静的 IP アドレスを eth0 に付与するための設定ファイルを新しく作ります。設定ミスに備え、この段階ではまだ DHCP を明示的に有効にしておきます。

root@photon-machine [ ~ ]# vim /etc/systemd/network/10-static-eth0.network
root@photon-machine [ ~ ]# cat /etc/systemd/network/10-static-eth0.network
[Match]
Name=eth0

[Network]
DHCP=yes
Address=192.168.0.249/24
Gateway=192.168.0.1
DNS=192.168.0.1
root@photon-machine [ ~ ]# chmod 644 /etc/systemd/network/10-static-eth0.network

systemd.network は名前順に設定ファイルを読み込みますが、最初に [Match] の条件に一致した設定ファイルの内容以外は無視します。

このため、先に DHCP 設定が読まれてしまうと、静的 IP アドレスが付与されないことになってしまいます。このような事態を避けるため、もともと存在していた DHCP 設定用のファイルは、eth0 の設定のあとに読まれるよう、名前を変える必要があります。将来的にネットワークアダプタを追加した際の動きを考慮しないのであれば、そもそもファイル自体を消してしまっても構いません。

root@photon-machine [ ~ ]# mv /etc/systemd/network/10-dhcp-en.network /etc/systemd/network/20-dhcp-en.network

この後、ネットワークサービスを再起動します。

root@photon-machine [ ~ ]# systemctl restart systemd-networkd

10-static-eth0.network に DHCP=yes を記載したことで、ここでネットワークサービスを再起動しても、もともと DHCP で付与されていた IP アドレスが保持されます(正確には DHCP サーバから同じ IP アドレスが再度割り当てられているだけです)。SSH のセッションが切断されることなく、操作を続行できます。

以下のコマンドで、IP アドレスが 2 つ付与されていることが確認できます。

root@photon-machine [ ~ ]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:87:dd:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.249/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.11/24 brd 192.168.0.255 scope global secondary dynamic eth0
       valid_lft 86334sec preferred_lft 86334sec
    inet6 fe80::250:56ff:fe87:dd02/64 scope link
       valid_lft forever preferred_lft forever

上記のように正常に静的 IP アドレスが付与されていることが確認できたら、新しい IP アドレスに SSH で接続しなおします。

その後、改めて 10-static-eth0.network を編集し、DHCP を無効化したあと、再度ネットワークサービスを再起動し、IP アドレスが一つだけになったことを確認します。

root@photon-machine [ ~ ]# vim /etc/systemd/network/10-static-eth0.network
root@photon-machine [ ~ ]# cat /etc/systemd/network/10-static-eth0.network
[Match]
Name=eth0

[Network]
DHCP=no
Address=192.168.0.249/24
Gateway=192.168.0.1
DNS=192.168.0.1
root@photon-machine [ ~ ]# systemctl restart systemd-networkd
root@photon-machine [ ~ ]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:87:dd:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.249/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe87:dd02/64 scope link
       valid_lft forever preferred_lft forever

これで、安全に DHCP による動的取得から静的 IP アドレスの利用へ切り替えられました。

ホスト名の変更

OVA テンプレートからデプロイした場合、ホスト名はデフォルトで photon-machine になっています。

ホスト名は hostnamectl コマンドで変えられます。特に目新しいことはありません。

root@photon-machine [ ~ ]# hostnamectl set-hostname kuro-ph01.kuro.local
root@photon-machine [ ~ ]# hostnamectl
   Static hostname: kuro-ph01.kuro.local
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 889b661d4b9446c48002b7ed596a00a4
           Boot ID: 67367e5ce4094074be76a82f0a3c3a7b
    Virtualization: vmware
  Operating System: VMware Photon/Linux
            Kernel: Linux 4.4.41-1.ph1-esx
      Architecture: x86-64

反映は即時です。この変更は恒久的に保持されます。

タイムゾーンと時刻同期の設定

以下のエントリによると、フルインストール構成ではいろいろと設定が必要そうです。

が、OVA からデプロイした場合は、デフォルトで時刻同期が動いていました。Google の NTP サーバと同期しているようです。

root@photon-machine [ ~ ]# timedatectl
      Local time: Sun 2017-03-19 10:05:43 UTC
  Universal time: Sun 2017-03-19 10:05:43 UTC
        RTC time: Sun 2017-03-19 10:05:43
       Time zone: UTC (UTC, +0000)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
root@photon-machine [ ~ ]# systemctl status systemd-timesyncd -l
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-03-19 06:22:48 UTC; 3h 42min ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 128 (systemd-timesyn)
   Status: "Synchronized to time server 216.239.35.12:123 (time4.google.com)."
    Tasks: 2
   CGroup: /system.slice/systemd-timesyncd.service
           `-128 /lib/systemd/systemd-timesyncd

Mar 19 06:52:29 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.8:123 (time3.google.com).
Mar 19 09:37:34 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection.
Mar 19 09:37:34 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.8:123 (time3.google.com).
Mar 19 09:40:00 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection.
Mar 19 09:40:10 photon-machine systemd-timesyncd[128]: Timed out waiting for reply from 216.239.35.8:123 (time3.google.com).
Mar 19 09:40:10 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com).
Mar 19 09:40:12 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection.
Mar 19 09:40:12 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com).
Mar 19 09:43:32 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection.
Mar 19 09:43:32 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com).

ConditionVirtualization は !container になっていました。コンテナ環境内でなければ勝手に動くようです。

root@photon-machine [ ~ ]# grep ConditionVirtualization /lib/systemd/system/systemd-timesyncd.service
ConditionVirtualization=!container

というわけで、何もせず、タイムゾーンだけ変えます。

タイムゾーンはさすがにミニマル構成といえど入っていました。反映させるだけで完了です。

root@photon-machine [ ~ ]# timedatectl list-timezones | grep Asia/Tokyo
Asia/Tokyo
root@photon-machine [ ~ ]# timedatectl set-timezone Asia/Tokyo
root@photon-machine [ ~ ]# timedatectl
      Local time: Sun 2017-03-19 19:11:09 JST
  Universal time: Sun 2017-03-19 10:11:09 UTC
        RTC time: Sun 2017-03-19 10:11:09
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
root@photon-machine [ ~ ]# date
Sun Mar 19 19:11:32 JST 2017

ロケールの変更

ロケールはデフォルトで en_US.UTF-8 になっています。このままでもよいのですが、せっかくなので ja_JP.UTF-8 に変更します。

が、最初は何のロケール情報もありません。

root@photon-machine [ ~ ]# localectl list-locales

必要なロケール情報を自分で生成する必要があります。

で、上記ページには /usr/share/locale/locale.alias から言語を選んで /etc/locale-gen.conf に追記して locale-gen.sh を叩けと書いてありますが、実際はそもそも /usr/share/locale/locale.alias が存在しないですし、そのまま進めても怒られてしまいます。

root@photon-machine [ ~ ]# locale-gen.sh
Generating locales...
en_US.ISO-8859-1...locale alias file `/usr/share/locale/locale.alias' not found: No such file or directory

というわけで、強引ですが空ファイルでよいので /usr/share/locale/locale.alias を作ってやると回避できます。これ、おそらく将来のリリースで修正されるかと。

最終的には以下の手順です。言語は好きに読み替えてください。

root@photon-machine [ ~ ]# touch /usr/share/locale/locale.alias
root@photon-machine [ ~ ]# echo -e &quot;ja_JP\t\tUTF-8&quot; >> /etc/locale-gen.conf
root@photon-machine [ ~ ]# echo -e &quot;ja_JP.UTF-8\tUTF-8&quot; >> /etc/locale-gen.conf
root@photon-machine [ ~ ]# locale-gen.sh
Generating locales...
en_US.ISO-8859-1... done
en_US.UTF-8... done
ja_JP.UTF-8... done
ja_JP.UTF-8... done
Generation complete.
root@photon-machine [ ~ ]# localectl list-locales
en_US
en_US.iso88591
en_US.utf8
ja_JP
ja_JP.utf8
root@photon-machine [ ~ ]# localectl set-locale LANG=&quot;ja_JP.UTF-8&quot;
root@photon-machine [ ~ ]# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

反映は即時です。恒久的に保持されます。

一般ユーザの追加

いつまでも root なのはアレなので、一般ユーザを作ります。このユーザには Docker 操作用の特権を与えたいので、明示的に docker グループを作成して所属させます。sudo ができるように wheel にも所属させます。本当は一つのユーザに複数の役割は持たせるべきではないですが、よしとします。

root@photon-machine [ ~ ]# groupadd docker
root@photon-machine [ ~ ]# useradd -m -g docker -G wheel kuro
root@photon-machine [ ~ ]# passwd kuro
New password:
Retype new password:
passwd: password updated successfully

そして実はデフォルトでは sudo コマンドがないのでインストールします。

root@photon-machine [ ~ ]# tdnf install sudo

Installing:
sudo                            x86_64      1.8.15-3.ph1          3.47 M

Total installed size: 3.47 M
Is this ok [y/N]:y

Downloading:
sudo                                   1319187    100%
Testing transaction
Running transaction
groupadd: group 'wheel' already exists

Complete!

kuro ユーザで SSH で接続して、問題なければ root での直接ログインを禁止させます。PermitRootLogin を no にするだけです。OVA テンプレートからデプロイした場合は、デフォルトで yes になっています。

ここ以降、kuro ユーザで操作しています。

kuro@kuro-ph01 [ ~ ]$ sudo vim /etc/ssh/sshd_config
kuro@kuro-ph01 [ ~ ]$ sudo tail /etc/ssh/sshd_config
Subsystem       sftp    /usr/libexec/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
PermitRootLogin no
UsePAM yes
kuro@kuro-ph01 [ ~ ]$ sudo systemctl restart sshd
kuro@kuro-ph01 [ ~ ]$ sudo systemctl status sshd
● sshd.service - OpenSSH Daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-03-19 19:52:39 JST; 9s ago
 Main PID: 1169 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           `-1169 /usr/sbin/sshd -D

Mar 19 19:52:39 kuro-ph01.kuro.local systemd[1]: Started OpenSSH Daemon.
Mar 19 19:52:39 kuro-ph01.kuro.local sshd[1169]: Server listening on 0.0.0.0....
Mar 19 19:52:39 kuro-ph01.kuro.local sshd[1169]: Server listening on :: port 22.
Hint: Some lines were ellipsized, use -l to show in full.

Docker を動かす

さて、ようやく本題です。が、もはやここまで来れば以降は Docker のごく一般的な操作の話なだけで特別なことはありません。

Docker 自体はデフォルトでインストールされています。

kuro@kuro-ph01 [ ~ ]$ docker -v
Docker version 1.12.1, build 23cf638

自動起動は無効の状態です。起動させて、自動起動も有効にします。

kuro@kuro-ph01 [ ~ ]$ sudo systemctl start docker
kuro@kuro-ph01 [ ~ ]$ sudo systemctl status docker
● docker.service - Docker Daemon
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-03-19 19:27:00 JST; 5s ago
     Docs: http://docs.docker.com
 Main PID: 618 (dockerd)
    Tasks: 6
   CGroup: /system.slice/docker.service
           `-618 dockerd --containerd /run/containerd.sock

Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.221740890+09:00" level=warnin...ght"
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.221854117+09:00" level=warnin...ice"
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.222276327+09:00" level=info m...rt."
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.238793455+09:00" level=info m...lse"
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.297271226+09:00" level=info m...ess"
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327413635+09:00" level=info m...ne."
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327488574+09:00" level=info m...ion"
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327504134+09:00" level=info m...12.1
Mar 19 19:27:00 kuro-ph01.kuro.local systemd[1]: Started Docker Daemon.
Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.333295270+09:00" level=info m...ock"
Hint: Some lines were ellipsized, use -l to show in full.
kuro@kuro-ph01 [ ~ ]$ systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

起動しました。適当なコンテナイメージを動かしてみます。適当に vmwarecna/nginx など。

kuro@kuro-ph01 [ ~ ]$ docker run -d -p 80:80 vmwarecna/nginx
Unable to find image 'vmwarecna/nginx:latest' locally
latest: Pulling from vmwarecna/nginx
a3ed95caeb02: Pull complete
b6f2388a20dd: Pull complete
a305e4b888ce: Pull complete
80596a504ef3: Pull complete
99c028eff2a4: Pull complete
a1cee46bc434: Pull complete
9bd9868012b9: Pull complete
6fa7100a2613: Pull complete
Digest: sha256:f73bbae0f31823c06478b1fa5efb4957bc25239802fd5ea94e4442c0a6090d23
Status: Downloaded newer image for vmwarecna/nginx:latest
02e4fcf9b805a01b0d7bc203e2b78f655fa9aed2a7ff5a6abfbc93703b13a41e

勝手にリポジトリ(Docker Hub)からコンテナイメージを探してダウンロードして起動してくれました。簡単ですね。

ダウンロードしたコンテナイメージと起動状態は以下のように確認できます。

kuro@kuro-ph01 [ ~ ]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vmwarecna/nginx     latest              c237cfda7789        23 months ago       93.48 MB
kuro@kuro-ph01 [ ~ ]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
02e4fcf9b805        vmwarecna/nginx     &quot;nginx -g 'daemon off&quot;   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 443/tcp   hungry_stonebraker

ブラウザで http://<IP アドレス>/ にアクセスして、以下のようにデモンストレーションのページが開けば成功です。

動くのが分かったので、お掃除します。まずはコンテナの停止。

kuro@kuro-ph01 [ ~ ]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
02e4fcf9b805        vmwarecna/nginx     &quot;nginx -g 'daemon off&quot;   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 443/tcp   hungry_stonebraker
kuro@kuro-ph01 [ ~ ]$ docker stop 02e4fcf9b805
02e4fcf9b805
kuro@kuro-ph01 [ ~ ]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
02e4fcf9b805        vmwarecna/nginx     &quot;nginx -g 'daemon off&quot;   5 minutes ago       Exited (0) 8 seconds ago                       hungry_stonebraker

止めたらコンテナを消します。

kuro@kuro-ph01 [ ~ ]$ docker rm 02e4fcf9b805
02e4fcf9b805
kuro@kuro-ph01 [ ~ ]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

イメージも要らないので消します。

kuro@kuro-ph01 [ ~ ]$ docker rmi c237cfda7789
Untagged: vmwarecna/nginx:latest
Untagged: vmwarecna/nginx@sha256:f73bbae0f31823c06478b1fa5efb4957bc25239802fd5ea94e4442c0a6090d23
Deleted: sha256:c237cfda7789b89aaed30c646fb885e89e423b4adc708f3a02981f6c4d55aed3
Deleted: sha256:7df42bfffcdf0ef09a8a7e89df5a7c3e35d10bfa2eb39fb1a367b6fdad79f858
Deleted: sha256:4c2eef2ffbe175f3372463bf3a5223ca9a524360510f30814988a620ebfb0248
Deleted: sha256:db57fe254f4599d7aa2a949a608cb41d31a828aa15e6bd9c57e6e4785e10d224
Deleted: sha256:5dab3f8810166fa8a16f74aa4e71b8d658ad6e6ebfe6851509df386d55b02ac0
Deleted: sha256:e327d626ee3d33195a1efe565a9d98415b4ef4ddfcfa5757609f86a661c13ca6
Deleted: sha256:7d433cbce64586e009ebffefa71b27573a374f3b2e6d66252a96cea88d7ccd31
Deleted: sha256:992d02669b3c389cece05fee1714f81bd9694ba23aeedff75cd054611a4b5d4c
Deleted: sha256:58647153590d6ca2ecc30e0ddb208b9b24743967ce925383df462ec710699cc7
Deleted: sha256:fd622e88e74de6d4b74f9e7bf684bac2238f59b929475f70f092beb6db6b61db
Deleted: sha256:f835ef83693c18a2694bedb0ecaca78e968a4846242abae2b704db2ac7140f3f
Deleted: sha256:5062638dae85cb1e1c79154b25b0e2d4518f6267742638256ec619d937f3183e
Deleted: sha256:3911ed2f627c2ff8e453a86182f7f1570ad95595b443507bc3d7eb05f3c53f41
Deleted: sha256:affbb86305e946bf861b7ec77af0e66287eaf8649bb4522d718eeac6079d94b7
Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
kuro@kuro-ph01 [ ~ ]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

まとめ

Photon OS を OVA テンプレートからデプロイし、必要な初期設定を行ったあと、Docker の動作確認を行いました。

今回はここまで。あとはどうにでもなりますね。次回は Docker 上で bind を動かします

Intel NUC に ESXi 6.5 を入れる

新しいおもちゃ is Now Available

Intel の NUC を買いました。第 6 世代のうちの、NUC6i5SYH です。

製品の Web ページ を見るとそろそろ第 7 世代のものが買えるようになりそうな雰囲気がありますが、待つのが嫌なので買ってしまいました。

使い道は考えていませんが、そういうときはとりあえず ESXi を入れます。新しいものが好きなので、現時点で最新の ESXi 6.5 にしました。

注意

Intel NUC は VMware Compatibility Guide に乗っていないハードウェアです。何があって文句は言えません。

買ったメモリとストレージも、Intel がテストした構成の一覧には記載のないデバイスです。

買ったもの

列挙します。

SSD はデータストアとして占有させたかったので、ESXi のブート用には USB メモリを別に用意します。

全部で 9 万円くらいですね。いい時代です。

インストール

何も考えずに製品の公式の ISO イメージをそのままインストールすれば問題なしでした。

昔は非公式のドライバを自分で突っ込まないとうまくデバイスが認識されなくてダメだったようですが、最近は公式のそのままで大丈夫みたいですね。

セットアップ

インストール後、そのまま DCUI で IP アドレスやらホスト名やらを設定したら、vSphere Client で ESXi につないで必要な設定をします。

vSphere Client は、C# 版はもうないので、HTML5 版を使います。ESXi に組み込みで用意されていて、ブラウザで ESXi に設定した IP アドレスに接続するだけで使えます。快適です。

トラブルと対処

さて、ESXi のインストールは何の問題なく終了したものの、データストアのアクセスが異常に遅いというトラブルが発生しました。

ESXi 6.5 になって追加された新しいデフォルトの AHCI ドライバが、NUC の SATA コントローラをうまくハンドルできなかったみたいです。

以下のようにして明示的に vmw_ahci ドライバを無効化することで解決できました。

esxcli system module set -e=false -m=vmw_ahci

このトラブル、具体的には、以下のような症状です。

  • I/O のレイテンシが 1,000 ms 以上ある
    • パフォーマンスのグラフの [最大待ち時間] が異常な数値
  • イベントログに以下のようなエントリがある
    • 接続の問題により、ボリューム XXXXX へのアクセスが失われました。回復処理が進行中です。まもなく結果が報告されます。
    • 接続の問題が発生後、ボリューム XXXXX へのアクセスがリストアされました。
  • vmkernel.log に以下のようなエントリがある
    • WARNING: NMP: nmp_DeviceRequestFastDeviceProbe:XXXXX: NMP device “XXXXX” state in doubt; requested fast path state update…
    • Cmd(0xXX) 0xXX, CmdSN 0xXX from world XXXXX to dev “XXXXX” failed H:0x2 D:0x0 P:0x0 Invalid sense data: 0xXX 0xXX 0xXX
    • Aborting txn calleriD: 0xXX to slot XX:  File system timeout (Ok to retry)

このログ、SAN 構成なら目にすることはありますが、DAS のストレージでは通常は出ません。真っ先に SSD の初期不良を疑い、そして NUC の初期不良も疑いましたが、調べてみると同じ症状の事例が海外で複数報告されていました。解決策も載っています。

その他

今回は問題にはなりませんでしたが、ESXi 6.5 では USB メモリもトラブルが起きがちのようです。

これも AHCI のドライバと同様、デフォルトのものが置き換わったことが原因だとか。KB 化もされていました。

ドライバ周りはトラブルが起きるとハード障害との切り分けがしにくくて厄介ですね。

今後

とりあえず vSphere 6.5 の環境をざっと触ってみたいので、ひとまず vCSA を立てていろいろ様子をみて、あとは素直に小さな仮想化基盤としておもちゃにします。