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の必須条件として以下を確認する必要があります。
- Crostiniが使える端末かどうか確認する
- 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/
以上となります。