Dockerコンテナとホストマシンを繋ぐ:MySQL、Docker、MariaDB を用いた詳細解説

2024-05-16

Dockerコンテナとホストマシンを繋ぐ:MySQL、Docker、MariaDB を用いた詳細解説

前提知識

このチュートリアルを理解するには、以下の知識が必要です。

  • Docker の基本的な概念と使い方
  • MySQLデータベースの基本的な操作
  • ufwファイアウォールの基本的な設定

準備

以下の準備が必要です。

  • Dockerがインストールされたホストマシン
  • Dockerイメージ: mysql または mariadb
  • ufwファイアウォールが有効なホストマシン

手順

  1. 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
  1. ホストマシンから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を使用している場合は、mysqlmariadbに置き換えてください。
  • 複数の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;

上記のコードは、以下の手順を実行します。

  1. 最初の行のコードは、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という名前のテーブルを作成します。このテーブルには、idnameemailという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という名前のネットワークを作成し、mysqlmyappという名前のコンテナをそのネットワークに作成します。

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


UNION ALL を使用して2つの候補テーブルを1つの仮想テーブルにまとめる

MySQLで、1つの列が2つの候補テーブルのいずれかのレコードを参照する必要がある外部キーを設定したい場合があります。解決策:MySQLでは、直接的に2つのテーブルに外部キーを設定することはできません。しかし、以下のいずれかの方法で実現できます。...


MySQLデータの柔軟性を向上させる:ENUM型カラムの拡張方法

現在定義されているメンバーを確認する上記のクエリを実行すると、テーブルの作成スクリプトが表示されます。ENUM型カラムの定義を確認するには、ENUMキーワードを探します。ALTER TABLEステートメントを使用する上記のクエリでは、column_nameを既存のENUM型カラムの名前、new_member1とnew_member2を新しいメンバーの名前に置き換えます。...


MariaDB 10で部分テキスト検索を高速化するFULLTEXTインデックスのプログラミング解説

MariaDB 10 は、MyISAM、Aria、InnoDB、Mroonga などのストレージエンジンで、部分テキスト検索を可能にする FULLTEXT インデックスをサポートしています。このガイドでは、MariaDB 10 で FULLTEXT インデックスを作成、使用、および管理する方法を分かりやすく日本語で説明します。...


MySQL 5.7ネイティブJSONデータ型:データベース開発におけるJSONデータの活用法

利点:データ整合性の向上: JSONデータ型は、JSONスキーマに対してデータを検証し、無効な形式のデータを保存できないようにすることで、データの整合性を保証します。これは、データ破損や予期しない動作を防ぐのに役立ちます。パフォーマンスの向上: MySQLは、ネイティブJSONデータ型に対してインデックス付けとクエリ最適化をサポートしているため、JSONデータの検索と処理のパフォーマンスが向上します。...


MySQLサーバーのパフォーマンスと安定性を向上!SWAP領域使用量とOOMキラー対策の完全ガイド

この文書では、MySQLがSWAP領域を使い果たし、OOMキラーによって強制終了される問題について解説します。原因と解決策を理解することで、MySQLサーバーのパフォーマンスと安定性を向上させることができます。OOM キラーとはOOM(Out Of Memory)キラーは、Linuxシステムにおいてメモリ不足が発生した場合に、最もメモリを消費しているプロセスを強制終了する仕組みです。これは、システム全体の安定性を維持するために必要な機能です。...


SQL SQL SQL SQL Amazon で見る



VPN、SSHポートフォワーディング、リモートデスクトップ:MariaDBへのリモートアクセス方法徹底比較

Dockerで実行されているMariaDBにリモートアクセスするには、いくつかの方法があります。方法ポート公開 Dockerコンテナを作成時に、MariaDBのデフォルトポートである3306番ポートを公開します。 docker run -p 3306:3306 mariadb このコマンドを実行すると、コンテナ内の3306番ポートがホストマシンの3306番ポートに公開されます。 その後、ホストマシンから以下のコマンドを実行してMariaDBに接続できます。 mysql -h localhost -u root -p


MariaDB 接続エラー「Can't connect to mariadb outside of docker container」を解決! 5つの方法でサクッと接続

Docker コンテナー内で起動した MariaDB に、コンテナー外部から接続しようとしたら、「Can't connect to mariadb outside of docker container」というエラーが発生した経験はありませんか?