RancherOS + compose + portainer.io でお手軽 GUI docker stack 入門環境

# はじめに

コンテナ専用OSのなかでもRancherOSはisoサイズが極端に小さいため始めるのも肩がこらず楽ちんです。

| ディストリビューション       |      amd64 iso size |
|:-----------------|------------------:|
| CoreOS Container Linux 2135.6.0.             |              423MB |
| CentOS Atomic Host 2019-Jul-2           |            1.1GB| 
| Fedora Atomic Host 20190820             |              1GB | 
| Rancher OS 1.5.3           |                127MB | 
※ Ubuntu Coreはisoがないが、amd64用イメージは340MB

コンテナオーケストレーション環境Rancherの影響から、Kubernetesと組み合わせての利用が多い様子ですが、単にdockerだけで使うにも便利です。各種のディストリビューションコマンドセットを切り替えて使えるので、RedHat派/Debian派/Ubuntu派 問わず使える点も魅力。

今回は、潔くKubernetesは捨てて、portainerをGUIとしたdocker-composeを使ったコンテナスタック入門環境を構築する手順を紹介します。慣れれば5分で終わります。

# 環境

* Rancher OS v1.5.3
* portainer 1.22.0

記事を書くにあたり、VirtualBox 6.0上に環境を用意して作業していますが、別の環境でも特に変わりありません。

# 手順概略

1. Rancher OS インストール & 設定
2. portainer 導入、起動、httpでアクセス

Rancher OS に `docker-compose` コマンドはないのですが、導入は不要です。これは、portainerが内部にlibcomposeを持っており自力でcomposeを実行できるからのようです。**Rancher OSにdocker-composeをインストールしてもコンソールを切り替えると消えてしまい、これの対策は逆に面倒**なので、Rancher OS上でdocker-composeを直接扱うよりも便利な点。

## 1. Rancher OS インストール & 設定

### iso から Rancher OSを起動

https://github.com/rancher/os/releases/tag/v1.5.3 からrancheros.isoをダウンロード。CDに焼くなりブートUSBを作るなりして、起動。

![rancheros_isoboot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/ee2749d0-733d-db51-54ed-1dea3f173d55.png)
起動するとログイン状態になるので、SSHの準備として一時ログイン用パスワードを設定する。このとき設定するパスワードは使い捨てるため、深く考えなくてもよい。

```
[rancher@rancher ~]$ sudo passwd rancher
# 適当なパスワードを設定
```

ここで設定したアドレスを使って、SSHログイン。ユーザ名は `rancher`

```
> ssh -l rancher -p 22 <host_address>
```

### インストール設定を流し込む

sshターミナル上で、

```
[rancher@rancher ~]$ vi cloud-config.yml
```

```yml:cloud-config.yml
hostname: ros001
# ファイルがないと怒られるので何か書いておく
# 必要であればほかの設定も追加
```

