Dockerコンテナとホストマシンを繋ぐ:MySQL、Docker、MariaDB を用いた詳細解説
Dockerコンテナとホストマシンを繋ぐ:MySQL、Docker、MariaDB を用いた詳細解説
前提知識
このチュートリアルを理解するには、以下の知識が必要です。
- Docker の基本的な概念と使い方
- MySQLデータベースの基本的な操作
- ufwファイアウォールの基本的な設定
準備
以下の準備が必要です。
- Dockerがインストールされたホストマシン
- Dockerイメージ: mysql または mariadb
- ufwファイアウォールが有効なホストマシン
手順
- MySQLコンテナを作成
以下のコマンドを使用して、MySQLコンテナを作成します。
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql
このコマンドは、mysql
という名前のコンテナを作成し、3306番ポートをホストマシンの3306番ポートにマップします。また、MYSQL_ROOT_PASSWORD
環境変数を設定して、rootユーザーのパスワードをpassword
に設定します。
以下のコマンドを使用して、ufwファイアウォールで3306番ポートを開放します。
sudo ufw allow 3306/tcp
- ホストマシンからMySQLコンテナに接続
mysql -u root -p -h 127.0.0.1
このコマンドは、mysql
コマンドを実行し、root
ユーザーで、パスワードpassword
を使用して、ホストマシンの127.0.0.1
アドレスにあるMySQLサーバーに接続します。
MySQLコンテナに接続したら、通常のMySQLコマンドを使用してデータベースを操作できます。
CREATE DATABASE mydatabase;
USE mydatabase;
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO mytable (name, email) VALUES ("John Doe", "[email protected]");
SELECT * FROM mytable;
補足
- 上記の手順は、MySQL 5.7以降を使用している場合にのみ適用されます。
- MariaDBを使用している場合は、
mysql
をmariadb
に置き換えてください。 - 複数のMySQLコンテナを作成する場合は、それぞれ異なるポート番号をマップする必要があります。
- より高度なセキュリティ設定については、ufwファイアウォールの公式ドキュメントを参照してください。
注意事項
- このチュートリアルは、あくまで学習目的で使用することを想定しています。本番環境で使用する場合は、適切なセキュリティ対策を講じてください。
- データベースサーバーをインターネットに公開する場合は、適切なファイアウォール設定とパスワード管理が必要です。
このチュートリアルにより、Dockerコンテナ内にあるMySQLデータベースに、ホストマシンから接続する方法を理解できたと思います。ufwファイアウォールを使用して、データベースサーバーを安全に保護する方法についても説明しました。
# 1. MySQLコンテナを作成
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql
# 2. ufwファイアウォールを設定
sudo ufw allow 3306/tcp
# 3. ホストマシンからMySQLコンテナに接続
mysql -u root -p -h 127.0.0.1
# 4. MySQLデータベースを操作
CREATE DATABASE mydatabase;
USE mydatabase;
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO mytable (name, email) VALUES ("John Doe", "[email protected]");
SELECT * FROM mytable;
上記のコードは、以下の手順を実行します。
-
最初の行のコードは、
docker run
コマンドを使用してMySQLコンテナを作成します。このコマンドには、以下のオプションが含まれています。-d
: コンテナをデタッチモードで実行します。--name mysql
: コンテナにmysql
という名前を付けます。-p 3306:3306
: ホストマシンの3306番ポートをコンテナの3306番ポートにマップします。-e MYSQL_ROOT_PASSWORD=password
: rootユーザーのパスワードをpassword
に設定します。mysql
: 使用するDockerイメージの名前を指定します。
-
-u root
: rootユーザーで接続します。-p
: パスワード入力を要求します。-h 127.0.0.1
: ホストマシンのループバックアドレスに接続します。
-
CREATE DATABASE mydatabase
:mydbase
という名前のデータベースを作成します。USE mydatabase
:mydbase
データベースをアクティブにします。CREATE TABLE mytable (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)
:mytable
という名前のテーブルを作成します。このテーブルには、id
、name
、email
という3つの列があります。INSERT INTO mytable (name, email) VALUES ("John Doe", "[email protected]")
:mytable
テーブルに新しいレコードを挿入します。SELECT * FROM mytable
:mytable
テーブル内のすべてのレコードを選択します。
Dockerコンテナに接続するその他の方法
docker exec
コマンドを使用して、コンテナ内でコマンドを実行できます。この方法を使用すると、コンテナ内にシェルを起動し、コンテナのファイルシステムにアクセスして、コンテナ内で実行されているアプリケーションと対話することができます。
docker exec -it mysql mysql -u root -p -h 127.0.0.1
Docker Composeを使用して、複数のコンテナをまとめて起動して管理することができます。Docker Composeを使用すると、コンテナ間のネットワーク接続を簡単に設定することができます。
version: "3"
services:
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
このDocker Composeファイルを使用してコンテナを起動するには、以下のコマンドを実行します。
docker-compose up -d
このコマンドは、mysql
コンテナを起動し、バックグラウンドで実行します。
Dockerコンテナのポートをホストマシンに公開すると、ホストマシンからそのポートに接続することができます。
docker run -d --name mysql -p 3306:3306 mysql
このコマンドは、mysql
という名前のコンテナを作成し、3306番ポートをホストマシンの3306番ポートにマップします。
ホストマシンからMySQLコンテナに接続するには、以下のコマンドを実行します。
mysql -u root -p -h 127.0.0.1
Dockerネットワークを使用して、複数のコンテナ間でプライベートネットワークを作成することができます。これにより、コンテナ間で簡単に通信することができます。
docker network create my-network
docker run -d --name mysql --net my-network mysql
docker run -d --name myapp --net my-network myapp
このコマンドは、my-network
という名前のネットワークを作成し、mysql
とmyapp
という名前のコンテナをそのネットワークに作成します。
mysql -u root -p -h mysql
Docker Remote APIを使用して、プログラムからDockerコンテナを管理することができます。
import docker
client = docker.from_env()
container = client.containers.get("mysql")
# コンテナ内にシェルを起動する
container.exec_run(cmd=["sh", "-c", "echo hello from container"])
# コンテナ内のファイルシステムにアクセスする
with open("/tmp/file.txt", "w") as f:
f.write("Hello from host machine!")
このPythonコードは、docker
ライブラリを使用してDockerコンテナとやり取りします。
Dockerコンテナに接続するには、さまざまな方法があります。最適な方法は、ニーズと要件によって異なります。
mysql docker mariadb