⚙️

Chromebook + Docker Snap

2020/11/18に公開

Chromebook に Docker をインストールします。
Snap でさらっとインストールできるのかな?と思ったらしっかりトラブルがあったので、記録を残します。

この記事の前提

Snap での Docker のインストール

パッケージマネジャーの Snap からインストールします。

なぜ Docker Snap か

率直に言えばちょっと楽そうかな?と軽い気持ちでやってみました。

  1. apt リポジトリーの追加がいらない
  2. docker-compose が一緒にインストールされる
  3. 複数バージョンの使い分けが割と簡単そう
    Snap のパッケージは複数のバージョンをインストールして使い分けることが前提として組み込まれています。

インストール

Docker Snap のインストールガイドを参考にしました。
https://github.com/docker-snap/docker-snap#installation
以降、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 1116 14:54 /snap/bin/docker -> /usr/bin/snap
lrwxrwxrwx 1 root root 14 1116 14:54 /snap/bin/docker-compose -> docker.compose
lrwxrwxrwx 1 root root 14 1116 14:54 /snap/bin/docker-machine -> docker.machine
lrwxrwxrwx 1 root root 13 1116 14:54 /snap/bin/docker.compose -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 1116 14:54 /snap/bin/docker.help -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 1116 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 のディレクトリーを追加しました。
詳しい手順は以下に。
https://zenn.dev/igac/articles/6dbc0600edf10e98f8e5

グループの追加

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 にあったストレージドライバーを使うようにとありました。
https://forum.snapcraft.io/t/docker-snap-failed-to-mount-overlay-and-where-to-report-bugs/20010/
ということで、Crostini の Debian コンテナのファイルシステムを確認します。

$ df -T
ファイルシス   タイプ   1K-ブロック    使用   使用可 使用% マウント位置
/dev/vdb       btrfs       41457440 4031344 35478832   11% /
(snip)

rootfs は btrfs となっていますね。
btrfs にあったストレージドライバを検索したところ、ファイルシステムと同名で btrfs でした。
https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7
Docker Snap の場合は docker daemon の設定は /var/snap/docker/current/config/daemon.json に記述します。
変更前のストレージドライバの設定を確認すると、overlay2 となっていました。エラーメッセージに表示されていたストレージドライバーです。

/var/snap/docker/current/config/daemon.json
{
    "log-level":        "error",
    "storage-driver":   "overlay2"
}

ストレージドライバーを btrfs に変更します。

/var/snap/docker/current/config/daemon.json
{
    "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