Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

ラズパイでもDocker使っています? 私も数年前にDockerに触れてからというもの、環境構築の面倒臭さを気にしないようになりました。

今回、Dockerのcompose.yamlを3つ書いた環境の仕組みのうち、1つだけ別のマシンに移設しようと思い移動させてみました。

Dockerのcompose.yamlは-fオプションで別々に実行できて、共存できるんですよね。それほど詳しいわけではありません。でも、ずっと1つのcompose.yamlで四苦八苦していたのは何だったのだろう。

環境は様々なので、あくまで一例に過ぎません。Dockerで構築している何かを真っ新なラズパイの環境へ移設してみたときの注意点を備忘録で残しておきます。

ザックリとした移行手順の理解

ラズパイ自体を変更しても、同じIPアドレスで実行したいということと、置き換えたいから既存のラズパイは電源をシャットダウンします。

新しいラズパイはOSこそ同じbookwormでも最新に更新してあります。あっ、どちらもPi 4です。

Dockerを動かしていただけですから、Raspberry Pi OS Liteでデスクトップはありません。

Dockerで動作していたサーバアプリは、ローカルのIPアドレスに影響を受ける設定だったので、ラズパイで予めIPアドレスを固定化しました。bookwormなのでnmcliコマンドです。

Dockerのコンテナを移設する以外に、バインドマウントしているローカルに書き出してた分も移設しないとなりません。これらを全く同じ構成にして配置することが前提です。

本来はディレクトリの権限や所有権も合わせないとなりません。しかし、ユーザー名も同じにしたことや、Dockerしかインストールしていない環境だったので、明示的に権限付与しなくても大丈夫でした。環境によっては合わせます。

イメージ化する

Dockerのコンテナをコピーする前に、ややこしい名前を定義しておきます。

my_docker_container = 移設したいコンテナ名(調べます)
my_docker_image = イメージとして書き出す名前(.tar拡張子を除いた名前と同名)
/home/username/dir_name = 別のマシンへコピーした場所

コンテナの名前はlsコマンドで調べておきます。

docker container ls

早速、Dockerで動いているコンテナを圧縮して1つのイメージファイルに書き出します。

docker commit my_docker_container my_docker_image

comitしてからsaveコマンドでtarへ。

docker save my_docker_image > my_docker_image.tar

構成ディレクトリもイメージ圧縮化

次に、Dockerからバインドマウントしているexampleというディレクトリを下層も含めtar圧縮します。

tar zcvf example-dir.tar.bz2 ./example

コピーするファイル

出来上がったイメージファイル、ディレクトリの圧縮ファイル、そしてcompose.yamlの3つを新しいマシンにコピーする準備ができました。

  • my_docker_image.tar
  • example-dir.tar.bz2
  • compose.yaml

GUIがないOS Liteなので、scpコマンドでコピーしました。

scp raspida@192.168.1.120:~/compose.yaml .

macOSなので、Mac側から取り出しに行く書式です。ラズパイ側からだとmacOSのパスが面倒なのでいつもそうしています。一旦、メインマシンのMacに取り出し、あとでまた新しいラズパイにSCP転送します。

■Pi 5は8GBモデルがオススメ

新たなマシン上に展開し配置する

新しいラズパイ(Pi 4)は、Dockerをインストール済みです。groupsにユーザーを登録もしています。インストールスクリプトで実現できます。以下の通り。

ディレクトリの展開

バインドマウントしているディレクトリを展開します。

tar zxvf example-dir.tar.bz2

compose.yamlの配置

compose.yamlはコピーしただけです。適切な場所に配置します。展開したディレクトリと同階層ですね。

イメージをロードしてコンテナを作成

同じ場所にコピーしたコンテナイメージをロードしてからコンテナを作成することで元と同じにします。

sudo docker load < my_docker_image.tar

ロードした後、docker runコマンドでコンテナを作成します。

-itオプションに-dを付けた-itdだとバックグラウンドで実行になり、ターミナルに出力しません。またsudoを付けないとパーミションエラーになるならsudo を付けます。

docker run --name コンテナ名 --mount type=bind,source=/home/raspida/docker_dir/example,target=/mnt -it my_docker_image /bin/bash

気を付けたいのはコンテナ名であるラベルです。

compose.yamlにも記述していれば、元の名前から変更しておきましょう。同名だと衝突するとエラーになります。

今回はコンテナ名は新たに設定し直しました。

....(前略)#compose.yamlに書いたコンテナ名
    container_name: example
....(後略)

docker composeコマンド

compose.yamlはコンテナ名の変更以外は元のままです。同じようにcompose upコマンドでも立ち上がります。

docker compose up -d

(docker compose -f example.yaml up -d)

新しい環境のラズパイで動作

コンテナを別のマシンへ移動することが無事にできました。

Pi 4からPi 4で意味もないように感じるかもしれません。収めているエンクロージャーケースや、別の2つのサーバアプリを止めたかったため、シンプルなPi 4へ移設したというわけです。

環境を同じにすれば、これまで使っていたコンテナもそのまま使えるのは何とも不思議です。イチから再構築しなくても済むのも楽です。

Dockerは奥が深いけど、非エンジニアの私でもやりたいことは出来ているのでエンジニアさんからみれば簡単なんでしょうか。

昔にラズパイでサーバとしての環境構築していたことを考えると、サクッと構築できてサクッと削除してやり直すなど重宝しています。一切、ラズパイの環境は汚れませんし、何よりも依存関係の解消に悩まなくても済みます。

別のラズパイへコンテナを移動できたのも驚きました。終わってみると簡単でした。ケースバイケースで参考にしてください。