1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Chromebookの容量不足を解消!外部ストレージ(USB/SD)にDocker環境を構築する方法

1
Posted at

はじめに

手軽で軽量な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での開発でストレージ不足に悩んでいる方はぜひ試してみてください。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?