最近、Docker
を使用するようになってPCの側でアプリ(特にサーバー系)をインストールしたりセットアップするのが億劫になってきました。私用で使っているRaspberryPi
に関しても同様なのですが流石に1GBメモリのRaspberryPi
でDocker
を使用するのはちょっと無謀かなと思ってもいます。ちょうど2GBメモリのRaspberryPi4
があるので、そちらにDocker
を使った場合、どの程度使用に耐えるのか、コンテナを起動した際にどの程度メモリ消費量あるの調べてみようと思います。あくまでもヘビーユースではなく、ホビーユースという側面で見ていただければと思います。
使用した環境
使用したは以下のような環境です。
- RaspberryPi → RaspberryPi 4B(メモリ2G モデル…このあたりがギリギリかな)
- OS →
RaspberryPi OS Lite bullseyeベース(64bit)
- ブート → SDカード
としています。今回は新規にインストールを行って余計なノイズが入らないようにしています。また、X Window System
を使用するのが持ったいないのでLite版
を使用しています。
SDカードから起動後にOSの状態を確認しました。(lsb_releaseコマンド
とunameコマンド
を使用)
また、起動直後のメモリの空き状態は以下のようになっています。表示の単位はメガバイト(-mオプション)にしています。
初期状態では1.7GBほどの空きメモリがあるようです。
Dockerのインストール
実はすでにDocker
は公式にRaspberryPi対応
しています。以下のリンクにdebianベース
のLinux
でのインストールについての記載があります。
対応しているOS(debianベース)
- Debian Bullseye 11 (stable)
- Debian Buster 10 (oldstable)
- Raspbian Bullseye 11 (stable) ←今回はこちらを使用
- Raspbian Buster 10 (oldstable)
さらに以下の記載があります。
In testing and development environments, some users choose to use automated convenience scripts to install Docker. This is currently the only approach for Raspbian.
テストや開発環境では、自動化された便利なスクリプトを使ってDockerをインストールすることを選択するユーザーもいます。現在、Raspbianではこの方法が唯一の方法です。(DeepLによる翻訳)
RaspberryPi OS
(当時はRaspbian
だったようです)ではconvenience script
というものがあり、それを使用してインストールするのが唯一の方法とのことでした。
改めてインストールを以下のように行います。curlコマンド
でconvenience script
をローカルにダウンロードして、スクリプトの実行を行えば、インストールできるようです。
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh
インストールログ
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh # Executing docker install script, commit: 3255aa3919e7281693f62855b9d543bb50f04957 + sh -c apt-get update -qq >/dev/null + sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null + sh -c mkdir -p /etc/apt/keyrings && chmod -R 0755 /etc/apt/keyrings + sh -c curl -fsSL "https://download.docker.com/linux/debian/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg + sh -c chmod a+r /etc/apt/keyrings/docker.gpg + sh -c echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable" > /etc/apt/sources.list.d/docker.list + sh -c apt-get update -qq >/dev/null + sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null + version_gte 20.10 + [ -z ] + return 0 + sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce-rootless-extras >/dev/null + sh -c docker version Client: Docker Engine - Community Version: 20.10.16 API version: 1.41 Go version: go1.17.10 Git commit: aa7e414 Built: Thu May 12 09:15:56 2022 OS/Arch: linux/arm64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.16 API version: 1.41 (minimum version 1.12) Go version: go1.17.10 Git commit: f756502 Built: Thu May 12 09:14:19 2022 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.6.4 GitCommit: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16 runc: Version: 1.1.1 GitCommit: v1.1.1-0-g52de29d docker-init: Version: 0.19.0 GitCommit: de40ad0 ================================================================================ To run Docker as a non-privileged user, consider setting up the Docker daemon in rootless mode for your user: dockerd-rootless-setuptool.sh install Visit https://docs.docker.com/go/rootless/ to learn about rootless mode. To run the Docker daemon as a fully privileged service, but granting non-root users access, refer to https://docs.docker.com/go/daemon-access/ WARNING: Access to the remote API on a privileged Docker daemon is equivalent to root access on the host. Refer to the 'Docker daemon attack surface' documentation for details: https://docs.docker.com/go/attack-surface/ ================================================================================
インストールしたDocker
はrootユーザー
またはdockerグループに所属しているユーザー
のどちらかでしか実行できないようです。
毎回sudo
をつけての実行は現実的ではないので、ユーザーをdockerグループ
に所属させます。
実行例
sudo usermod -aG docker 【ユーザー名】
今回はpiユーザ
で使用していたので以下のように実行しています。
$ sudo usermod -aG docker pi
コマンド実行後にログアウト-再ログインすれば、対象ユーザーがdockerコマンド
を実行することが可能になります。
Dockerを起動させてみる
再ログインすれば使用できるのでまずはDockerのバージョンを確認してみます。
$ docker -v
問題なく動作しているようです。
では、テスト用に使用するhello-worldコンテナ
を起動してみます。
$ docker run hello-world
ちゃんとコンテナイメージをpull
して、実行を行ってくれました。
また、systemctrl
に関してもenable
化され、自動起動を行っていました。
Nginx コンテナで動作確認してみる
では、続いては少し実用的なコンテナということでWebサーバである、Nginxコンテナ
の動作を確認をしてみます。以下の様に実行してNginxコンテナ
を起動させます。起動オプションに-pスイッチ
をつけて、RaspberryPi
以外のPCのブラウザから、ホスト側(今回はRaspberryPi
)の8080ポート
にアクセスするとコンテナ側の80ポート
にアクセスしてnginx
にアクセスが行われます。
$ docker run --name my-nginx -d -p 8080:80 nginx
起動ログ
実行状態
http://raspberrypi.local:8080/へアクセスすると…問題なくnginx
の初期画面が表示されています。
コンテナ起動後にメモリの消費量を見てみると
表示のavailable
の項目が初期状態から70MBほど減っていますがこれぐらいならまだまだ余裕ですね。これなら、もう1~2つぐらいはコンテナを立ち上げる事ができそうです。
おわりに
今回はRaspberryPi
にDocker
をインストールしてみて、導入や環境設定の容易さに加えて、メモリの消費がどの程度かということで確認をしてみました。実際にはWebサーバやデータベースなどの起動を行うなどもできそうだなという印象でした。ただ、大量のデータ含まれたデータベースなどを扱うほどのメモリは搭載していませんが、MySQL
やPostgreSQL
といったメジャーなRDBSを使用することも容易だと思います。問題としてはデータベースの永続性がDocker
では担保を考える必要が有るという点でしょうか。こちらに関しても後日方法を調べたいなと思います。
1GBのメモリではちょっと心許ないのでしょうけど、2GBのメモリがあればアクセス数の少ないサーバの起動は支障はなさそうです。