Raspberry Pi 3 Model B に lxc/lxd でコンテナ環境を構築した件


# やりたいこと
RaspberryPi3にLXCとLXDをインストールしてコンテナ環境を実現する。
コンテナ環境には、linebotサーバー、ファイルサーバーを構築する。

**(2019/5/20)**
[「Raspberry Pi 3 Model B+ に lxc/lxd でコンテナ環境を構築した件」](https://qiita.com/hatayan1126/items/804c76ed44ed539395c7)を書きました

# 環境
- Raspberry Pi 3 MODEL B
- 2017-09-07-raspbian-stretch-lite

```shell-session
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.1 (stretch)
Release:        9.1
Codename:       stretch
pi@raspberrypi:~ $
```

# やったこと

## apt-get で lxc をインストール
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo apt-get install lxc -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  bridge-utils debootstrap dirmngr dns-root-data dnsmasq-base libfuse2 liblxc1 libpam-cgfs lxcfs python3-lxc uidmap
提案パッケージ:
  dbus-user-session pinentry-gnome3 tor fuse apparmor btrfs-tools lvm2
以下のパッケージが新たにインストールされます:
  bridge-utils debootstrap dirmngr dns-root-data dnsmasq-base libfuse2 liblxc1 libpam-cgfs lxc lxcfs python3-lxc
  uidmap
アップグレード: 0 個、新規インストール: 12 個、削除: 0 個、保留: 0 個。
2,094 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,838 kB のディスク容量が消費されます。
　：
　： 
pi@raspberrypi:~ $
```

## apt-get で パッケージ管理ツール snapd をインストール
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo apt-get install snapd -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  apparmor libapparmor-perl liblzo2-2 snap-confine squashfs-tools ubuntu-core-launcher
提案パッケージ:
  apparmor-profiles apparmor-profiles-extra apparmor-utils
以下のパッケージが新たにインストールされます:
  apparmor libapparmor-perl liblzo2-2 snap-confine snapd squashfs-tools ubuntu-core-launcher
アップグレード: 0 個、新規インストール: 7 個、削除: 0 個、保留: 0 個。
5,002 kB のアーカイブを取得する必要があります。
この操作後に追加で 27.3 MB のディスク容量が消費されます。
　：
　：
pi@raspberrypi:~ $
```

## snap で lxd をインストール
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo snap search lxd
Name             Version        Developer  Notes  Summary
lxd-demo-server  0+git.18a13d5  stgraber   -      Online software demo sessions using LXD
lxd              2.18           canonical  -      System container manager and API
pi@raspberrypi:~ $ 
pi@raspberrypi:~ $ sudo apt-get install snapd -y
2017-10-03T23:26:44+09:00 INFO snap "core" has bad plugs or slots: core-support-plug (unknown interface)
lxd 2.18 from 'canonical' installed
pi@raspberrypi:~ $
```

## 確認
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc --version
2.18
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxd --version
2.18
pi@raspberrypi:~ $
```

# コンテナ操作

## lxcの初期化
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc init
pi@raspberrypi:~ $
```

## ダウンロード可能なイメージリスト確認
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc image list images: 
+---------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+
|              ALIAS              | FINGERPRINT  | PUBLIC |               DESCRIPTION                |  ARCH   |   SIZE   |          UPLOAD DATE          |
+---------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+
| alpine/3.3 (3 more)             | 5ce4c80edcf3 | yes    | Alpine 3.3 armhf (20170103_17:50)        | armv7l  | 1.53MB   | Jan 3, 2017 at 12:00am (UTC)  |
+---------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+
| alpine/3.3/amd64 (1 more)       | 512ed34baf07 | yes    | Alpine 3.3 amd64 (20171003_17:50)        | x86_64  | 2.00MB   | Oct 3, 2017 at 12:00am (UTC)  |
+---------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+
　：
　：
　：
pi@raspberrypi:~ $
```

## コンテナ起動
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc launch images:ubuntu/xenial ubuntu01
Creating ubuntu01
Starting ubuntu01
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc list
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
|   NAME   |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
| ubuntu01 | RUNNING | 10.55.39.107 (eth0) | fd42:5714:c6c6:e243:216:3eff:fed7:696d (eth0) | PERSISTENT | 0         |
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
pi@raspberrypi:~ $
pi@raspberrypi:~ $ ping -c 3 10.55.39.107
PING 10.55.39.107 (10.55.39.107) 56(84) bytes of data.
64 bytes from 10.55.39.107: icmp_seq=1 ttl=64 time=0.256 ms
64 bytes from 10.55.39.107: icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from 10.55.39.107: icmp_seq=3 ttl=64 time=0.104 ms

--- 10.55.39.107 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2046ms
rtt min/avg/max/mdev = 0.104/0.173/0.256/0.063 ms
pi@hty-sv01:~ $
pi@hty-sv01:~ $
```

アーキテクチャが違うと起動しません...

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc launch images:centos/7/amd64 centos7-01
Creating centos7-01
error: Failed container creation:
 - https://images.linuxcontainers.org: Requested architecture isn't supported by this host
pi@raspberrypi:~ $
```


## コンテナにアタッチ/デタッチする
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc exec ubuntu01 /bin/bash ← アタッチ
root@ubuntu01:~#
root@ubuntu01:~#
root@ubuntu01:~#
root@ubuntu01:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:d7:69:6d brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.55.39.107/24 brd 10.55.39.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd42:5714:c6c6:e243:216:3eff:fed7:696d/64 scope global mngtmpaddr dynamic
       valid_lft 3289sec preferred_lft 3289sec
    inet6 fe80::216:3eff:fed7:696d/64 scope link
       valid_lft forever preferred_lft forever
root@ubuntu01:~#
root@ubuntu01:~# exit  ← デタッチ
exit
pi@raspberrypi:~ $

```
# 感想
- パッケージインストールで spand を使うというところで若干戸惑った。

# 今後の展望
- ブリッジインターフェースを作ってブリッジ接続できるようにしたい。

# 参考
- [LXD on Debian (using snapd)](https://insights.ubuntu.com/2017/02/22/lxd-on-debian-using-snapd/)
- [04.2. Installing LXC & LXD on Debian 9 Stretch](https://youtu.be/jhECnU2GjME)
- [Ubuntu 16.04 LTSでLXD 2.0をセットアップして使ってみる](https://hnakamur.github.io/blog/2016/05/07/start-using-lxd-2.0-on-ubuntu-16.04/)