Raspberry Pi 3で、Wi-Fi アクセスポイントルータ (Docker版)

- 玄関開けたら2分でWifi-AP. 

- (2017-12-7 10am GMT+9) 限定公開のままだったので、手動で変更 

<!--
- ん？限定公開のままか？？ (2017-12-7 10am GMT+9)

> *...Qiitaの限定共有記事のURLを指定すると当日の午前 7 時頃に記事が公開され、 URL も公開状態のものに変更されます。...*
-->

# 概要
- 最近、個人的にラズパイでDockerがハヤリ。 <!-- (そろそろ、飽ｷﾃｷﾀｹﾄﾞ...) -->

	- [ラズパイ: JupyterでTensorFlow+OpenCV on Docker](https://qiita.com/mt08/items/2c51034cd96c4c992781)
	- [[メモ] らずぱいで、apt-cacher-ngのサーバをDockerにて](https://qiita.com/mt08/private/649229f1b5e11b71e1ef)
- 今回は [[メモ] Raspberry Pi 3で、Wi-Fi アクセスポイントルータ](https://qiita.com/mt08/items/f2e4f9d3b1ed00849e23)を、Dockerイメージに。

- `make run SSID=foobar PASS=hogehoge CH=3` で、設定変更できるので、1時間ごとに設定変更、なんてのも簡単にできるね。(Makefile使用)
- Raspbian `2017-11-29-raspbian-stretch`で、docker-ceの現在の最新版(`17.11.0-ce`)を使うと、うまく動かないので、`17.10.0-ce`にダウングレード。
- 急な来客で、Wifiが必要な時に??
- (2017-12-11) `/boot/cmdline.txt`に`cgroup_memory=1`を追加すると17.11が動く。<br>変更例: `sudo sed -i -e 's/rootwait q/rootwait cgroup_memory=1 q/' /boot/cmdline.txt`


# [TL;DR](https://en.wikipedia.org/wiki/TL;DR)
- Dockerが動いている方は、↓でお試し。

    ```bash
    docker run -d --rm --net=host --privileged mt08/rpi-ap
    
    # デフォルト設定
# SSID: `Pi3-AP`
# Passphrase: `raspberry`
```

- makeを使って、

	```bash:こんな感じで
	sudo apt install -y git make && git clone https://github.com/mt08xx/docker-rpi-ap.git && cd docker-rpi-ap/
	# 実行
	# SSID、PASSWORD(8～63文字) Channel番号は、変更可能
	make run SSID=foobar PASS=hogehoge CH=3
	```

- WifiはAPとして使われるので、SSHを使ってる場合、<font color='red'>有線LANを使用する</font>こと。





# 環境
- Raspberry Pi 3 model B
    - microSD 16GB (読み書き速いのがいいよ)
    - Raspbian: [`2017-11-29-raspbian-stretch-lite`](http://vx2-downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-12-01/2017-11-29-raspbian-stretch-lite.zip) 使用
    - 有線LANをインターネットに接続
    - Wifiは、APとして使われる。(デフォルトでIP:`192.168.42.1`となる)
- microSDイメージ焼きと端末
    - Windows 10 64bit
    - [Etcher](https://etcher.io)にて、イメージをSDに焼いた。
    - 端末ソフト: [Teraterm](https://ja.osdn.net/projects/ttssh2/)

# 手順
## Raspbian導入
- いつもの[ツール](https://etcher.io)で、いつも通りに焼き上げる。
- `ssh`できるようにして、ラズパイにログインする.

## Docker 導入

```bash:Docker導入
# Docker導入
curl -sSL https://get.docker.com/ | sh
# ユーザをdockerグループに所属(反映するのに、再起動)
sudo usermod -aG docker ${USER}
# Docker動作確認
sudo docker run --rm hello-world

# エラーでたらダウングレード、Versionロックして、動作確認 >>  docker: Error response from daemon: ~~~~
# 使えるパッケージのバージョンは、apt-cache policy docker-ceで確認できる
sudo apt install -y --allow-downgrades docker-ce=17.10.0~ce-0~raspbian
sudo apt-mark hold docker-ce
sudo docker run --rm hello-world

# うまく動いたら、再起動
sudo reboot
```


```shell-session:hello-world実行例(このメッセージが出ればOK)
pi@raspberrypi:~ $ sudo docker run --rm hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
	(arm32v5)
 3. The Docker daemon created a new container from that image which runs the
	executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
	to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

pi@raspberrypi:~ $
```	


## アクセスポイント導入・実行

```bash
# makeでいろいろできるようにしたので、こちらで。
# 
sudo apt install -y git make
git clone https://github.com/mt08xx/docker-rpi-ap.git
cd docker-rpi-ap/

# 実行
# SSID、PASSWORD(8～63文字) Channel番号は、変更可能
make run SSID=foobar PASS=hogehoge CH=3

# 止める場合
# make stop

# なんかおかしい場合、ターミナル入出力で起動(CTRL-p CTRL-q でコンテナを止めずに抜けれる)
# make run DAEMON=0
```

# ファイル構成と仕組み
- docker起動時のオプション `--net=host --privileged`使って、ホストのネット環境をコンテナから使用。
- ソースは、https://github.com/mt08xx/docker-rpi-ap.git
    - `Makefile`: `make ほげほげ` 、でいろいろやってくれる。
		- 運用向け
			- `make run`: 開始(オプション:SSID, PASS, CH, DAEMON)
			- `make stop`: コンテナ停止
			- `make status`: `docker ps -a`

		- 開発向け
			- `make build`: Docker イメージビルド
			- `make clean`: コンテナ停止・削除、イメージ削除

    - `Dockerfile`: イメージ作成に使用
    - `rpi-ap_start.sh`: 起動時にコンテナ内で呼ばれるスクリプト
        - 環境変数から、設定を読み取って、`dhcpd.conf`と`hostapd.conf`の生成 `ip_forward`設定をする。
        - Makefileには書いてないけど、いろいろ設定できるはず..


# その他

- wifiをインターネット側、有線にクライアントを接続もできる(ﾊｽﾞ...)
	- 遠くにある有線機器をネットにつなぎたい？
	- `-e AP_ENABLE_HOSTAPD=0`で、`hostapd`を起動しない。

	```bash:rpi-ap_start.sh内で
	...
	: ${AP_INTERFACE_OUTGOING:=eth0}
	...
	: ${AP_INTERFACE:=wlan0}
	```
	としてるので、`docker run` のパラメータに`-e AP_ENABLE_HOSTAPD=0 -e AP_INTERFACE_OUTGOING=wlan0 -e AP_INTERFACE=eth0`と設定する. 


<!--
- イメージを用意しておくと、イザというとき、便利(ｶﾓ... イザというときがない.. イザというときは、あせって、忘れている.)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9fcb7277-6055-4b69-28dc-905d09bf8e49.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/af8743b4-9238-6b32-8558-cf4e77485045.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/80b66e31-d4ae-e7db-e4d7-d0a7714a0d06.png)
-->