VPSでFedora CoreOS、Dockerを動かす

公開日:2022年12月29日
最終更新日:2022年12月29日
レベル:★★★☆☆
クラウドサーバ(VPS)にFedora CoreOSをインストールし、Docker-Composeを動かすまでの手順をご紹介します。

以前、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で構築してみました。

ー 以上 ー

 CMSを使ったホームページ制作
 VPS, AWS等クラウドシステム構築
等々のご依頼承っております

Contents