ここでは、ネットワークアドレスはDHCP設定を前提にしている。ここでネットワーク設定を済ませる場合は、[公式リファレンス](https://rancher.com/docs/os/v1.2/en/networking/interfaces/) を参照のこと。
`cloud-config.yml` の文法チェックをしておく。エラーが出たら修正しておくこと。

```
[rancher@rancher ~]$ sudo ros config validate -i cloud-config.yml
# 何も表示されなかったら文法チェックOK
```

### ディスクにインストール

先にインストール先のディスクを確認しておく。

```
[rancher@rancher ~]$ sudo fdisk -l 
Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```

例えばこんな風に出たら、インストール先は `/dev/sda` なので、次のコマンドを打ってディスクへインストールする。

```
[rancher@rancher ~]$ sudo ros install -c cloud-config.yml -d /dev/sda --append="rancher.password=<localpassword>"
```

`--append="rancher.password=password"` の部分は、パスワードログインのために必須。**ここで設定するパスワードは、ディスクにインストールされたシステムのログインパスワードとなる**ため、慎重に決めること。うまくいけば再起動がかかる。ブートディスクをアンマウントして、ディスクにインストールされたRancher OSを起動する。

### インストール後の設定

インストール後、SSHでログインする際に、

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
```

などと出てくることがある。インストール時にSSHログインした際のfingerprintが残っていることが原因なので、SSHクライアント側PCの`~/.ssh/known_hosts` を開いて、当該項目を消せば治る。

設定すべき項目は特にないが、ネットワーク回り等で追加設定がある場合はここで済ませておく。また、セキュリティの問題がある環境の場合はSSHログインを鍵認証にしておく。設定の方法は2種類あって、

* `sudo ros config set ...` : 設定コマンドを使う

```
# 設定例
[rancher@ros001 ~]$ sudo ros config set rancher.network.interfaces.eth0.dhcp false
```

* `vi /var/lib/rancher/conf/cloud-config.yml` : ファイルの直接編集

```yml:/var/lib/rancher/conf/cloud-config.yml&nbsp;設定例
rancher:
  network:
    interfaces:
      eth0:
        dhcp: false
```

は同じ意味になる。ymlを直接編集する場合は、文法チェックを必ず行う。

```
[rancher@ros001 ~]$ sudo ros config validate -i /var/lib/rancher/conf/cloud-config.yml
```

いずれの場合も、設定変更後は再起動が必要。

なお、

* 設定を確認するには `$ sudo ros config export` コマンドを使う
* 項目を削除するためのコマンドはないので、削除が必要なら `/var/lib/rancher/conf/cloud-config.yml` を直接編集

詳しくは [リファレンスマニュアル](https://rancher.com/docs/os/v1.x/en/installation/configuration/) 参照

## portainer.io の実行

```
$ docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
```
`http://<ホストアドレス>:9000` にアクセス


こんな画面が出たら、起動中なので少し待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/125cace7-df3d-60ff-6de0-10ca89522b1b.png)

うまく起動すればadminパスワード設定画面が出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/4fe0b2e5-d055-d33a-0c8c-7443fead75f4.png)

今回はローカルのdockerを管理したいので、Localを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/53250116-b8ea-a7be-3a2d-fe79c96493a9.png)

local をクリックして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/36c3fbaa-5307-5385-fb48-ef478104e8fb.png)

Stacks → Add stack をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/317311d4-b0ae-4429-f470-a2e8c1d1aea9.png)

Nameを入力する際に、**現在、英子文字以外のあらゆる記号、大文字を使うとstackの管理が狂う不具合があるため、a-zのみで入力する。**（[参照](https://github.com/portainer/portainer/issues/2020)）
下のエディタにdocker-compose.ymlの中身を入力するか、docker-compose.ymlをアップロードする。下の方の`Deploy the stack`ボタンを押せば、ネットワーク設定が正しければ問題なくデプロイできるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73039/8411d04c-c04e-8b65-02ff-02024512dc6f.png)

ここまで慎重に進めても15分程度。あとはほとんどの設定がportainer上で可能です。


# Tips
## Rancher OSの `console` 設定について

https://rancher.com/docs/os/v1.x/en/installation/configuration/switching-consoles/ に詳しい。

```
$ sudo ros console list
```

で出てきたものなら、 何を選んでもよい。`default` コンソールはコマンドが少ないので、別のものを選ぶとよい。**コンソールを切り替えると `/home` `/opt` `/var/lib/docker` `/var/lib/rancher` 以外のデータはすべて消えてしまう**ので注意。

# 参考文献
* Rancher OS インストール関連
    * [RancherOS公式ドキュメント](https://rancher.com/docs/os/v1.x/en/)
    * [@aoya6i, RancherOS で インストール後パスワードでログインする方法](https://qiita.com/aoya6i/items/127354c03b55a161a35b)
    * [@Morihaya, 
[rancherOS]rancherユーザのパスワードを設定する手順メモ](https://qiita.com/Morihaya/items/b1e9eb46fab3e7a65b6b)
    * [Rancher OS 上でcomposeコマンドを永続化のIssue](https://github.com/rancher/os/issues/323)
* portainer.io インストール関連
    * [公式インストールドキュメント](https://portainer.readthedocs.io/en/latest/deployment.html) 
    * [stack名バグに関するIssue](https://github.com/portainer/portainer/issues/2020)