RaspberryPiでコンテナを始める
~Docker編~
こんにちは、サイオステクノロジーのエンジニア 中島です。
昨今では、開発環境や運用でコンテナを使用することにより、インストールの簡略化やバージョン違いによるアプリケーション動作による不具合が少なく行えるようになってきました。
ただし、コンテナは仮想技術のためそのままの環境で動かすより、CPU、メモリ、ディスクといったリソースを多く使用します。このことより、低スペックの環境では動かすには難しいかったですが、昨今の低スペック環境でもそれなりに性能がある動作環境を作れるようになりました。
この性能アップはARMアーキテクチャでも恩恵を受けており、コンテナを動作させることに満足するスペックになりました。
このことより、去年(2022年)の9月ぐらいでは入手しやすかったシングルボードコンピュータのRaspberryPiでDockerを使用してコンテナを始めてみます。
Raspberry Piのアーキテクチャ
まずは、RaspberryPiはイギリスのラズベリーパイ財団によって開発されたARMアーキテクチャのシングルボードコンピュータです。
ARMアーキテクチャはIntelのIntel Coreシリーズによるx86-64アーキテクチャとは異なる思想で作られたアーキテクチャのため、x86-64向けのプログラムはARM向けにビルドしなおさないと動作しません。
Raspberry Piでコンテナを動かす際には、ARM向けにビルドされたコンテナが必要になります。
また、Raspberry Pi向けOSには32bitと64bitがあるため本記事は、64bit向けのOSを使用して構築する方法を説明します。
なお、本記事記載の内容は、Raspberry Pi3 B+で動作を確認しています。
Dockerインストール
Raspberry Pi OSでDockerをインストールするには、非常に簡単で以下のコマンドを実行することでインストールできます。
sudo apt install docker.io
インストール後以下のコマンドで、現在使用中のユーザでdockerコマンドが実行可能になります。
sudo usermod -aG docker $USER sudo reboot
Nginxを動かしてみる
Dockerでサービスを立ち上げるテストして、Docker Hub上にアップロードされたNginxの公式イメージを動かしてみます。DockerHub上にあるRaspberryPiで動作するコンテナはarm 64bit(linux/arm64/v8)用と、32bit(linux/arm/v7)用の二種類があり、コンテナイメージを直接指定しない場合は、RaspberryPi OSによって正しいイメージがダウンロードされ動作します。
64bit用(v8アーキテクチャ)を動かす
64bitのRaspberry Pi OSを使用している際に、以下のコマンドを実行する。
docker run -d –name=nginx -p 8080:80 nginx
以上のコマンド64bit arm向けOSで実行するとdockerhub上のnginx公式イメージからlatestタグを指定し、linux/arm64/v8のイメージを選択してpullし実行されます。
nginxコンテナが動作しており、8080ポートの開放を問題なく動作ことの確認は以下のコマンドを実行することで確認できます。
curl localhost:8080
なお、停止と実行途中のイメージ削除をする場合は以下のコマンドで行ってください。
docker stop nginx docker rm nginx
余談となりますが、32bit OSで64bit用のコンテナを実行すると以下の結果の通り、エラーが発生してコンテナが停止します。
$ docker run --rm --name=nginx -p 8080:80 nginx@sha256:50ab7908620ee92646ddcd9fe321f969cdff672819fd9c8427448f67f59ef32e standard_init_linux.go:207: exec user process caused "exec format error"
32bit用(v7アーキテクチャ)を動かす
64bit OSでlinux/arm/v7アーキテクチャ用のnginxを指定する場合は、以下の通りDockerhubのnginx公式イメージに記載してあるsha256の値を指定する必要があります。また、実行する場合は以下の通りコマンドを入力します。
docker run -d –name=nginx32 -p 8080:80 nginx@sha256:35205a452d69641a68fec5ff671b47d0c9d000877c8a9f4524f559f18fba1c9a
コンテナの実行後、64bit用Nginxコンテナと同じようにcurlコマンドで動作確認すれば同じような結果が得られます。
余談となりますが、32bit用のコンテナは 64bit、32bit両方のOSで動作します。
DockerComposeを使用してNextCloudを構築
Dockerを使用するうえで、DockerComposeと呼ばれるコードからDockerを使用するための機能がありますので、これを使用してNextCloudを構築してみます。
まず、以下のコマンドで、DockerComposeをインストールします。
sudo apt install docker-compose -y
つぎに、Raspberry PiでNextCloudを動かすために以下コマンドでフォルダを作成してそのフォルダを作業フォルダとします。
mkdir nextcloud cd nextcloud
次に、以下の内容でdocker-compose.ymlファイルを作成します。
version: '3.1' volumes: nextcloud: db: services: db: image: mariadb command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed ports: - 3306:3306 volumes: - db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root # 適当なパスワードを設定 - MYSQL_PASSWORD=root # 適当なパスワードを設定 - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud nextcloud: image: nextcloud ports: - 8080:80 volumes: - nextcloud:/var/www/html environment: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=root - MYSQL_HOST=db
最後に、以下のコマンドでNextCloudに必要なコンテナを以下のコマンドで立ち上げます。
docke-compose up -d
実行後、ブラウザでhttp://IP:8080にアクセスすると以下の通り、管理ユーザの登録サイトが表示されます。
まとめ
今回は、DockerをRaspberryPiと呼ばれるシングルボードコンピュータで動かすことができました。このようにARM環境に対応したコンテナがあるため、一般的なPC同じようにサービスを立ち上げることは不可能ではないことを確認できました。
本記事では、Dockerについて、説明し確認しました。次回はPodmanについて同じように動作することを確認いたします。