Chromebook + Docker Snap
Chromebook に Docker をインストールします。
Snap でさらっとインストールできるのかな?と思ったらしっかりトラブルがあったので、記録を残します。
この記事の前提
- Chromebook ASUS C425TA
本体は日本語向けに設定済み- Chrome OS 86
- Core m3-8100Y
- 4GB RAM
- eMMC 64GB ストレージ
- US キーボード
- Crostini 有効化済み
- 標準 Debian 10 コンテナ
日本語化対応済み
Snap インストール済み
- 標準 Debian 10 コンテナ
Snap での Docker のインストール
パッケージマネジャーの Snap からインストールします。
なぜ Docker Snap か
率直に言えばちょっと楽そうかな?と軽い気持ちでやってみました。
- apt リポジトリーの追加がいらない
- docker-compose が一緒にインストールされる
- 複数バージョンの使い分けが割と簡単そう
Snap のパッケージは複数のバージョンをインストールして使い分けることが前提として組み込まれています。
インストール
Docker Snap のインストールガイドを参考にしました。
以降、Snap はインストール済みのものとして進めます。Docker Snap のインストール
Snap でインストールします。
$ sudo snap install docker
インストール自体は問題なく終了しました。
$ docker --version
Docker version 19.03.11, build dd360c7
Docker Snap のインストールであわせて、docker-compose と docker-machine などもインストールされています。
$ ls -l /snap/bin/docker*
lrwxrwxrwx 1 root root 13 11月 16 14:54 /snap/bin/docker -> /usr/bin/snap
lrwxrwxrwx 1 root root 14 11月 16 14:54 /snap/bin/docker-compose -> docker.compose
lrwxrwxrwx 1 root root 14 11月 16 14:54 /snap/bin/docker-machine -> docker.machine
lrwxrwxrwx 1 root root 13 11月 16 14:54 /snap/bin/docker.compose -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 11月 16 14:54 /snap/bin/docker.help -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 11月 16 14:54 /snap/bin/docker.machine -> /usr/bin/snap
sudoers の PATH に追記
インストールが終わりましたので、hello-world で確認します。
$ sudo docker run hello-world
sudo: docker: コマンドが見つかりません
Snap でインストールしたパッケージは sudo のパスに通っていませんでした。
sudoers の PATH へ Snap のディレクトリーを追加しました。
詳しい手順は以下に。
グループの追加
sudo のパスを通しましたが、docker を一般ユーザーで実行するためにグループを追加します。
$ sudo addgroup --system docker
$ sudo adduser $USER docker
$ newgrp docker
$ sudo snap disable docker
$ sudo snap enable docker
インストール前にグループを追加しておけば最後の2行のコマンドは不要でした。
storage-driver の変更
一般ユーザーで実行出来るようになったのでもう一度 hello-world を。
$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
エラーになりました。
docker daemon が動いていなかったので、snap logs
でエラーを確認します。
$ sudo snap logs docker.dockerd
2020-11-16T05:55:55Z docker.dockerd[6040]: time="2020-11-16T14:55:55.809599171+09:00" level=error msg="failed to mount overlay: no such device" storage-driver=overlay2
(snip)
ストレージドライバーに関するエラーのようです。
検索したところ、docker を動かす環境の rootfs にあったストレージドライバーを使うようにとありました。
ということで、Crostini の Debian コンテナのファイルシステムを確認します。
$ df -T
ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置
/dev/vdb btrfs 41457440 4031344 35478832 11% /
(snip)
rootfs は btrfs となっていますね。
btrfs にあったストレージドライバを検索したところ、ファイルシステムと同名で btrfs でした。
Docker Snap の場合は docker daemon の設定は /var/snap/docker/current/config/daemon.json
に記述します。
変更前のストレージドライバの設定を確認すると、overlay2
となっていました。エラーメッセージに表示されていたストレージドライバーです。
{
"log-level": "error",
"storage-driver": "overlay2"
}
ストレージドライバーを btrfs
に変更します。
{
"log-level": "error",
"storage-driver": "btrfs"
}
設定を変更しましたので、 docker daemon を再起動して、もう一度 hello-world を試します。
$ sudo snap restart docker.dockerd
$ docker run hello-world
(snip)
Hello from Docker!
This message shows that your installation appears to be working correctly.
(snip)
ようやく Hello, world! までたどり着きました。
公式リポジトリーからインストールした場合
ちなみに公式リポジトリーから apt でインストールした場合、ストレージドライバーは自動で btrfs となっていて特に追加の設定は必要ありませんでした。
$ sudo docker info
(snip)
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 19.03.13
Storage Driver: btrfs
Build Version: Btrfs v4.20.1
Library Version: 102
(snip)
結びに
公式リポジトリーからの apt でのインストールはガイド通りで特に問題ありませんでしたので、ちょっとの手間を惜しんでかえって手間がかかった結果となりました。
ただ、かかった手間も Docker Snap のパッケージングの問題で Chrome OS 固有の問題が原因では無かったというのはコンテナという技術の優れた点を実感させてくれます。
正直 Crostini の Debian コンテナの中の話では Chrome OS がほとんど関係無くてタイトル詐欺な気がしてくるほどです。
Docker のストレージドライバーと Chrome OS のファイルシステムについて知る機会にもなりました。
これからやること
Docker をインストールしたとはいえ、Chromebook なのであまり大掛かりなことはしませんが、Chromebook + Docker Snap で特筆することがあれば記録を残そうと思います。
Snap については積極的に使っていくべきかまだ判断がつきません。もう少し色々使ってみます。
Discussion