【Docker】コンテナイメージからMySQLのコンテナ作成し、DBアクセスしてみた

Docker

はじめに(今回の目標)

以前、「Dockerにとにかく触ってみる」ことを目的に
【Docker】を初めて触ってみた
↑この記事を書いてみたのですが、ここでは『Docker Desktop』のインストール後、『hello-world』のDockerコンテナイメージをインストール~実行してみるという、初歩中の初歩といった内容でした。

当然、これだけではまるで役に立たないので、今回はもう少し突っ込んだ形でDockerを動かしていこうと思います。

今回は、以下の実施を目標に、実際に手を動かしていきます。

<今回の目標>
・DockerHubから、MySQLのコンテナイメージを取得し、インストール
・MySQLのデータベース用コンテナを作成
・Pythonにて外部からコンテナ内のテーブルにアクセスし、データ取得

前回のhello-worldに比べたら、かなり実践的な内容ですね。
では、順を追って成果物を作成していきましょう。

1.DockerHubから、MySQLのイメージを取得

① DockerHub画面へのアクセス

MySQLなどの比較的多くの人が使うであろうDockerコンテナイメージは、Docker Hubの公式サイトに一般公開されているため、そこからインストールすることが可能です。

上記のリンクからアクセスすると、このような画面が表示されます。
これがDocker Hubのサイトとなります。基本的なDockerイメージは、ここで探すことが可能です。

今回は、MySQLのDockerコンテナを立てることが目的ですので、MySQLのコンテナイメージを取得するところから始めたいと思います。


因みに、コンテナイメージとは、コンテナを立てるのに必要なコマンドやデータを含んだパッケージの事を指します。
これをダウンロード~インストールしてしまえば、MySQLを使用できるコンテナが出来てしまう、という訳です。
これまでは、仮想環境を設定して、ゲストOSを入れて、MySQLをインストールして…といった作業が必要でしたが、それをしなくても、MySQLを使える環境が手軽に完成してしまいます。

② MySQLのコンテナイメージを取得

では早速、上記画面の赤枠部分が検索用のテキストボックスとなっていますので、「mysql」と入力し、検索してみましょう。

このように、様々なMySQL関連のDockerイメージが検索結果として表示されています。
今回は、MySQLが公式に公開している『MySQL』のコンテナイメージをダウンロードします。

赤枠部分をクリックしてください。

MySQLのコンテナイメージに関する詳細画面に遷移します。
mysqlの表記の横に「Docker Official Image」と記されていますよね。これが、MySQLが公式に公開している『MySQL』のコンテナイメージであることを示しています。

あと、画面右側にある「docker pull mysql」という文言は、MySQLのコンテナイメージをDocker Hubから自身のローカル上にダウンロードするためのpullコマンドとなります。これをコピーしてください。

コピーできたら、Windows PowerShellを起動し、コピーしたPullコマンドを実行してみましょう。
(※因みに、Docker Engineを稼働状態にするために、Docker Desktopは予め起動しておいてください)

PS C:\Users\XXXXXX> docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6e839ac3722d: Pull complete
ad912193ad5f: Pull complete
25d13d87fd8d: Pull complete
004d383c75ef: Pull complete
6d9bbc82a0b8: Pull complete
81fec07ea550: Pull complete
83357cb2d3a5: Pull complete
8ffe968b82c1: Pull complete
30dfd9a7ed57: Pull complete
35844ae33cbe: Pull complete
Digest: sha256:{省略}
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview mysql
PS C:\Users\XXXXXX>

少々時間は掛かりますが、このようなメッセージが表示されたら、自身のローカルへのダウンロード成功です。
次は、「docker images」と実行してみてください。

PS C:\Users\XXXXXX> docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    a82a8f162e18   4 weeks ago     586MB    ←今回の実行で追加
PS C:\Users\XXXXXX>

以前にダウンロードした「hello-world」に加えて、「mysql」も正常にダウンロードされ、イメージ一覧に追加されたことが分かります。
これでひとまずダウンロードはできましたので、次は起動していきましょう。
起動は「docker run」コマンドで行います。

2. MySQLのDockerコンテナを起動

① 起動コマンドの作成

起動コマンドについては、Docker HubのMySQLのページに雛形が載っています。
OverViewのページを下にスクロールすると、「How to use this image」という箇所があります。
そこにコマンドの雛形がありますので、コピーしてください。
※下の画像を参考にしてください。

↓↓↓

