RaspberryPiでもDockerしたい!

最近、Dockerを使用するようになってPCの側でアプリ(特にサーバー系)をインストールしたりセットアップするのが億劫になってきました。私用で使っているRaspberryPiに関しても同様なのですが流石に1GBメモリのRaspberryPiDockerを使用するのはちょっと無謀かなと思ってもいます。ちょうど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でのインストールについての記載があります。

docs.docker.com

対応している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/

================================================================================

インストールしたDockerrootユーザーまたは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つぐらいはコンテナを立ち上げる事ができそうです。

おわりに

今回はRaspberryPiDockerをインストールしてみて、導入や環境設定の容易さに加えて、メモリの消費がどの程度かということで確認をしてみました。実際にはWebサーバやデータベースなどの起動を行うなどもできそうだなという印象でした。ただ、大量のデータ含まれたデータベースなどを扱うほどのメモリは搭載していませんが、MySQLPostgreSQLといったメジャーなRDBSを使用することも容易だと思います。問題としてはデータベースの永続性がDockerでは担保を考える必要が有るという点でしょうか。こちらに関しても後日方法を調べたいなと思います。

1GBのメモリではちょっと心許ないのでしょうけど、2GBのメモリがあればアクセス数の少ないサーバの起動は支障はなさそうです。

/* -----codeの行番号----- */