Docker を動かすための軽量 Linux、 Photon を試してみました

はじめに

手前の mac 環境を汚さずにいろいろできる喜びもひとしおな docker for mac ですが、会社の検証環境とかでも使いたいなと思い始めて、特化した Linux を探し始めました。なんとなく検索で引っかかった photon なる OS powered by VMware を使ってみました。

Vine Linux や Elementary OS でも良かったのですが、ちょっと目的がデスクトップ寄りかなと思います。

イメージの入手

Photon OS by vmware
今回は手前の ESXi 環境(5.5)により Photon OS, Version 1.0 — OVA with virtual hardware v10 - A pre-installed and vSphere-optimized Photon OS minimal instance configured with virtual hardware version 10.を選択しました。
300MB 以下で小さい点ですでに好印象。 <<< あとで気付きますが、Alpine とか BusyBox とか上には上がいたようです・・・検索力↓
お前のDockerイメージはまだ重い💢💢💢
ラズパイ等でも使われているようです。

インストール

ESXi 5.5.0
ゲストOS:その他の 3.x Linux (64 ビット
CPU:1 vCPU (あとでちゃんと見ると2 vCPU 推奨とのこと。)
MEM:8192 MB
としました。
VMware Photon Linux の Install ~ Docker コンテナ起動。
http://techblog.clara.jp/2015/04/vmware-photon_how_to_install/

とりあえず初期設定

vSphere Client でコンソールからログインします。
username/password = root/changeme ですが、初回に変更を求められます。

次に、ssh するために useradd / passwd しました。

起動したときから DHCP でネットワーク周りの設定はもらえているようでしたのでそこは今回触れませんでした。
余談ですが、他の軽量 Linux だとデフォルトで DHCP じゃないものがあったので、ラボでさっと試すには便利です。

とりあえず yum update…と思ったら yum がない

Photon は TDNF というパッケージ管理システムに置き換わっています。
じゃあこれが何なのかというと、Tiny な DNF です。
DNF とは Dandified Yum のことらしいです。Python 2 ベースでかかれ、依存関係解決がときどき失敗してしまうという Yum の抱える諸問題を解決されるために生まれた事実上の後継とのこと。詳しくはWikipediaへどうぞ。

Tiny DNF は、Github を見ると vmware さんが作られてるみたいです。Photon 用ですかね。
README を読むと、repo の追加もできるようです。

Now configure repo files under /etc/yum.repos.d or your repodir following
.repo format of dnf/yum.

yumでは /etc/yum.conf の[main]セクションにproxy=http://(hostname):(port)/と、あと必要ならproxy_username=(username)とproxy_password=(password)を追加するとプロキシを通すことができた。
DNFでは同じ内容を /etc/yum.conf ではなく /etc/dnf/dnf.conf の[main]セクションに書く。

Photonでは vi /etc/tdnf/tdnf.conf というファイルがありそこに追記しました。
その後 tdnf update -y が成功しました。

yumからDNFへの移行
本家サイト
Docker Hub OFFICIAL の VMware Photon リポジトリが公開されました。

とりあえず Docker 起動

ssh 用ユーザでログインしたあと、su して root 権限になってから docker を触り始めました。

1
2
# rpm -q docker
docker-1.12.6-1.ph1.x86_64

systemctl start docker

再起動後も docker を最初から起動させる設定
systemctl enable docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# docker version
Client:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Wed Jan 11 00:23:16 2017
OS/Arch: linux/amd64

Server:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Wed Jan 11 00:23:16 2017
OS/Arch: linux/amd64

Proxy 設定

渡しの場合、Proxy の背後にある環境だったため、docker pull image が失敗しました。
Proxy環境下のDockerトラブルシューティング  <<< こちらは役に立たなかった
Proxy 環境下での Docker の使用方法(Docker デーモンが systemd に管理されている場合) <<< 役に立ちました。

vi /lib/systemd/system/docker.service

1
2
Environment='http_proxy=http://<ipaddr>:8080'  
Environment='NO_PROXY=localhost,127.0.0.0/8'

systemctl daemon-reload

Proxy 別の手段

/lib/systemd/system/docker.serviceのなかにEnvironmentFileの記述があります。
この配下に追加したい環境情報を置くこともできます。
vi /etc/systemd/system/docker.service.d/http-proxy.conf

1
2
3
[Service]
Environment="HTTP_PROXY=http://<ipaddr>:8080"
Environment="NO_PROXY=localhost,127.0.0.0/8"

確認

systemctl show docker | grep Envi
Environment=HTTP_PROXY=http:// NO_PROXY=localhost,127.0.0.0/8
EnvironmentFile=/etc/default/docker (ignore_errors=yes)

Docker が起動しない!?

docker image pullしている途中で以下のエラーが出ました。
unauthorized: authentication required
http://qiita.com/youhei_nakagawa/items/d7bf1e83008e9ed0c68e

再起動したらなんか動いた。
Bridge がおかしいとこうなるらしいです。以下記録までにログ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# systemctl status docker.service -l
● docker.service - Docker Daemon
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2017-02-02 23:36:21 UTC; 28s ago
Docs: http://docs.docker.com
Process: 752 ExecStart=/usr/bin/docker daemon $DOCKER_OPTS --containerd /run/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 752 (code=exited, status=1/FAILURE)

Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.875670834Z" level=warning msg="Running modprobe bridge br_netfilter failed with message: , error: exit status 1"
Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.877054039Z" level=warning msg="Running modprobe nf_nat failed with message: ``, error: exit status 1"
Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.878371360Z" level=warning msg="Running modprobe xt_conntrack failed with message: ``, error: exit status 1"
Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.880835972Z" level=info msg="Firewalld running: false"
Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.922047885Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Feb 02 23:36:21 photon-pZJ8MxSIT docker[752]: time="2017-02-02T23:36:21.923904455Z" level=fatal msg="Error starting daemon: Error initializing network controller: Error creating default \"bridge\" network: package not installed"
Feb 02 23:36:21 photon-pZJ8MxSIT systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Feb 02 23:36:21 photon-pZJ8MxSIT systemd[1]: Failed to start Docker Daemon.
Feb 02 23:36:21 photon-pZJ8MxSIT systemd[1]: docker.service: Unit entered failed state.
Feb 02 23:36:21 photon-pZJ8MxSIT systemd[1]: docker.service: Failed with result 'exit-code'.

Elasticsearch 公式 Docker を使わないのか?

おっしゃる通りです。使ってみました。
ElasticのDockerイメージを使って、ElasticsearchとKibanaを使う
起動しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl -GET http://localhost:9200
{
"name" : "GvpRqg9",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-1CASI3tTDeS642FvtMvrA",
"version" : {
"number" : "5.2.0",
"build_hash" : "24e05b9",
"build_date" : "2017-01-24T19:52:35.800Z",
"build_snapshot" : false,
"lucene_version" : "6.4.0"
},
"tagline" : "You Know, for Search"
}

さいごに

さくさく挙動してくれて、tdnf で従来通りいろいろ足せるので、普段使いには良さそうだなと思いました。
Alpine Linux も後日試してみます。