DockerとDocker Composeを使ってMySQLポートを公開する方法
DockerとDocker Composeを使ってMySQLポートを公開する方法
このチュートリアルでは、DockerとDocker Composeを使ってMySQLコンテナを起動し、そのポートをホストマシンに公開する方法を説明します。この方法により、ローカルマシン上の他のアプリケーションからMySQLデータベースに接続することが可能になります。
前提知識
- DockerとDocker Composeがインストールされていること
- 基本的なMySQLコマンドの使用方法
- ネットワークの基礎知識
手順
- docker-compose.ymlファイルを作成する
version: "3"
services:
mysql:
image: mariadb:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
ports:
- "3306:3306"
このファイルは、mysql
という名前のMySQLコンテナを定義します。このコンテナは、最新のMariaDBイメージを使用し、常に再起動するように設定されています。また、環境変数 MYSQL_ROOT_PASSWORD
と MYSQL_DATABASE
を設定して、それぞれMySQLのルートパスワードとデータベース名を指定しています。最後に、ports
セクションで、コンテナのポート3306をホストマシンのポート3306に公開するように設定しています。
- Docker Composeを使ってコンテナを起動する
docker-compose up -d
このコマンドを実行すると、docker-compose.yml
ファイルで定義されたすべてのコンテナが起動されます。
- MySQLクライアントを使ってデータベースに接続する
mysql -u root -p -h localhost
このコマンドを実行すると、MySQLクライアントが起動し、localhost上のMySQLサーバーに接続しようとします。接続時に、docker-compose.yml
ファイルで設定したルートパスワード password
を入力する必要があります。
- データベースを作成する
CREATE DATABASE mydatabase;
このコマンドを実行すると、mydatabase
という名前のデータベースが作成されます。
- テーブルを作成する
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
このコマンドを実行すると、users
という名前のテーブルが mydatabase
データベース内に作成されます。
- データを追加する
INSERT INTO users (name, email) VALUES ("John Doe", "[email protected]");
INSERT INTO users (name, email) VALUES ("Jane Doe", "[email protected]");
このコマンドを実行すると、users
テーブルにデータが追加されます。
SELECT * FROM users;
注意事項
- このチュートリアルでは、パスワードとして
password
を使用していますが、本番環境で使用する場合には、より強度の高いパスワードを設定してください。 - MySQLコンテナをインターネットに公開する場合は、ファイアウォール設定などで適切なセキュリティ対策を講じてください。
- このチュートリアルは、MySQL 5.7 を使用して説明していますが、他のバージョンでも同様に動作します。
version: "3"
services:
mysql:
image: mariadb:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
ports:
- "3306:3306"
version
: Docker Compose のバージョンservices
: サービスの定義
このコードを実行すると、以下のことが行われます。
mariadb:latest
イメージを使用してmysql
という名前のコンテナが作成されます。- コンテナが終了した場合に自動的に再起動されます。
- コンテナ内で
MYSQL_ROOT_PASSWORD
環境変数に設定されたパスワードを使用して MySQL が起動されます。 - コンテナ内で
MYSQL_DATABASE
環境変数に設定された名前のデータベースが作成されます。 - コンテナのポート 3306 がホストマシンのポート 3306 に公開されます。
このコードを編集して、自分の環境に合わせて変更することができます。例えば、MySQL のルートパスワードを変更したり、使用する MySQL イメージのバージョンを変更したりすることができます。
このコードを使用する方法
- このコードを
docker-compose.yml
という名前のファイルに保存します。 - コマンドプロンプトまたはターミナルを開き、保存したファイルがあるディレクトリに移動します。
- 以下のコマンドを実行します。
docker-compose up -d
- 以下のコマンドを実行して、MySQLクライアントを起動します。
mysql -u root -p -h localhost
- データベースを作成したり、テーブルを作成したり、データを追加したり、データをクエリしたりすることができます。
version: "3.8"
services:
mysql:
image: mariadb:10.5
restart: unless-stopped
ports:
- 33061:3306
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
volumes:
- mysql-data:/var/lib/mysql
このコードは以下の点で前の例と異なります。
image
: 使用する MySQL イメージ (MariaDB 10.5)restart
: コンテナが終了した場合に再起動するかどうかの設定 (unless-stopped
は、コンテナが手動で停止された場合を除いて再起動されることを意味します)ports
: コンテナのポートとホストマシンのポートのマッピング (33061:3306
は、コンテナのポート 33061 をホストマシンのポート 3306 に公開することを意味します)volumes
: コンテナ内のデータボリュームとホストマシンのパスのマッピング (mysql-data:/var/lib/mysql
は、コンテナ内の/var/lib/mysql
ディレクトリをホストマシンのmysql-data
ディレクトリにマウントすることを意味します)
Docker で MySQL ポートを公開するその他の方法
docker-compose.yml
ファイルを使用せずに、docker run
コマンドを使用して MySQL コンテナを起動し、ポートを公開することもできます。
docker run -d --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=mydatabase \
mariadb:latest
このコマンドは、docker-compose.yml
ファイルで行うのと同じことを行いますが、すべてのコマンドラインで行われます。
カスタムネットワークを使用する
複数のコンテナ間で MySQL にアクセスする必要がある場合は、カスタムネットワークを使用してそれらを分離することができます。
version: "3"
networks:
my-network:
services:
mysql:
image: mariadb:latest
restart: always
networks:
- my-network
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
app:
image: my-app:latest
networks:
- my-network
この例では、my-network
という名前のカスタムネットワークが定義されています。mysql
サービスと app
サービスはどちらもこのネットワークに接続されているため、互いに通信することができます。
app
サービスから mysql
サービスに接続するには、以下のコマンドを使用します。
mysql -u root -p -h mysql -d my-network
ホストマシンから MySQL コンテナに直接アクセスする必要がある場合は、ブリッジネットワークを使用することができます。
version: "3"
services:
mysql:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
この例では、MySQL コンテナがブリッジネットワークに接続されています。これにより、ホストマシンの IP アドレスを使用してコンテナに直接アクセスすることができます。
mysql -u root -p -h <host-ip-address>
- 強度の高いパスワードを設定して、MySQLサーバーを保護してください。
これらの方法は、それぞれ異なる状況で役立ちます。自分のニーズに合った方法を選択してください。
docker docker-compose mariadb