ESXi上のdocker環境(Photon OS)構築

2020年7月21日

ESXi上でDockerを稼動させるために、Photon OSをESXi上に導入します。
本記事では、ESXi上にPhoton OSをインストールして、Docker及びDocker Composeを利用できるようにします。

Photon OSとは

Photon OSはVMwareのインフラに最適されたオープンソースのLinuxコンテナホストです。以下のような特徴があります。

  • VMware hypervisor向けに最適化
  • コンテナのサポート
  • tdnfによるパッケージ管理
  • セキュリティ強化

hypervisor向けに最適化されているとのことなので、他のLinuxディストリビューション上にDockerをインストールする方法よりオーバヘッドが少ないと思います。

Photon OSのダウンロード

今回は、ESXi上にインストールするので、ダウンロード対象として、OVAファイルかISOファイルの選択肢があります。

Photon OSのOVA、ISOは以下の特徴がありますので、今回はESXi環境向けにチューニングされたOVAファイルをダウンロードします。

  • OVAインポート: プリインストールされたPhotonOSを取得します。OVAはESXiで簡単にインポートでき、ESXi環境向けにカーネルチューニングがされています。プリインストールされていないパッケージはtdnfを使用してインストールします。
  • ISOインストール:通常のlinuxのインストール方法と同様です。

以下のリンクからOVAファイルをダウンロードします。
今回は、 OVA-hw13_uefiを選択します。
Downloading Photon OS · vmware/photon Wiki · GitHub

Photon OSのインストール

ESXiのWebUIから新規仮想マシン画面を開いて、「OVFファイルまたはOVAファイルから仮想マシンをデプロイ」を選択して、インストールを進めます。
OVAファイルからのインストール手順は、基本的に「次へ」に進んでいく形なので、省略します。
esxi-ova

Photon OSへの初回ログイン

OVAでインストールしましたので、rootのパスワードが指定されています。初回ログイン時にパスワード変更が促されますので、適宜変更します。
初回ログインのデフォルト設定は以下の通りです。

設定
ユーザ名root
パスワードchangeme

Photon OSの初期設定

必要なパッケージのインストール

以下のコマンドで、lesss、sudoをインストールします。

tdnf install less sudo

IPアドレスの固定

Photon OSでは、systemd-netowrkdでネットワーク設定がされています。

以下のコマンドでNICのデバイス名を確認します。ここでは、eth0がNICのデバイス名にあたります。

networkctl list

<以下出力例>
IDX LINK             TYPE               OPERATIONAL SETUP
  1 lo               loopback           carrier     unmanaged
  2 eth0             ether              routable    configured

/etc/systemd/network/00-static.networkというファイルを作成して、以下のような形に編集します。

 [Match]
 Name=eth0

 [Address]
 Address=192.168.10.11/24

 [Network]
 DNS=192.168.10.254

 [Route]
 Gateway=192.168.10.254

上記は、例としてIPアドレスを192.168.10.11、DNSを192.168.10.254、Gatewayを192.168.10.254としています。

ネットワーク設定ファイルのパラメータは多数ありますが、以下を設定しておけばとりあえず利用できますので、適宜自分のネットワーク環境に合わせて設定してください。

パラメータ内容
Name設定したいNICのデバイス名
AddressサーバのIPアドレス
DNSサーバが参照するDNSのIPアドレス
Gatewaryデフォルトゲートウェイ

以下のコマンドで/etc/systemd/network/00-static.networkのアクセス権限を変更します。

chmod 644 /etc/systemd/network/00-static.network

デフォルトでDHCPが有効になっていますので、以下コマンドでDHCPを無効化します。

sed -i -e "s/yes/no/g" /etc/systemd/network/99-dhcp-en.network

以下のコマンドでサービスを再起動して、ネットワーク設定ファイルの設定を有効化します。

systemctl restart systemd-networkd.service

以下のコマンドでIPアドレス情報を確認して、設定したIPアドレスになっていればIPアドレスの固定が完了です。

ip a

timezoneの設定

以下のコマンドを実行してtimezoneを日本に設定します。

ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

hostnameの設定

以下のコマンドを実行してhostnameを設定します。以下の【ホストネーム】は設定したいhostnameに適宜変更してください。

echo 【ホストネーム】 > /etc/hostname

一般ユーザの作成

以下のコマンドを実行して、一般ユーザを作成します。【ユーザ名】は作成したいユーザ名にしてください。

useradd -m -G wheel 【ユーザ名】

以下のコマンドを実行して、一般ユーザのパスワードを設定します。

passwd 【ユーザ名】

今回作成したユーザはwheelグループに追加していますので、sudoが利用できます。これからは管理者権限が必要な作業は、rootアカウントで実施せずに、sudoコマンドを利用して一般ユーザから実施します。

rootからログアウトして、sshを使って一般ユーザでログインします。

Firewallの穴空け

iptablesがデフォルトで有効になっており、iptablesのデフォルト設定は/etc/systemd/scripts/ip4saveに記載されています。
外部からの接続は、デフォルトではsshの22番ポートしか許可されていません。
適宜、/etc/systemd/scripts/ip4saveに以下のような形で追記して必要なポートを空けてください。

