ポエム

ぽぽぽぽぽぽ

chromeOSでローカルにdocker環境を作る

最近chromebook(C101PA)を買いまして、
ローカルにdocker環境を作った際のメモです。

ローカルでの開発はcloud9などのクラウドIDEで開発するという考え方もあると思いますが、今回はそれとは別にローカルにLinux環境作りたいという話です。


私のchromebookはめちゃコピペですが

Google Chrome	71.0.3578.94 (Official Build) (32 ビット)
プラットフォーム	11151.59.0 (Official Build) stable-channel bob
ファームウェアのバージョン	Google_Bob.8785.262.0
カスタム ID	ASUS-BOB
// uname -a
Linux localhost 4.4.159-15346-gc5e629939ae0 #1 SMP PREEMPT Mon Dec 10 23:59:00 PST 2018 aarch64 ARMv8 Processor rev 4 (v8l) GNU/Linux

Crostiniを使用します。
Crostiniとは、

Crostini is the umbrella term for making Linux application support easy to use and integrating well with Chrome OS. It largely focuses on getting you a Terminal with a container with easy access to install whatever developer-focused tools you might want.

適当な訳ですが、
「CrostiniはChromeOSでLinuxアプリケーションを使いやすくいい感じにインテグレートしてくれるようにサポートしてくれる包括的な言葉で開発者が欲しいツールをコンテナとかでterminalから簡単にインストールしちゃうよ」
ってことらしいです。

Crostiniの必須条件として以下を確認する必要があります。

  1. Crostiniが使える端末かどうか確認する
  2. devかBetaチャンネルに切り替える必要ありますが、chromeOS 69以上ならstableチャンネルでもよい。(後述しているが、私の場合はdevチャンネルに変更しました)

1は以下から確認できます。
www.reddit.com

あとですが、私の場合はdeveloper modeにしてます。自由度が一気に上がりますので、しておいた方がいいと思います。
developer modeにするとき一度ローカルデータをすべて削除する必要があるので、このタイミングでしてください。

それではCrostiniを使ってみましょう。
マジで簡単です。設定からLinux(ベータ版)をオンする。これだけです。
待っていればターミナルが立ち上がると思います。それで完了です。
まじで凄いです。

中でどうなっているのかというと
chromeOS上にTermina VMというコンテナ起動用のVMを作ってくれます。
そしてVM上でLXCというコンテナ技術を用いてコンテナを作ってくれてるそうです。
コンテナといえばdockerだと思いますが、dockerが登場する以前からある技術だそうです。
これに関してはQiitaの以下の記事が参考になりました。
qiita.com

現状ではTermina VMしか使えないらしく、
まずはcrosh(chromeOSのターミナル)からTerimina VMの中に入りたいと思います。

crosh> vmc list
termina
Total Size (bytes): 1640386560
crosh> vsh termina
[ERROR:utils.cc(50)] Failed to read message size from socket: Resource temporarily unavailable
[ERROR:vsh_client.cc(121)] Failed to receive response from vshd

vmc listと叩いてVM一覧を取得しています。
vsh terminaでtermina VMの中のshellに接続できますが、エラーが出てます。。(泣)
再起動してみます。

crosh> vmc stop termina
crosh> vmc start termina
[ERROR:utils.cc(50)] Failed to read message size from socket: Resource temporarily unavailable
[ERROR:vsh_client.cc(121)] Failed to receive response from vshd

むむ。。

https://www.reddit.com/r/Crostini/comments/9tp9xb/errorutilscc50_failed_to_read_message_size_from/
をみると、どうやらchromeのversionを71にしたら同じがエラーがでてる人が結構いるっぽいです。
私も71なので、これっぽいです。
901599 - vsh into termina fails always - chromium - Monorail
ここをみてまさに私と同じ現象でやっぱりchrome versionが関係してるっぽいです。

chromeOSをreinstallしてみたいなことして元のバージョンにrollbackできればいいのですが、私の場合はversionがrollbackせず困っていて、
いろいろ弄ってて、以下の方法で解決しました!

1. devチャンネルに変更する
2. chromeOSのversionをupgradeする(72.0.3626.30になりました)

そしてcroshからvmc startしてみます。

crosh> vmc start termina
(termina) chronos@localhost ~ $ 

入れたー!!!!!

(termina) chronos@localhost ~ $ lxc list
To start your first container, try: lxc launch ubuntu:18.04

+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| penguin | RUNNING | 100.115.92.194 (eth0) |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+

ええやん!ええやん!

あ。ちなみにcrostiniでのlxcの使い方は以下をみると良いです。
howto/uselxd - Crostini

コンテナ作ってみます。

(termina) chronos@localhost ~ $ run_container.sh --container_name mydev --shell --user tani
run_container: warning: container token not supplied; garcon may not function
run_container: info: Container 'mydev'  does not exist; creating from 'debian/stretch' on https://storage.googleapis.com/cros-containers
Creating mydev
Device container_token added to mydev
run_container: info: Created container 'mydev'
Device container_token removed from mydev
Device sshd_config added to mydev
run_container: info: Started container 'mydev'
Linux mydev 4.19.4-02480-gd44d301822f0 #1 SMP PREEMPT Thu Dec 6 17:48:31 PST 2018 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
tani@mydev:~$ 

良いですね。

コンテナに中に入りたい場合には、

(termina) chronos@localhost ~ $ lxc exec mydev bash
root@mydev:~#

ではこのmydevコンテナにdocker, docker-composeをinstallしていきたいと思います。
以下を参考にしました。
Get Docker CE for Debian | Docker Documentation

$ su - tani
$ sudo apt-get update
$ sudo apt-get -y install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ echo "deb [arch=arm64] https://download.docker.com/linux/debian \
     $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ sudo apt-get install docker-ce=18.03.1~ce-0~debian
$ sudo service docker restart
$ sudo systemctl enable docker
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e610d22537c5: Pull complete 
Digest: sha256:b3a26e22bf55e4a5232b391281fc1673f18462b75cdc76aa103e6d3a2bce5e77
Status: Downloaded newer image for hello-world:latest
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"could not create session key: function not implemented\"": unknown.
ERRO[0016] error waiting for container: context canceled 

エラーです。。
ですが、
以下をみてすぐ解決!ありがたい!!
ChromeOS/Crostini で Docker が動かなくなる問題の解決 - Qiita
Pixelbook Revisited: Running Docker Containers – Hacker Noon

terminaVM上で

$ lxc profile unset default security.syscalls.blacklist
$ lxc profile copy default newprofile
$ lxc profile apply mydev default,newprofile
$ lxc restart mydev

mydevコンテナ上

$ docker run hello-world
Hello from Docker!

できたー!

docker-composeもinstallします。

$ curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3
$ sudo pip install docker-compose

とりあえずnginxを起動してみる

$ sudo docker run --name my-nginx -d -p 8080:80 nginx:alpine
$ sudo docker ps 

とかして、起動してるなとみつつ。
IP調べたら、100.115.92.201が割り振られていたので、http://100.115.92.201:8080にアクセスしたらnginxのページがでましたー。

一応、これでdockerは特に問題なく動くかなという感じです。
docker-composeもたぶん大丈夫じゃないかな。


最後にですが。
crostiniを調べてる際によく参考にしてたサイトは以下です。
Running Custom Containers Under Chrome OS
https://www.reddit.com/r/Crostini/wiki/



以上となります。