RasberryPi と遊ぼう〜DBMS導入〜

Dockerをインストールして、Docker上でMySQLを動かす

RasberryPi上にDBMSを作って、PythonでDBを使いたかったので、DockerをインストールしてMySQLのサーバーを構築します。

Dockerのインストール

Docker公式インストールスクリプトを使用して、Dockerをインストールします。


$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh

Dockerのバージョンを確認します。

$ docker --version $ Docker version 28.4.0, build d8eb465

ちゃんとインストールされていることを確認できました。

Dockerを、sudoコマンドを使わずに一般ユーザーで実行できるようにします。
※$USER は現在のログインユーザーを表します。

$ sudo usermod -aG docker $USER

Dockerの動作確認を行います。

$ docker run hello-world 〜省略〜 Hello from Docker! This message shows that your installation appears to be working correctly.

sudoコマンドを使わなくてもDockerを実行できることを確認できました。

ついでにDocker用のディレクトリを作っておきます。

$ mkdir myDocker

MySQLサーバーを構築

MySQLのイメージをダウンロードします。
私の?RasberryPiはCPUにarm64が使用されていますが、arm64は公式のMySQLのイメージがそのまま使用できるとのことなので、イメージをダウンロードします。

イメージをダウンロードしてバックグラウンドで起動します。
このコマンドではデータがコンテナごとに作成されます。

docker run -d \ --name mysql-rpi \ -e MYSQL_ROOT_PASSWORD=パスワード \ -p 3306:3306 \ mysql:8.0

データをRasberryPi(ホスト)側に保存するように変更したい場合はこちらのコマンドを実行します。
私はこちらを選択しました。

docker run -d \ --name mysql-rpi \ -e MYSQL_ROOT_PASSWORD=パスワード \ -p 3306:3306 \ -v ~/mysql_data:/var/lib/mysql \ mysql:8.0

Dockerの実行中のコンテナを確認します。

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest ca9905c726f0 4 weeks ago 5.2kB mysql 8.0 5899f96253ce 6 weeks ago 777MB

-p オプションをつけると停止中のコンテナも含めて参照することができます。
コンテナを起動するときにはこれでコンテナ名を調べればOK。

$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 49083dfdb90c 5899f96253ce "docker-entrypoint.s…" 2 minutes ago Exited (1) 2 minutes ago heuristic_mclaren ed8dee94e3bf 775909ac1896 "docker-entrypoint.s…" 5 minutes ago Exited (1) 5 minutes ago gifted_colden 930c8863dd30 5899f96253ce "docker-entrypoint.s…" 8 minutes ago Exited (1) 8 minutes ago competent_haibt f6c7e15e4ec5 mysql:8.0 "docker-entrypoint.s…" 35 minutes ago Exited (0) 30 minutes ago mysql-rpi 0dfcd3014573 hello-world "/hello" 16 hours ago Exited (0) 16 hours ago sharp_archimedes

mysql 8.0 がダウンロードされたことが確認できました。
Dockerのイメージは以下のディレクトリにダウンロードされます。
lsコマンドで見てみても、hash化?されているのでよくわからないですが確かにいます。

/var/lib/docker/containers/

データを永続化した(RasberryPi上に保存することを選択した)場合は、データは以下に格納されます。

/var/lib/docker/volumes/

イメージの詳細を見るには以下のコマンドを実行します。

docker inspect イメージ名

Dockerのコンテナを停止するにはstopコマンドを発行します。

docker stop コンテナID または 名前

Dockerのコンテナを起動するにはstartコマンドを発行します。

docker start コンテナID または 名前

イメージとコンテナ

イメージとコンテナという名前が混在して混乱するのでちょっと整理します。

1. Docker イメージ(Image)
・コンテナを作るための 設計図・テンプレート
・実行はされない、ただのファイル群
・ソフトウェア・ライブラリ・設定などをまとめた 不変のスナップショット
💡 特徴: ・何度でもコンテナを作れる
・保存場所:/var/lib/docker/overlay2/...(内部的に管理される)

2. Docker コンテナ(Container)
・イメージをもとに 実際に起動した実行環境
・プロセスとして動作する
・書き込み可能なレイヤーを持つので、起動中にデータを書き込める
・停止・再開が可能
💡 特徴:
・docker run で作る
・docker start / docker stop で操作
・名前を付けて管理できる(例:mysql-rpi)

3. コマンド対応
操作     コマンド
イメージ一覧 docker images
イメージ削除 docker rmi イメージID
コンテナ一覧(実行中) docker ps
コンテナ一覧(停止含む) docker ps -a
コンテナ作成・起動 docker run イメージID
コンテナ起動 docker start コンテナ名
コンテナ停止 docker stop コンテナ名
コンテナ削除 docker rm コンテナ名


MySQLを操作する

MySQLを操作していきます。
次のコマンドでコンテナに入ります。

docker exec -it mysql-rpi bash

それぞれの意味は以下の通り
・-it → ターミナルに接続
・bash → シェルを開く

MySQLにログインします。
パスワードが求められますが、イメージをダウンロード時に指定したパスワードです。

mysql -u root -p

試しにデータベース一覧を見ます。

> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec)

ちゃんとMySQLが起動していることが確認できました。

MySQLからログアウトするには以下コマンドを実行。

exit または quit

コンテナからログアウトするのも同様です。

exit
>

最後に、MySQLのポート番号を開放しておきます。

$ sudo ufw allow from 192.168.1.0/24 to any port 3306 Rule added

以上、やっとこMySQLサーバーを立ち上げることができました。
これでプログラマ生活に戻れる...
次回更新がいつになるかわかりませんが、pythonからMySQLを操作します。
その前にテーブル設計から...


イメージとコンテナの削除

最後、おまけですがイメージ、またはコンテナを削除したい場合は以下のコマンドを実行します。
イメージID は docker images コマンドで確認できます。

$ docker rmi イメージID

イメージの削除

$ docker rmi イメージID

使用中で削除できないというメッセージが出た場合は、 -f オプションをつけて実行します。

$ docker rmi -f イメージID

コンテナの削除

$ docker rm コンテナ名

参考サイト

Raspberry Pi に Docker をインストールする方法

コメント

このブログの人気の投稿

【python】PySide6 におけるウィンドウとかダイアログボックス内のアイテムの自動調整

脆弱性評価システムを作る〜CVSSとは〜

dict型オブジェクトを内包するlistオブジェクトのコピー