DockerとDocker Composeを使ってMySQLポートを公開する方法

2024-06-22

DockerとDocker Composeを使ってMySQLポートを公開する方法

このチュートリアルでは、DockerとDocker Composeを使ってMySQLコンテナを起動し、そのポートをホストマシンに公開する方法を説明します。この方法により、ローカルマシン上の他のアプリケーションからMySQLデータベースに接続することが可能になります。

前提知識

  • DockerとDocker Composeがインストールされていること
  • 基本的なMySQLコマンドの使用方法
  • ネットワークの基礎知識

手順

  1. 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_PASSWORDMYSQL_DATABASE を設定して、それぞれMySQLのルートパスワードとデータベース名を指定しています。最後に、ports セクションで、コンテナのポート3306をホストマシンのポート3306に公開するように設定しています。

  1. Docker Composeを使ってコンテナを起動する
docker-compose up -d

このコマンドを実行すると、docker-compose.yml ファイルで定義されたすべてのコンテナが起動されます。

  1. MySQLクライアントを使ってデータベースに接続する
mysql -u root -p -h localhost

このコマンドを実行すると、MySQLクライアントが起動し、localhost上のMySQLサーバーに接続しようとします。接続時に、docker-compose.yml ファイルで設定したルートパスワード password を入力する必要があります。

  1. データベースを作成する
CREATE DATABASE mydatabase;

このコマンドを実行すると、mydatabase という名前のデータベースが作成されます。

  1. テーブルを作成する
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE
);

このコマンドを実行すると、users という名前のテーブルが mydatabase データベース内に作成されます。

  1. データを追加する
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: サービスの定義

        このコードを実行すると、以下のことが行われます。

        1. mariadb:latest イメージを使用して mysql という名前のコンテナが作成されます。
        2. コンテナが終了した場合に自動的に再起動されます。
        3. コンテナ内で MYSQL_ROOT_PASSWORD 環境変数に設定されたパスワードを使用して MySQL が起動されます。
        4. コンテナ内で MYSQL_DATABASE 環境変数に設定された名前のデータベースが作成されます。
        5. コンテナのポート 3306 がホストマシンのポート 3306 に公開されます。

        このコードを編集して、自分の環境に合わせて変更することができます。例えば、MySQL のルートパスワードを変更したり、使用する MySQL イメージのバージョンを変更したりすることができます。

        このコードを使用する方法

        1. このコードを docker-compose.yml という名前のファイルに保存します。
        2. コマンドプロンプトまたはターミナルを開き、保存したファイルがあるディレクトリに移動します。
        3. 以下のコマンドを実行します。
        docker-compose up -d
        
        1. 以下のコマンドを実行して、MySQLクライアントを起動します。
        mysql -u root -p -h localhost
        
        1. データベースを作成したり、テーブルを作成したり、データを追加したり、データをクエリしたりすることができます。
        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


          MySQL、MariaDB、Laravelで発生するエラー「General error: 1615 Prepared statement needs to be re-prepared」の原因と解決策

          このエラーメッセージは、MySQL、MariaDB、Laravel を使用したアプリケーションで、準備済みステートメントを使用する際に発生します。原因としては、主に以下の3つが挙げられます。データの変更: 準備済みステートメントの実行後、関連するテーブルのデータが変更された場合、ステートメントは無効になり、再準備が必要になります。...


          データベース移行の落とし穴:MySQL 5.6 から MariaDB 10.1 への移行で発生するエラー

          テーブル定義の不一致MariaDB 10. 1 では、MySQL 5.6 で使用できなかった新しいデータ型や機能が導入されています。そのため、移行後に以下のエラーが発生することがあります。このエラーは、テーブル定義に MariaDB 10...


          MariaDB 再起動エラー「unknown variable 'default-character-set = cp932'」の解決方法

          このエラーが発生する主な原因は、以下の2つです。MariaDB のバージョン: MariaDB 10. 2 以降では、デフォルトの文字コード設定が 'utf8mb4' に変更されました。そのため、古いバージョンの設定ファイルが残っていると、エラーが発生する可能性があります。...


          MariaDBで変数とローカル変を使うメリットとデメリット

          変数とローカル変数の定義変数:@記号 followed by 変数名で宣言。セッション全体で有効。ローカル変数:DECLAREステートメントで宣言。現在のクエリ内でのみ有効。スコープの違い変数: すべての接続で利用可能 クエリ間で値を保持 SET ステートメントで変更可能...


          SQL SQL SQL SQL Amazon で見る



          Docker ComposeでMariaDBのポート番号を変更する方法

          このチュートリアルでは、docker-compose ファイルを使用して MariaDB コンテナを起動し、デフォルトのポート 3306 以外のポートで実行する方法を説明します。手順docker-compose. yml ファイルに、MariaDB サービスのポート設定を追加します。以下の例では、ポート 3307 を使用します。version: "3.8" services: mariadb: image: mariadb:latest container_name: mariadb restart: unless-stopped ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: password


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

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