VPSでFedora CoreOS、Dockerを動かす
- 準備
- SSH公開鍵の作成
- ハッシュ化したパスワードの作成
- fcctの入手
- Webサーバの準備
- インスタンス作成
- KAGOYA契約
- VPSインスタンス作成
- セキュリティグループの作成
- 各種情報の収集
- コンソールに入る
- ネットワーク情報の取得
- インストール先のディスク調査
- ネットワーク仮設定
- 一時的に固定IPを付与
- 確認
- Ignitionファイル作成
- ymlファイル作成
- Ignitionファイル生成
- 外部のWebサーバにアップロード
- インストール実行
- リモートからログイン
- Fedora CoreOS基本設定
- タイムゾーン変更
- ホスト名変更
- 必要なパッケージをインストール
- パスワードなしのsudoをやめる(任意)
- docker-composeを動かす
- docker-composeのインストール
- Docker用ユーザの作成
- Dockerファイル類の配置
- 懸案事項
- 参考サイト
以前、AWS EC2にFedora CoreOSを入れる方法を書きましたが、今回は他のVPS(Virtual Private Server:仮想専用サーバ)でFedora CoreOSを動かしてみた方法をご紹介します。
VPSはKAGOYAさんの「KAGOYA CLOUD VPS」を使用しました。
準備
SSH公開鍵の作成
Fedora CoreOSのインストールに必要となるSSH公開鍵を準備します。
お手元のPC/Macにて下記コマンドを実行して作成します(下記の例はMacでの実行結果です)。
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <---- Enter入力
Enter same passphrase again: <---- Enter入力
Your identification has been saved in /Users/user/.ssh/id_rsa
Your public key has been saved in /Users/user/.ssh/id_rsa.pub
The key fingerprint is:
:
ホームディレクトリの.ssh/にSSH秘密鍵(id_rsa)およびSSH公開鍵(id_rsa.pub)ができあがりますので保管します。
ファイル名は変更しても構いません。
macOS, Linuxの場合、秘密鍵のパーミッションを「600」に変更します。
これを忘れるとSSHログインできませんので注意しましょう。
ハッシュ化したパスワードの作成
Fedora CoreOSのインストール時にあったほうが良い「core」ユーザのパスワードをハッシュ化したものを作成します。
こちらもお手元のPC/Macにて下記コマンドを実行して作成します。
$ openssl passwd -1 password <-------- パスワードを「password」とした例
$1$S6・・・ <-------------------------- 「password」をハッシュ化したもの。控えておきます
Fedora CoreOSのインストールには上記SSH公開鍵が必須ですが、これだけではコンソールからのログインができません(リモートログインのみ)。コンソールログインを有効にするためにはハッシュ化したパスワードを準備する必要があります。
fcctの入手
Fedora CoreOSのインストールには「Ignitionファイル」と呼ばれるインストール情報を記述した設定ファイルが必要になります。
IgnitionファイルはJSON形式で記述されたものなのですが、人間が記述するには少々大変なので、一旦記述しやすい形式(YAML形式)でIgnitionファイルを作成し、それをJSON形式に変換する方法をとることにします。その際に必要となる変換ツールが「fcct」です。
fcctは下記サイトからダウンロードします。
https://github.com/coreos/butane/releases
macOS用(〜darwin)、Linux用(〜linux-gnu)があるので利用環境に応じてダウンロードします。
Windows用は無いようなのでWindowsユーザは別途MacかLinux環境を用意する必要があります。
「butane-〜」という名前なので「fcct」にリネームします
fcctファイルのパーミッションに「x」(実行権限)を追加します。
% chmod +x fcct
Ignitionファイルはこの後作成します。
Webサーバの準備
Fedora CoreOSでは、インストール時にIgnitionファイルを外部のWebサーバから取得する仕組みになっています。
よって、Ignitionファイルを設置するための、インストールするサーバ以外のWebサーバを用意する必要があります。
Webサーバの種別には特に制約はなく、SSL(https)で暗号化されている必要もありません。
すでにファイルをアップロードできるWebサーバをお持ちであればそちらを使用できます。適当なWebサーバがない場合は、無料のWebサーバなどを利用しても良いでしょう。
今回は無料で使えるWebサーバ「xfree」サーバの「HTMLサーバ機能」を利用しました。
インスタンス作成
KAGOYA契約
KAGOYA CLOUD VPS のサイトにて「お申し込みはこちら」から申込み、アカウントを作成します。
VPSインスタンス作成
KAGOYA CLOUD VPSにログインします。
上部メニューから [イメージ]-[ISOイメージ]を選択します。
[ISOの登録]ボタンをクリックします。
ISOイメージを登録します。
「ISOイメージ名」は初期表示のままでOK。
Fedora CoreOSのサイト右上にある[ダウンロード]リンクを開き、「Bare Metal & Virtualized」タブの中の「Bare Metal」のISOのダウンロードを右クリックし、リンク先のアドレスをコピーします。
「取得先URL」にコピーしたURLを貼り付けます。
[ISOの登録]ボタンをクリックします。
ISOが登録され一覧に表示されるので、[インスタンス作成]ボタンをクリックします。
スペック選択の画面になるので希望するスペック(CPU/メモリ/ストレージ)を選択します。
「コンソールログインパスワード」、「インスタンス名」を入力し、[インスタンス作成]ボタンをクリックします。
インスタンスが正常に作成されるとインスタンス一覧に表示されます。
インスタンス名をクリックします。
インスタンスの詳細情報が表示されるので、IPアドレス、ゲートウェイ、サブネット、DNSの値を控えておきます(Ignitionファイル作成時に使用します)。
セキュリティグループの作成
作成したインスタンスに「セキュリティグループ」を設定します。
インスタンス詳細情報を表示しているページの上部メニューより[セキュリティ]-[セキュリティグループ]を選択します。
[セキュリティグループ追加]ボタンをクリックします。
許可するネットワークパケットを設定します。
Webサーバとして構築するのであれば、TCP80番(http)、443番(https)、および管理用に22番(ssh)を設定します。
TCP80番とTCP443番は全ての接続元から受付るので[IP]欄は「*」を設定します。
TCP22番は限られた場所からのみ接続を許可したいので[IP]欄に許可するIPアドレスを設定します。
[登録]ボタンをクリックします。
セキュリティグループ一覧に追加されます。
インスタンス詳細ページに戻り、「セキュリティグループ」のプルダウンを開いて、先ほど登録したセキュリティグループを選択します。
各種情報の収集
Ignitionファイルを作成する際に必要となる、作成したインスタンスの各種情報を収集していきます。
ここからはインスタンスにコンソールからアクセスして操作していきます。
コンソールに入る
インスタンス詳細ページにある「コンソール」タブをクリックし、[コンソールを起動]ボタンをクリックします。
※ブラウザのポップアップが無効になっているとコンソールウィンドウが開かないので注意(ポップアップを有効にしてやる)
コンソールが表示されます。
この段階はFoedora CoreOSのISOイメージでブートされた状態であり、まだFedora CoreOSはインスタンスにインストールされていません。
この段階ではユーザ/パスワードを指定しなくともログインした状態となります。
以降、コンソールからコマンドを入力していきます。
※キーボードはUSキーボード配列なので注意
ネットワーク情報の取得
Fedora CoreOSをインストールする際に利用するIgnitionファイル作成に必要な情報を収集します。
必要なネットワーク情報は次の通りです。
- ネットワークの「id」
- インターフェース名
- MACアドレス
- IPアドレス(インスタンス詳細ページで取得済み)
- サブネットマスク(インスタンス詳細ページで取得済み)
- ゲートウェイ(インスタンス詳細ページで取得済み)
- DNS(インスタンス詳細ページで取得済み)
コンソールに次のコマンドを入力します。
$ nmcli con show
NAME UUID TYPE DEVICE
Wired connection 1 a8bcbdc1-e9ae-3d14-92f1-123456789012 ethernet ens3
idは「Wired connection 1」
interface-nameは「ens3」
であることがわかりました。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
:
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:a1:a1:a1:a1 brd ff:ff:ff:ff:ff:ff
:
MACアドレスが「fa:16:a1:a1:a1:a1」(仮です)であることがわかりました。
インストール先のディスク調査
Fedora CoreOSのインストールコマンド実行時に、インストール先のディスク情報を指定する必要があるため、インスタンスのディスク情報を調査します。
次のコマンドを実行し、ディスクデバイスを調べます。
$ sudo fdisk -l
:
Disk /dev/vda: 〜 <---- ここを確認する
:
ネットワーク仮設定
一時的に固定IPを付与
Fedora CoreOSのインストールに必要なIgnitionファイルは外部のWebサーバから受け取る方式なので、インスタンスがネットワークを使用できる状態になっている必要があります。
ですが、KAGOYA CLOUD VPSはDHCPで割り当てられたIPを取得できないようなので、割り当てられたIPアドレスを手動で設定します。
※割り当てられたIPアドレス、サブネットマスク、ゲートウェイ、DNSはインスタンス詳細情報ページで確認できます。
次のコマンドでインスタンスにIPアドレスを設定します。
ここでは
- IPアドレス:133.1.1.10
- サブネットマスク:255.255.254.0(23ビットマスク)
- ゲートウェイ:133.1.1.1
- DNS:210.134.55.219
とします。
$ sudo nmcli connection modify Wired\ connection\ 1 ipv4.method manual ipv4.addresses 133.1.1.10/23 ipv4.gateway 133.1.1.1 ipv4.dns 210.134.55.219
確認
次のコマンドを入力し、正しくIPアドレスが付与されていることを確認します。
$ ip a
任意の宛先にpingを発行し、応答が返って来ればOK。
$ ping www.yahoo.co.jp
Ignitionファイル作成
ymlファイル作成
収集した情報をもとにIgnitionファイルの基となるYAML形式ファイルを作成します。インデントには意味がありますので注意してください。
下記の形式で作成し、「fcos.yml」という名前で保存します(名前は何でも良い)。
variant: fcos
version: 1.3.0
passwd:
users:
- name: core
ssh_authorized_keys:
- ssh-rsa AAAA〜 <------- 予め生成しておいたSSH公開鍵の「内容」をコピー&ペースト
password_hash: $1$S6〜 <--- 予め生成しておいたパスワードのハッシュ値を設定
storage:
files:
- path: /etc/NetworkManager/system-connections/WiredConnection1.nmconnection
mode: 0600
overwrite: true
contents:
inline: |
[connection]
id=Wired connection 1 <---- 収集したid
type=ethernet
interface-name=ens3 <----- 収集したinterface-name
[ethernet]
mac-address=fa:16:a1:a1:a1:a1 <--- 収集したMACアドレス
[ipv4]
address1=133.1.1.10/23,133.1.1.1 <--- インスタンス詳細ページに記載されたIPアドレス、サブネット、ゲートウェイ
dns=210.134.55.219;210.134.48.31 <--- インスタンス詳細ページに記載されたDNS情報
method=manual
[ipv6]
addr-gen-mode=stable-privacy
method=auto
[proxy]
Ignitionファイル生成
先に取得した「fcct」を使って、YAML形式で上で作成したIgnitionファイルを、実際にインストールで使用するJSON形式に変換します。
PC/Macのターミナルを使用して次のコマンドを実行します。
% cd fcctのある場所
% fcct --input fcos.yml --pretty --output fcos.json
Flag --input has been deprecated, specify filename directly on command line
%
JSON形式のIgnitionファイルが「fcos.json」の名前で生成されます(名前は何でも良い)。
外部のWebサーバにアップロード
生成したJSON形式のIgnitionファイル(fcos.json)を、外部のWebサーバにアップロードします。
今回は外部のWebサーバとして「xfree」サーバを利用しました。
アップロードした先のURLも取得します。
アップロード後、正常にアクセスできることをブラウザからURLを入力して確認します。
インストール実行
インスタンスのコンソールより次のコマンドを実行してFedora CoreOSをインストールします。
ここでは
インストール先ディスク:/dev/vda
Ignitionファイルの場所:http://user01.html.xdomain.jp/fcos.json
とします。
$ sudo coreos-installer install /dev/vda --insecure-ignition --ignition-url http://user01.html.xdomain.jp/fcos.json
Installing Fedora CoreOS 36.20221030.3.0 x86_64 (512-byte sectores)
> Read disk 2.4 GiB/2.4 GiB (100%)
Writing Ignition config
Install complete. <---------- これが表示されればOK。
$ sudo systemctl reboot <---- リブートする
リモートからログイン
PC/MacのターミナルよりSSHで接続してみます。
例ではSSH秘密鍵は 「id_rsa」とします。
※macOS, Linuxの場合、秘密鍵ファイルのパーミッションを「600」に変更しておくのを忘れずに。
% ssh -i .ssh/id_rsa core@133.1.1.10
The authenticity of host '133.1.1.10 (133.1.1.10)' can't be established.
:
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes <--- 「yes」を入力
:
Fedora CoreOS 36.20221030.3.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos
[core@v133-1-1-10 ~]$ <---- プロンプトが返ってくればOK
Fedora CoreOS基本設定
以上でFedora CoreOSのインストールは終了しました。
以降はFedora CoreOSでDockerを運用するにあたっての基本的な設定をしていきます。
タイムゾーン変更
Fedora CoreOS(以降「CoreOS」と記します)のインストール直後はタイムゾーンが「UTC」になっています。このままだとログファイル等の日時がUTCで表示されてしまうので「JST」に変更します。
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
:
Time zone: Asia/Tokyo (JST, +0900) <----- ここを確認する
:
ホスト名変更
localhostになっているホスト名を任意の名前に変更します(例では「hoge」に変更しています)。
$ sudo hostnamectl set-hostname hoge
必要なパッケージをインストール
zip, unzipをインストールします。
$ sudo rpm-ostree install zip unzip
後々SELinuxのコマンド「semanage」を使いたい場合、次のようにインストールします(必須ではありません)。
$ sudo rpm-ostree install policycoreutils-python-utils
インストール終了後、再起動を要求されるので再起動します。
$ sudo systemctl reboot
パスワードなしのsudoをやめる(任意)
CoreOSインストール直後はcoreユーザのみ作成されておりsudoコマンドの実行が許可されています。またcoreユーザにパスワードが設定されていないのでパスワードなしでsudoコマンドが実行可能となっています。
これを、sudo実行時にパスワードを要求するように変更します。
coreユーザにパスワードを設定します。
※強固なパスワードを設定するのであれば、単に「passwd」でも可。
$ sudo passwd core
Changing password for user core.
New password: <---------- パスワードを入力
Retype new password: <--- 同じパスワードを再度入力
passwd: all authentication tokens updated successfully.
「/etc/sudoers.d/coreos-sudo-group」ファイルの内容を変更します。
$ sudo vi /etc/sudoers.d/coreos-sudo-group
行をコメントアウトします。
# https://github.com/openshift/os/issues/96
#%sudo ALL=(ALL) NOPASSWD: ALL <-- 先頭に#をつけてコメントアウト
再起動し、coreユーザでsudoコマンドを実行した時にパスワードを要求することを確認します。
docker-composeを動かす
docker-composeのインストール
CoreOSインストール直後はdockerコマンド、podmanコマンドは使用できますが、docker-composeは入っていませんのでインストールします。
$ sudo rpm-ostree install docker-compose
一旦再起動します。
$ sudo systemctl reboot
確認します。
$ which docker-compose
/usr/bin/docker-compose
Fedora CoreOSではdocker.serviceを明示的に起動させる必要はありません。
Docker用ユーザの作成
CoreOSインストール直後はcoreユーザからdockerコマンドを実行できません(coreユーザはdockerグループに属していません)。
$ docker container ls
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
coreユーザをdockerグループに入れるか、sudoでdockerコマンドを実行することもできますが、ここではセキュリティ面を考慮してDockerを使うための専用をユーザを作成することにします。
$ sudo useradd -u 10000 dockerrun <----- Docker専用ユーザ「dockerrun」を作成
$ sudo passwd dockerrun
$ sudo usermod -aG docker dockerrun <--- dockerグループに入れる
$ id dockerrun
uid=10000(dockerrun) gid=10000(dockerrun) groups=10000(dockerrun),978(docker)
Dockerファイル類の配置
docker-compose.yml、DockerfileなどDockerを動作させるために必要なファイル類を作成し配置します。
CoreOSではSELinuxが有効になっていますので、どこのディレクトリにdocker関連ファイルを置いても動作するわけではありません。「container_var_lib_t」などDockerの動作を許可するコンテキストが付加されたディレクトリにdocker関連ファイルを配置するか、Docker関連ファイルを保存するディレクトリにDockerの動作を許可するコンテキストを追加する必要があります。
ここでは「/var/lib/containers」ディレクトリ以下にDocker関連ファイルを置くことにします。
$ sudo mkdir /var/lib/containers/test
$ sudo vi /var/lib/containers/test/docker-compose.yml <--- 内容は割愛
$ sudo vi /var/lib/containers/test/Dockerfile <----------- 内容は割愛
docker-composeを実行します。
$ sudo su dockerrun
[sudo] password for core: <--------- coreユーザのパスワードを入力
$ cd /var/lib/containers/test
$ docker-compose up -d --build
:
$ docker-compose ps <--------------- コンテナの起動を確認
:
懸案事項
以上でDocker-Composeを動かすことができるようになりました。
ですが、次のような懸案・課題が残っています。
- ストレージをバインドマウントさせる際のSELinux制限への対応
- Dockerのセキュリティ設定
- DockerでWebサーバを稼働させる際のコンテンツの管理方法(コンテンツ配置場所、更新方法、など)
これらを解決していかないと本番環境でDockerを運用するのは厳しいでしょう。
これらの解決に向けての対策は別の機会に行っていきます。
参考サイト
Fedora CoreOSをベアメタルにインストールする: Qiita
コンテナ用サーバをFedora Core OSで構築してみました。