コピーしたら、それをコマンドライン上に貼り付けてから、数か所修正する必要があります。
コピーしたコマンドはあくまで雛形ですので、このままでは使えません。

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

さて、ここからいくつか手を加えていきましょう。

・[–name]
このオプションは、コンテナの識別名を示します。
雛形では「some-mysql」となっていますので、任意の名前に変更しましょう。

(本記事では「test-mysql」とします)

・[-e]
このオプションは、環境変数の設定を意味します。
雛形では、「MYSQL_ROOT_PASSWORD」という変数名が示されています。MySQLのルートパスワードですね。

MySQLのコンテナログイン時に必要になりますので、任意のパスワードを設定しましょう。

・[-d]
このオプションは、デタッチドモードを意味します。
このモードでは、コンテナがバックグラウンドで実行され、コマンドライン(ターミナル)からは切り離された状態になります。つまり、ターミナルを占有せずにコンテナを実行できるということですね。


・[mysql:tag]
この部分は、起動するコンテナイメージを指定します。
今回はmysqlのコンテナを起動するため、この部分は[mysql]となっていますが、コロンの後ろの[tag]部分を修正し、コンテナイメージのバージョンを設定します。
先程、「docker images」コマンドで一覧表示した際、mysqlのtag部分は「latest」となっていました。これは最新版を意味しますので、この場合はバージョン情報は省略できます。

よって、コロン以降は削除してしまってOKです。([mysql]だけ)

・追加(ポートフォワーディング設定)
基本的には、これでOKですが、ひとつオプションを付け加えましょう。
後で、外部からMySQLコンテナにアクセスを試みてみようと思いますので、ポートフォワーディングの設定もしておきます。
ポートフォワーディングとは、特定のサービスやアプリケーションが外部からアクセスできるようにする際に使用するものです。


ローカル側のポートを決めておき、そのポートへアクセスすると、自動的にMySQLコンテナのポートに転送してくれる設定となります。セキュリティ対策のための設定という訳です。

MySQLのポートは基本的には[3306]と定められていますので、ローカル側のポートは[10000]としておきましょう。
(ここは使用できるポートの範囲内であれば、分かりやすい任意の値でよいです)

「-p 10000:3306」
これをコマンドの中に追加すれば、ポートフォワーディング設定も同時に行ってくれます。


ここまでを纏めると、

docker run --name test-mysql -p 10000:3306 -e MYSQL_ROOT_PASSWORD=XXXXXXXXXX -d mysql

こんな感じのコマンド文となります。では、早速実行してみましょう。

② 起動コマンドの実行

PS C:\Users\XXXXXX> docker run --name test-mysql -p 10000:3306 -e MYSQL_ROOT_PASSWORD=XXXXXX -d mysql
1a7d8e8b2df4c908717cc217c742e0ed02cf947155d49b43eeb4bc9be53d7d3e
PS C:\Users\XXXXXX>

起動コマンドを実行すると、コンテナのIDが表示されて、MySQLのコンテナが起動しました。
本当に起動しているかを確認するには、「docker ps」コマンドを実行してみてください。

PS C:\Users\XXXXXX> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                NAMES
1a7d8e8b2df4   mysql     "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   33060/tcp, 0.0.0.0:10000->3306/tcp   test-mysql
PS C:\Users\XXXXXX>

このように、mysqlのコンテナである「test-mysql」が正常に起動したことが確認できます。
これで、MySQLを動作させるための環境が整いました。
仮想環境を立ち上げ、ゲストOSをインストールし、更にMySQLもインストールし…、といった手順は不要で、これだけでコンテナが立ち上がりました。実に簡単です

3. MySQLコンテナの利用

① MySQLへのログイン

では、早速起動したMySQLコンテナにログインし、中で色々と作業をしてみましょう。
コンテナにログインするには、「docker exec」コマンドを実行します。

docker exec -it test-mysql bash

[-it]オプションを付与することで、コンテナ側でのコマンド操作を、今使っているコンソール画面から操作することができます。
その後に、コンテナ識別名である「test-mysql」を指定し、最後に[bash]を付けます。
[bash]を付けることで、コンテナ内ではbashでコマンド操作することができます。

PS C:\Users\XXXXXX> docker exec -it test-mysql bash
bash-5.1#

こんな感じで、「bash-X.X#」という表示がでれば、コンテナへのログイン成功です。
これだけだと、まだコンテナ内に入っただけなので、次はMySQLが使えるか確認してみましょう。

mysql -u root -p