## 【ポート番号】は空けたいポート番号
-A INPUT -p tcp -m tcp --dport 【ポート番号】 -j ACCEPT  

編集が完了しましたら、以下のコマンドでiptablesのサービスを再起動します。

sudo systemctrl restart iptables

また、詳細なiptablesの設定は以下の記事を参考にしてください。
関連記事→iptablesの設定

sshの設定

sshはデフォルトで有効になっています。
ただ、見過せない設定がありますので、変更します。

まず、rootのssh接続を無効化します。

/etc/ssh/sshd_configにてPermitRootLoginの値をnoに変更します。なお、PermitRootLoginの設定が2箇所(1つはコメント)ありますので、気をつけてください。

# PermitRootLogin yes
PermitRootLogin no

次にsshのデフォルトポート番号を変更します。デフォルトポート番号は22番ですが、このポート番号は一般的に知られているため、不正侵入のリスクが高まります。そのため、ポート番号をランダムな番号(ここでは、50134)に変更します。
なお、上述のiptablesの設定で事前に変更するポート番号の外部からの接続を許可しておく必要があります。

ポート番号の変更は、/etc/ssh/sshd_configにて以下のように変更します。

# Port 22
Port 50134

rootでのssh接続拒否とポート番号変更を反映するために、以下のコマンドでsshサービスを再起動します。

sudo systemctl restart sshd

また、パスワードでのログインが有効な状態なので、以下の記事を参考に鍵認証に変更します。
関連記事→sshの鍵認証設定

併せて、以下の記事を参考に~/.ssh/config設定をを行います。
関連記事→~/ssh/configによるssh接続の管理

ディスク容量の拡張

OVAからインポートしたので、ストレージサイズが16GBになっています。しかし、場合によっては16GB以上が必要になる場合もありますので、拡張します。
割り当てcpu数やメモリはESXiのWebUI上から簡単に変更できますが、ストレージサイズの変更は少し手間がかかります。

まず、仮想OSを停止して、ESXiのWebUIからストレージの割り当てを増やして、仮想OSを起動します。(今回は32GBに変更)
esxi-photonos-config

このままではPhoton OSを上で拡張した分のストレージ容量を認識できません。
認識させるためには、パーテーションの変更を行います。

まず、パーテーション変更のために、partedをインストールします。

sudo tdnf install parted

partedコマンドを実行します。

sudo parted

以下のコマンドでディスクの状況を確認します。

print free

<以下出力例>
print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 17.2GB
Sector size (logical/physical): 512B/5
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File s
        17.4kB  1049kB  1031kB  Free S
 1      1049kB  11.5MB  10.5MB  fat16 
 2      11.5MB  17.2GB  17.2GB  ext4

今回は2番の領域をリサイズします。
以下のコマンドでリサイズします。コマンド実行後に続行するか聞かれるので、Yesを入力し、終わりの容量を聞かれるので、100%押下します。

resizepart 2

<以下出力例>
resizepart 2
Warning: Partition /dev/sda2 is being used. Are you sure you want to continue?
Yes/No? Yes
Yes
End?  [17.2GB]? 100%

再度、ディスクの状況を確認します。

print free

<以下出力例>
print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 34.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  11.5MB  10.5MB  fat16              boot, esp
 2      11.5MB  34.4GB  34.3GB  ext4

リサイズに成功していれば、quitでpartedを終了します。

次に以下のコマンドでext4のファイルシステムを拡張します。

sudo resize2fs /dev/sda2

以下コマンドでファイルシステムが拡張されていることを確認します。(今回は32GB)

df  -h

<以下出力例>
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        32G  601M   30G   2% /
devtmpfs        998M     0  998M   0% /dev
tmpfs          1000M     0 1000M   0% /dev/shm
tmpfs          1000M  516K  999M   1% /run
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
tmpfs          1000M     0 1000M   0% /tmp
/dev/sda1        10M  2.2M  7.9M  22% /boot/efi
tmpfs           200M     0  200M   0% /run/user/1000

Dockerの起動設定

以下のコマンドでDockerサービスの起動し、自動起動を有効します。

sudo systemctl enable docker
sudo systemctl start docker

以下のコマンドでDockerが正常に稼動することを確認します。

# Hello from Docker!が出力される
sudo docker run --rm hello-world

# docker imagesの削除
sudo docker rmi hello-world

Docker Composeのインストール

以下のリンクを参考に、Docker Composeをインストールします。

Install Docker Compose | Docker Documentation

Docker Composeの安定リリースをダウンロードします。

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Docker Composeに実行権限を付与します。

sudo chmod 755 /usr/local/bin/docker-compose

上記の手順でDocker Composeが利用できるようになります。

終わりに

今回は、ESXi上にDocker環境を構築しました。
最近は、各種サービスがDocker化されており、デプロイが容易になってきました。
さらに、Docker-composeでネットワーク構成を含めて容易に管理できるため、便利です。

いつかKubernetesに挑戦します!