CoreOS Container Linux の環境構築(さくらの VPS)

## <i class="fa fa-paw fa-fw"></i> はじめに
夏休みの課題の取組みとして今更ながら，`Docker` で遊んで見るべく，テスト環境で使っていた `さくらの VPS(2G,HDD 200GB)` があったので，取り敢えずこの環境に `CoreOS(Container Linux)` を構築してみます．毎度のことながら，私の備忘録代わりのメモになります．

## <i class="fa fa-leaf fa-fw"></i> 前準備
`Value-Domain` で取得したドメインも余っていたので，`さくらの VPS` と関連付けることにします．また，`さくらの VPS` のネットワークの情報は，コントロールパネルに記載されています．

### `Value-Domain` の `DNS` の設定
`Value-Domain` の `DNS` の `A` レコードを`さくらの VPS` の `IP アドレス` に設定する．

```
a @ xxx.xxx.xxx.xxx (`さくらの VPS` の IPv4 アドレス)
```

### `さくらの VPS` のホスト名逆引き登録
`コントロールパネル`の各種設定にある`ホスト名逆引き登録`からドメイン名を登録する．

## <i class="fa fa-leaf fa-fw"></i> CoreOS Container Linux のインストール
### ISO イメージのダウンロード
[ここ](https://coreos.com/os/docs/latest/booting-with-iso.html) から `Stable Channel` の 'ISO イメージ(coreos_production_iso_image.iso)' をダウンロードする．

### `さくらの VPS` に `ISO イメージ` をアップロード
`コントロールパネル`の各種設定にある `OS インストール` から `ISO イメージインストール` を選択する．`SFTP アカウントの発行` をクリックすると，`ISO イメージアップロード先情報` が表示されるので，先ほどダウンロードした `ISO イメージ` をアップロードする．(下記は MSYS2 のターミナルの作業)

```sh
$ cd ISO (`ISO イメージ` のダウンロード先)
$ sftp ユーザ名@ホスト名
sftp> cd iso
sftp> put coreos_production_iso_image.iso
sftp> exit(or bye or quit)
$
```

`ISO イメージ` のアップロードが終われば，`ISO イメージ情報` が表示される．問題が無ければ，`マウント設定`の `VirtIO を有効にする`にチェックが入っているのを確認して，`設定内容を確認する` をクリックすると確認画面が表示される．`インストールを実行する` をクリックしてインストールを開始する．しばらくすると `VNC コンソールの起動` と表示されるのでクリックして `VNC コンソール`を起動する．`VNC コンソール` では作業しづらいので，`SSH` で接続して作業します．

### `VNC コンソール` の作業
ネットワークの設定を行う．

```sh
$ sudo ifconfig eth0 {IPv4 アドレス} netmask {ネットマスク}
$ sudo route add default gw {ゲートウェイ}
$ sudo vi /etc/resolv.conf
```

```:/etc/resolv.conf
nameserver {プライマリ DNS}
```

ssh で接続できるように，一時的なパスワードを設定する（インストール後は引き継がれない）．

```sh
$ sudo passwd core
```

### `SSH` での接続
ローカルのターミナル(ここでは，`MSYS2 のターミナル`)から接続できるか確認する．

```sh
$ ssh core@xxx.xxx.xxx.xxx (`さくらの VPS` の IPv4 アドレス)
```

接続できることが確認できれば，一度切断して，設定ファイル `cloud-config.yml` を転送する．

```sh
$ scp ./cloud-config.yml core@xxx.xxx.xxx.xxx:~/
```

```yaml:cloud-config.yml
#cloud-config

hostname: "coreos" # ホスト名

# https://coreos.com/os/docs/latest/cloud-config-examples.html
coreos:
  units:
    # https://coreos.com/os/docs/latest/network-config-with-networkd.html
    - name: 00-static.network
      content: |
        [Match]
        Name=eth0

        [Network]
        DNS={プライマリ DNS}
        DNS={セカンダリ DNS}
        Address={IPv4 アドレス}/23 # 「/23」はネットマスク
        Gateway={ゲートウェイ}
    # https://coreos.com/os/docs/latest/configuring-date-and-timezone.html
    - name: settimezone.service
      command: start
      content: |
        [Unit]
        Description=Set the time zone

        [Service]
        ExecStart=/usr/bin/timedatectl set-timezone Asia/Tokyo
        RemainAfterExit=yes
        Type=oneshot
    # https://coreos.com/os/docs/latest/customizing-sshd.html
    - name: sshd.socket
      command: restart
      runtime: true
      content: |
        [Socket]
        ListenStream=12345 # SSH の接続ポート(22 から変更)
        FreeBind=true
        Accept=yes

write_files:
  - path: /etc/ssh/sshd_config
    permissions: 0600
    owner: root:root
    content: |
      UsePrivilegeSeparation sandbox

      PermitRootLogin no
      AllowUsers username # 下記 users で設定するユーザ名
      MaxAuthTries 2
      MaxSessions 1
      PubkeyAuthentication yes
      PasswordAuthentication no
      ChallengeResponseAuthentication no

# https://coreos.com/os/docs/latest/cloud-config.html
users:
  - name: "username" # ログインするユーザ
    passwd: "...." # opesnssl passwd -1 の結果を張り付ける
    groups:
      - "sudo"
      - "docker"
    ssh-authorized-keys:
      - "ssh-rsa AAAAB..." # SSH 公開鍵を登録
```

設定ファイルの転送が終われば，SSH で再度接続してインストール作業を続行する．

```sh
$ ssh core@xxx.xxx.xxx.xxx
```

ディスクの確認

```sh
$ sudo fdisk -l
```

転送した設定ファイル 'cloud-config.yml' をチェックする．

```sh
$ sudo coreos-cloudinit -validate=true -from-file=./cloud-config.yml
```

`cloud-config.yml` に問題がなければインストールを行う．

```sh
$ sudo coreos-install -d /dev/vda -C stable -c ./cloud-config.yml
$ sudo shutdown -r now
```

### インストール後の確認
`SSH` で接続できるか確認する（再起動後しばらく待つ）．

```sh
$ ssh username@xxx.xxx.xxx.xxx -p 12345 (sshの接続ポート)
```

おそらく，エラーが表示され接続できないので，`~/.ssh/known_hosts` からホスト情報を削除する．

```sh
$ ssh-keygen -R xxx.xxx.xxx.xxx
```

再度接続できるか確認する．

```sh
$ ssh username@xxx.xxx.xxx.xxx -p 12345
```

`core`user の権限を，[ここ](https://coreos.com/os/docs/1506.0.0/coreos-hardening-guide.html) を参考に変更する．

```sh
$ sudo gpasswd -d core wheel
$ sudo gpasswd -d core docker
$ sudo gpasswd -d core rkt
```

### 設定の更新
インストールで使用した設定ファイル 'cloud-config.yml' は，'/var/lib/coreos-install/user_data' に保存されるので，設定を変更するには，'/var/lib/coreos-install/user_data' を編集して再起動する．

### 動作の確認
情報の確認．

```sh
$ docker version
$ docker info
```

`hello-workd` コンテナの実行．

```sh
$ docker images
$ docker run hello-world
$ docker ps
$ docker ps -a
$ docker images
```

イメージ，コンテナの情報を確認．

```sh
$ docker inspect hello-world
$ docker inspect `docker ps -l -q`
```

`-l` は，最後に起動したコンテナを表示，`-q` は，コンテナ ID のみを表示．

コンテナの削除．

```sh
$ docker rm `docker ps -l -q`
$ docker ps -a
```

イメージの削除．

```sh
$ docker rmi hello-world
(or $ docker rmi イメージ ID)
$ docker images
```


### さいごに
取り敢えず，インストールが終わったので，`Docker` で遊んでみます．