先日 Raspberry Pi 4 に M.2 SATA を追加してストレージの問題も解決しました。
ストレージに余裕ができたので RaspberryPi 4 の能力を最大限に使うために Docker 環境を構築してみました。
Table of Contents
RasbianOS の 64 bit化
すでに M.2 SATA を搭載したときに RasbianOS を 64bit カーネルで動作するように設定しています。
1 2 3 4 5 | $ sudo vi /boot/config.txt [all] arm_64bit=1 |
config.txt で arm_64bit の設定を追加したら、以下のコマンドで RaspberryPi のファームウェアをアップデートします。
1 2 3 | $ sudo rpi-update $ sudo reboot |
アップデートが完了したら、再起動して 64bit カーネルを有効にします。
これで RasbianOS が 64bit で動作するようになりました。
設定後の環境は、次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | pi@raspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 11 (bullseye) Release: 11 Codename: bullseye pi@raspberrypi:~ $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)" NAME="Raspbian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" pi@raspberrypi:~ $ uname -a Linux raspberrypi 5.10.82-v8+ #1493 SMP PREEMPT Wed Dec 1 11:40:12 GMT 2021 aarch64 GNU/Linux |
Docker Engine 環境の構築
64bit 化ができたら、 Docker 環境を構築していきます。
Docker Engine のインストール
多くのディストリビューションでは、yum,apt,dnfなどのパッケージ管理からインストールしますが、RasbianOSでは 別の方法でインストールします。
1 2 3 | $ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh |
pi ユーサーに Docker 実行権限の付与
Docker Engine のインストールが完了したら、 pi ユーザーで docker の管理ができるように権限を追加します。
1 2 | $ sudo usermod -aG docker pi |
これで pi ユーザーで、docker コマンドの実行ができるようになりました。
1 2 3 | pi@raspberrypi:~ $ docker -v Docker version 20.10.11, build dea9396 |
docker のインストールは完了しましたが、今後のアップデートで docker のバージョンが変わってしまうと環境違いの問題なども発生するので、アップデートから除外しておきます。
1 2 3 4 | pi@raspberrypi:~ $ sudo apt-mark hold docker-ce docker-ce-cli docker-ce はすでに保留に設定されました。 docker-ce-cli はすでに保留に設定されました。 |
イメージとコンテナの保存場所の変更
Docker イメージとコンテナは増えていきますので、ローカルの microSDではなく、拡張した M.2 SATA に保存するように設定を変更します。
RasbianOS ではプロセスの管理で systemd を使用しますので、 systemd の設定ファイルを変更します。
1 2 | $ sudo vi /lib/systemd/system/docker.service |
docker.service ファイルを開いたら ExecStart のパラメータに -g [path] を追加します。
今回は M.2 SATA でマウントした /mnt/opt01 以下を指定しています。
1 2 | ExecStart=/usr/bin/dockerd -H fd:// -g /mnt/opt01/docker --containerd=/run/containerd/containerd.sock |
ここまでの設定が完了したら systemd の設定を再読込して docker を再起動します。
1 2 3 | $ sudo systemctl daemon-reload $ sudo systemctl restart docker.service |
docker の動作確認
以下のコマンドを実行して docker の最初の動作確認(Hello World)をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | pi@raspberrypi:~ $ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9b157615502d: Pull complete Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm32v7) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ |
Docker の基本的なコマンド
この記事を読んでいる人は、 docker を使いこなしている方が多いと思いますが、念のため docker コマンドの基本的な利用方法を記載しておきます。
コンテナの一覧は docker ps -a を使用します。
1 2 3 4 | pi@raspberrypi:~ $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee89203aed18 cpuminer-multi "./cpuminer -a lyra2…" 2 days ago Exited (0) 2 days ago mona |
コンテナの状況を確認したら、以下のコマンドで コンテナを管理できます。
コマンド | 内容 |
---|---|
docker ps | 起動しているコンテナを表示 |
docker ps -a | 起動・停止しているコンテナ すべてを表示 |
docker run [名前] | docker pull, create, start を実行 |
docker pull [名前] | コンテナイメージを取得 |
docker create -it [名前] | イメージからコンテナを作成 |
docker container ls -a | コンテナの一覧を表示 |
docker start [コンテナID] | コンテナの起動 |
docker stop [コンテナID] | コンテナの停止 |
docker restart [コンテナID] | コンテナの再起動 |
docker rm [コンテナID] | コンテナの削除 |
docker-compose のインストール
これで Docker Engine が利用できるようになりましたが、 Docker の管理を簡単にするために docker-compose をインストールします。
1 2 3 4 5 | $ sudo pip3 install docker-compose pi@raspberrypi:~ $ docker-compose -v docker-compose version 1.29.2, build unknown |
docker-compose も docker 同様に、バージョンを固定するためにアップデートの対象から外します。
1 2 3 | pi@raspberrypi:~ $ sudo apt-mark hold docker-compose docker-compose は保留に設定されました。 |
docker-compose で nginx,postgresql のコンテナ利用
docker の基本が確認できたので docker-compose で nginx,postgresql の動作を確認します。
準備
docker-compose で docker を管理するために作業ディレクトリを作成します。
1 2 3 | $ mkdir -p ~/src/lamp-nginx $ cd ~/src/lamp-nginx |
docker-compose.yaml 作成と起動
作業ディレクトリに移動したら docker-compose で指定する docker-compose.yaml を作成してコンテナを起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ vi docker-compose.yaml version: '3' services: db: image: postgres:latest environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password ports: - 5432:5432 web: image: nginx:latest ports: - 8080:80 |
docker-compose.yaml を作成したら docker-compose で nginx と PostgreSQL のコンテナを起動します。
1 2 3 4 5 | pi@raspberrypi:~/workspace/lamp-nginx $ docker-compose up -d Creating network "lamp-nginx_default" with the default driver Creating lamp-nginx_db_1 ... done Creating lamp-nginx_web_1 ... done |
これで nginx と PostgreSQL のコンテナが起動しました。
1 2 3 4 5 | pi@raspberrypi:~/workspace/lamp-nginx $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5ae59e9d52 nginx:latest "/docker-entrypoint.…" 53 seconds ago Up 51 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp lamp-nginx_web_1 965a92ef736d postgres:latest "docker-entrypoint.s…" 53 seconds ago Up 51 seconds 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp lamp-nginx_db_1 |
docker-compose コンテナの停止
使わないコンテナは docker-compose.yaml のディレクトリで、以下のコマンドを実行することで、すべて停止することができます。
1 2 | $ docker-compose down |
これで RaspberryPi 4 で、docker を使う環境が整いました。