はじめに
手軽で軽量なChromebookは開発用サブ機として優秀ですが、最大のネックとなるのが「内蔵ストレージの少なさ」です。筆者のChromebookもストレージが128GBしかなく、Linux環境(Crostini)でDockerを使い始めると、イメージやコンテナのデータですぐに容量が逼迫してしまう問題に直面しました。
そこで、外部ストレージ(USBメモリやSDカード)にDockerのリソースをすべて逃がし、本体のストレージを一切消費せずにDocker開発環境を構築する方法をまとめました。
ChromeOS特有の罠
単純にDockerの保存先(data-root)を外部ストレージに変更すれば済む話かと思いきや、ChromeOS特有の仕様が壁になります。
ChromeOSからLinuxへ共有された外部ストレージは特殊なファイルシステムでマウントされるため、Dockerの標準ストレージドライバ(overlay2)が直接動作しません。
本記事では、外部ストレージ内に「ext4形式の仮想ディスク」を作成し、それをLinux内でループマウントすることでこの制限を回避する手法を解説します。
前提条件
- OS: ChromeOS (Linux開発環境を有効化済み / Debianベース)
- 外部ストレージ: USBドライブやSDカード(本記事では MyUSB という名前のUSBドライブを使用)
- ChromeOSの「ファイル」アプリから、該当の外部ストレージを右クリックし「Linux と共有」を設定しておくこと。
※環境によって共有パスが /mnt/chromeos/removable/ になる場合と /mnt/shared/removable/ になる場合があります。事前に ls コマンド等でご自身のパスを確認してください。本記事では /mnt/shared/removable/MyUSB/ として進めます。
構築手順
1. Dockerのインストール
まずはLinux環境にDockerをインストールします。
sudo apt update
sudo apt install -y docker.io
2. 仮想ディスクの作成とフォーマット
外部ストレージ上に、Dockerデータを保存するための仮想ディスク(イメージファイル)を作成します。ここでは例として20GBの容量を確保します。
# 20GBの空ファイルを作成(完了まで数分〜数十分かかります)
dd if=/dev/zero of=/mnt/shared/removable/MyUSB/docker-data.img bs=1M count=20480
# 作成したファイルをext4形式でフォーマット
sudo mkfs.ext4 /mnt/shared/removable/MyUSB/docker-data.img
※ mkfs.ext4: command not found と出る場合、一般ユーザーのPATHに /sbin が含まれていないことが原因です。上記のように sudo を付けて実行してください。
3. マウントとDockerの設定変更
作成した仮想ディスクをマウントし、Dockerのデータ保存先(data-root)をそこへ向ける設定を行います。
# マウント用ディレクトリを作成
sudo mkdir -p /var/lib/docker_ext
# 仮想ディスクをマウント
sudo mount -o loop /mnt/shared/removable/MyUSB/docker-data.img /var/lib/docker_ext
# Dockerの設定ファイルを作成(エディタを使わずコマンドで直接書き込みます)
sudo mkdir -p /etc/docker
echo -e '{\n "data-root": "/var/lib/docker_ext"\n}' | sudo tee /etc/docker/daemon.json
# Dockerを再起動して設定を反映
sudo systemctl restart docker
設定が正しく反映されたか確認します。
sudo docker info | grep "Docker Root Dir"
出力結果が Docker Root Dir: /var/lib/docker_ext になっていれば成功です。
4. 一般ユーザーへの権限付与
毎回 sudo を付けてDockerコマンドを叩くのは手間なので、現在のユーザーをdockerグループに追加します。
sudo usermod -aG docker $USER
※設定を反映させるには、一度ターミナルを再起動するか newgrp docker を実行してください。
運用を楽にする:起動自動化スクリプト
ChromeOSやLinux環境を再起動すると、外部ストレージのマウントが解除されてしまいます。そのため、起動時にワンコマンドでマウントとDockerの起動を行えるスクリプトを作っておくのがおすすめです。
ホームディレクトリに start-docker.sh を作成します。
cat << 'EOF' > ~/start-docker.sh
#!/bin/bash
IMAGE_PATH="/mnt/shared/removable/MyUSB/docker-data.img"
MOUNT_POINT="/var/lib/docker_ext"
if ! mountpoint -q "$MOUNT_POINT"; then
echo "仮想ディスクをマウントしています..."
sudo mount -o loop "$IMAGE_PATH" "$MOUNT_POINT"
else
echo "すでにマウントされています。"
fi
echo "Dockerを起動しています..."
sudo systemctl restart docker
echo "完了しました。"
EOF
# 実行権限を付与
chmod +x ~/start-docker.sh
今後は、Linuxを起動した直後に ./start-docker.sh を実行するだけで、すぐにDocker環境が使えるようになります。
おまけ:後から容量を拡張する方法(20GB → 40GB)
開発を進めるうちに20GBでは足りなくなった場合でも、既存のデータを消すことなく後から容量を拡張(リサイズ)することが可能です。
以下の手順で、既存の仮想ディスクに容量を継ぎ足し、ファイルシステムを拡張します。
# 1. Dockerを停止し、マウントを解除
sudo systemctl stop docker
sudo umount /var/lib/docker_ext
# 2. 後ろに20GB分の空データを追記(※ >> を使用すること。> だと上書きされデータが消えます)
dd if=/dev/zero bs=1M count=20480 >> /mnt/shared/removable/MyUSB/docker-data.img
# 3. ファイルシステムのチェックと拡張
sudo e2fsck -f /mnt/shared/removable/MyUSB/docker-data.img
sudo resize2fs /mnt/shared/removable/MyUSB/docker-data.img
# 4. 再マウントして容量を確認
~/start-docker.sh
df -h /var/lib/docker_ext
まとめ
Chromebookの限られたストレージでも、外部ストレージと仮想ディスクを活用することで、容量を気にせず本格的なDocker開発環境を構築できます。ChromeOSでの開発でストレージ不足に悩んでいる方はぜひ試してみてください。