このコマンドで、MySQLのルートユーザーにログインすることができます。
ここではパスワードの入力を求められますので、docker runコマンドで指定したパスワードを入力してください。

bash-5.1# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 9.0.1 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

ログイン成功すると、上記のようなメッセージが出力され、MySQLが利用できます。

② データベースの準備

では、データベースを作成し、テーブル内にデータを何件か挿入してみましょう。

mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.07 sec)

mysql> USE test_db;
Database changed
mysql> CREATE TABLE human (
    -> id INT NOT NULL PRIMARY KEY,
    -> name VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO human(id, name) values (1, "taro"), (2, "hanako");
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>

・[CREATE DATABASE]で「test_db」というデータベースを作成
・[USE]コマンドで使用するデータベースを「test_db」に切り替え
・[CREATE TABLE]で「human」テーブルを作成
・「human」テーブルにレコードを追加(×2件)


これらを実行し、上記の通り、全て正常終了しています。
ちゃんとDB~テーブル~データと作成できることが確認できます。

③ データベースへのアクセス

次は、作成したデータを使って、データの読み込み等の動作を試していきます。

mysql> SELECT * FROM human;
+----+--------+
| id | name   |
+----+--------+
|  1 | taro   |
|  2 | hanako |
+----+--------+
2 rows in set (0.01 sec)

mysql>

このように、コンテナ内からのSELECT文でのデータ抽出も問題なく動作します。
では、次は外部からこのMySQLコンテナにアクセスし、データを取り出してみましょう。

mysql> exit
Bye
bash-5.1# exit
exit

What's next:
    Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug test-mysql
    Learn more at https://docs.docker.com/go/debug-cli/
PS C:\Users\XXXXXX>

まずは、exitコマンドで、MySQL、Dockerコンテナ双方を一旦ログアウトします。

PS C:\Users\XXXXXX> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED        STATUS        PORTS                                NAMES
1a7d8e8b2df4   mysql     "docker-entrypoint.s…"   14 hours ago   Up 14 hours   33060/tcp, 0.0.0.0:10000->3306/tcp   test-mysql
PS C:\Users\XXXXXX>

この状態ですと、ログアウトしただけなので、まだMySQLのコンテナである「test-mysql」は起動している状態です。
この状態で、外部からMySQLにアクセスしてみたいと思います。

以下のPythonのコードは、作成したMySQLコンテナにアクセスし、humanテーブルのデータを抽出する処理となります。

import mysql.connector

cnx = mysql.connector.connect(
    user='root',
    password='XXXXXX',
    host='localhost',
    port='10000'
)
cursor = cnx.cursor()
cursor.execute('SELECT * FROM test_db.human')

for id, name in cursor:
    print(f'{id}: {name}')


cursor.close()

[docker run]コマンドでMySQLのdockerコンテナを作成した際に、ポートフォワーディング設定を行いました。
ポート番号:10000にアクセスすると、自動的にMySQLのポートである3306に転送してくれるようになっています。
よって、上記プログラムのようにlocalhost上の10000のポートに繋げてあげれば、MySQLのコンテナに接続が転送されるという訳です。

あとは、SELECT文で対象テーブルを指定して、このPythonのコードを実行すれば

1: taro
2: hanako

こんな形で、作成した2つのレコードが抽出されました。
これで、
・DockerHubから、MySQLのコンテナイメージを取得し、インストール
・MySQLのデータベース用コンテナを作成
・Pythonにて外部からコンテナ内のテーブルにアクセスし、データ取得

という目標は全て達成できました

4. MySQLコンテナの閉じ方

ひと通りの作業が終了しましたので、起動したDockerコンテナを終了させ、コンテナを削除しましょう。

① Dockerコンテナの停止~再起動

PS C:\Users\XXXXXX> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED        STATUS        PORTS                                NAMES
1a7d8e8b2df4   mysql     "docker-entrypoint.s…"   14 hours ago   Up 14 hours   33060/tcp, 0.0.0.0:10000->3306/tcp   test-mysql

[docker ps]コマンドを実行し、まだ「test-mysql」のコンテナが起動していることを確認し、[docker stop]コマンドを実行します。
[docker stop test-mysql]と入力し、実行しましょう。

PS C:\Users\XXXXXX> docker stop test-mysql
test-mysql
PS C:\Users\XXXXXX> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
PS C:\Users\XXXXXX>

実行し終わったら、もう一度[docker ps]を実行してみましょう。
起動していた「test-mysql」が一覧から消えていますね。これで、MySQLのDockerコンテナが停止したことになります。


では、次は[docker ps -a]を実行してみましょう。

PS C:\Users\XXXXXX> docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED        STATUS                      PORTS     NAMES
1a7d8e8b2df4   mysql         "docker-entrypoint.s…"   14 hours ago   Exited (0) 10 seconds ago             test-mysql
PS C:\Users\XXXXXX>

[-a]オプションを付与すると、停止しているコンテナも含め、自分が管理する全てのコンテナが表示されます。
まだ「test-mysql」がちゃんと存在していますね。


因みに、一度停止したコンテナを再度起動したい場合は、[docker run]コマンドではなく、[docker start]コマンドを実行する必要があるので、注意してください

S C:\Users\XXXXXX> docker start test-mysql
test-mysql
PS C:\Users\XXXXXX> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED        STATUS         PORTS                                NAMES
1a7d8e8b2df4   mysql     "docker-entrypoint.s…"   14 hours ago   Up 4 seconds   33060/tcp, 0.0.0.0:10000->3306/tcp   test-mysql

[docker start test-mysql]を実行後、再度[docker ps]を続けて実行してみると、MySQLのコンテナが起動していることが確認できます。

② Dockerコンテナの削除

では、再度[docker stop]でコンテナを停止させ、コンテナを削除していきましょう。
コンテナを削除するには[docker rm]、コンテナイメージを削除するには[docker rmi]コマンドを実行します。

以下のようなメッセージが表示されれば、処理成功です。

PS C:\Users\XXXXXX> docker stop test-mysql
test-mysql
PS C:\Users\XXXXXX> docker rm test-mysql
test-mysql
PS C:\Users\XXXXXX> docker rmi mysql:latest
Untagged: mysql:latest
Untagged: mysql@sha256:86cdfe832c81e39a89cfb63c3fde1683c41cc00ef91e67653c9c1df0ba80f454
Deleted: sha256:a82a8f162e188e0df15b0d2d90c6e9e973af8e88a6cb74b8052122ae5e02325c
Deleted: sha256:5da6d4af0083ef5a3c34a897318f812bf2287df1d20324662bb462d9adc9a9f4
Deleted: sha256:c2517597cb75237e131a560ff4fd06b26b9bbe2dc84351258385d20f6bb3d141
Deleted: sha256:87392ed73e360ff3cdf9cf6f83da99054fa43703d9c68e8ee1cb908defa6c27b
Deleted: sha256:652f8d3f70cb386cbaa61ed1dd578b6485ca5f5bea8dceedd02176657a57d700
Deleted: sha256:aeb66573c46a113dc637070d9b6e5ad1af5a9629c706271013b658a04532c643
Deleted: sha256:c103d3c7862eec5cfc0aa42df27e8ef2e441467c94a64e282d44171245497c33
Deleted: sha256:bfee82506d3915fd33091e987014bf0fa4fb5079b2c64f8c4c82cf9289b87096
Deleted: sha256:f829026b115edfb645697aa370a1dff76055ace8a213d83e559f65699d9555ce
Deleted: sha256:28ff378667a9659a8bafabb2a3cca8d125c66c1cd7f1e8ca2797cbf83e511960
Deleted: sha256:3cf436755aff907c2c6a6fd9202eab0da03f0b331f8d1363078a6534d95608a0
PS C:\Users\XXXXXX> 

今回起動させた「test-mysql」のコンテナを削除する場合、[docker rm test-mysql]を実行します。
これで起動させたコンテナ自体は削除されました。
続けて[docker rmi mysql:latest]を実行します。これは、Docker HubからダウンロードしたMySQLのコンテナイメージそのものを削除します。

コンテナイメージは最新のものをダウンロードしていましたので、[mysql:latest]としています。

PS C:\Users\XXXXXX> docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
PS C:\Users\XXXXXX>

削除後、[docker images]コマンドを実行しても、何も表示されませんね。
これで、ダウンロードしたイメージそのものが削除されたことになります。

まとめ

今回、Docker Hubからイメージのダウンロード~イメージからのDockerコンテナ起動~コンテナ内での動作確認をMySQLを利用して実行してみました。
今回の処理はテーブルひとつ作成してデータ抽出するだけの非常にシンプルなものですが、これを応用することで、Dockerコンテナを用いたDBアクセス処理が可能となりますので、ぜひお試しください。
(今回はここまで)

お読みいただき、有難うございました!

コメント

タイトルとURLをコピーしました