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

2024-05-21

Docker コンテナー外部から MariaDB に接続できない問題:徹底解説と解決方法

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

このエラーは、主に以下の2つの原因で発生します。

  1. ポート開放の設定不足: MariaDB のデフォルトポートである 3306 がホスト側に公開されていない
  2. 接続先情報の誤り: 接続先として誤ったホスト名やポート番号を指定している

本記事では、このエラーの原因と解決方法を初心者にも分かりやすく解説します。

原因1:ポート開放の設定不足

Docker コンテナー内で起動した MariaDB に外部からアクセスするには、MariaDB が稼働しているコンテナーのポートをホスト側に公開する必要があります。

解決方法

以下のいずれかの方法で、MariaDB のポートを開放しましょう。

方法1:docker run コマンドでポートマッピングを指定

docker run -d --name my-mariadb-container -p 3306:3306 mariadb:latest

上記の例では、コンテナー内の 3306 ポートを、ホスト側の 3306 ポートにマッピングしています。

方法2:docker-compose.yml ファイルでポートマッピングを指定

version: "3"

services:
  my-mariadb-container:
    image: mariadb:latest
    ports:
      - "3306:3306"

docker-compose up -d コマンドを実行することで、上記のポートマッピング設定に基づいてコンテナーが起動します。

方法3:docker network コマンドでカスタムネットワークを作成

  1. カスタムネットワークを作成
docker network create my-network
  1. MariaDB コンテナーをカスタムネットワークに接続して起動
docker run -d --name my-mariadb-container --network my-network mariadb:latest
  1. 別のコントナーから MariaDB コンテナーに接続
docker run --name my-app-container --network my-network my-app-image

上記の方法でポート開放を行った後、以下のコマンドで MariaDB に接続できることを確認しましょう。

mysql -u root -p -h 127.0.0.1

原因2:接続先情報の誤り

MariaDB に接続する際、以下の情報に誤りがあると接続できません。

  • ホスト名: 接続先の MariaDB コンテナーのホスト名
  • ポート番号: MariaDB が稼働しているポート番号
  • ユーザー名: MariaDB にログインするユーザー名

接続情報に誤りがないことを確認しましょう。特に、ホスト名は以下のいずれかで取得できます。

  • docker ps コマンドで確認できるコンテナーID

補足情報

  • MariaDB の設定ファイルを変更することで、接続許可するホストやユーザーを制限することができます。詳細は MariaDB の公式ドキュメントを参照してください。
  • セキュリティ上、本番環境では MariaDB をインターネットに公開しないことを推奨します。必要な場合は、VPN や SSH トンネルなどの手段を用いて安全に接続してください。



    # MariaDB コンテナー起動(ポートマッピングあり)
    docker run -d --name my-mariadb-container -p 3306:3306 mariadb:latest
    
    # MariaDB コンテナー内にログイン
    docker exec -it my-mariadb-container bash
    
    # MariaDB データベース作成
    mysql -u root -p
    CREATE DATABASE my_database;
    
    # データベースにテーブル作成
    USE my_database;
    CREATE TABLE my_table (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(255) NOT NULL,
      email VARCHAR(255) NOT NULL
    );
    
    # データ挿入
    INSERT INTO my_table (name, email) VALUES ("John Doe", "[email protected]");
    INSERT INTO my_table (name, email) VALUES ("Jane Doe", "[email protected]");
    
    # データ確認
    SELECT * FROM my_table;
    
    # MariaDB コンテナーからログアウト
    exit
    
    # 別のコントナーから MariaDB コンテナーに接続
    docker run --name my-app-container --network my-network my-app-image
    
    # my-app-container コンテナー内から MariaDB に接続
    mysql -u root -p -h my-mariadb-container
    
    • 上記はあくまで一例であり、状況に合わせて適宜変更してください。
    • コマンドを実行する前に、必ず Docker がインストールされていることを確認してください。
    • パスワードは適宜変更してください。



    Docker コンテナー外部から MariaDB に接続するその他の方法

    この方法は、ホストマシンと複数のコンテナー間でシームレスな通信を可能にするブリッジネットワークを利用します。

    手順:

      docker network create my-bridge-network
      
        docker run -d --name my-mariadb-container --network my-bridge-network mariadb:latest
        
          docker run --name my-app-container --network my-bridge-network my-app-image
          
          1. my-app-container コンテナー内から MariaDB に接続
          mysql -u root -p -h my-mariadb-container
          

          利点:

          • カスタムネットワークよりも設定が簡潔
          • 複数のコンテナー間で簡単に通信できる

          注意点:

          • ブリッジネットワークは、ホストマシン上のすべてのコンテナーに公開されるため、セキュリティ面で注意が必要

          docker-compose ファイルを利用して、MariaDB サービスを外部に公開する方法もあります。

            version: "3"
            
            services:
              my-mariadb-container:
                image: mariadb:latest
                ports:
                  - "3306:3306"
                networks:
                  - external
            networks:
              external:
                external: true
            
            mysql -u root -p -h <ホストマシンのIPアドレス>
            
            • docker-compose を利用している環境であれば設定が容易
            • ホストマシンの IP アドレスを直接使用する必要があるため、ホストマシンのセキュリティ対策が重要

            SSH トンネルを利用して、安全に MariaDB に接続する方法もあります。

            1. ホストマシンで SSH サーバーを起動
            2. 以下のコマンドで SSH トンネルを作成
            ssh -L 3306:my-mariadb-container:3306 <ユーザー名>@<ホストマシンのIPアドレス>
            
              mysql -u root -p -h localhost
              
              • 公開ポート数を減らすことができる
              • インターネット経由で接続する場合でも、安全に接続できる
              • SSH サーバーの運用・管理が必要

              クラウドサービスを利用する

              Amazon RDS や Google Cloud SQL などのクラウドサービスを利用すれば、Docker コンテナーの管理やスケーリングを容易に行うことができます。これらのサービスは、データベースへの安全な接続も提供しています。

              1. クラウドサービスにアカウントを作成
              2. サービス上で MariaDB インスタンスを作成
              3. インスタンスの接続情報を確認
              mysql -u root -p -h <接続情報>
              
              • インфраструкチャの管理が不要
              • 高可用性とスケーラビリティを備えている
              • ランニングコストが発生する

              Docker コンテナー外部から MariaDB に接続する方法には、様々な選択肢があります。それぞれの方法の利点と欠点を理解した上で、状況に合った方法を選択することが重要です。


              mysql docker mariadb


              MySQLの文字コード設定と非ASCII文字: データの整合性を保つために

              MySQLデータベースでは、文字列データは様々な文字コードでエンコードされます。最も一般的なのはASCIIですが、日本語や中国語などの多言語環境では、UTF-8などのマルチバイト文字コードが使用されます。問題となるのは、ASCII文字コードにはない非ASCII文字(特殊文字、絵文字、記号など)がデータベースに混入してしまうことです。これはデータの不整合や表示エラーを引き起こす可能性があります。...


              データのみをダンプしたいあなたへ!mysqldumpでテーブル情報なしでデータを抽出する方法

              mysqldumpは、MySQLデータベースの構造とデータをダンプするコマンドラインツールです。デフォルトでは、テーブルの構造とデータの両方がダンプされますが、オプションを指定することで、データのみをダンプすることができます。方法データのみをダンプするには、--no-create-infoオプションを指定します。このオプションを指定すると、テーブルの構造に関する情報 (CREATE TABLE ステートメントなど) はダンプされず、データのみがダンプされます。...


              【MySQL/MariaDB初心者向け】ディスク容量を圧迫する一時テーブルの正体とは?解決策もバッチリ解説

              MariaDBやMySQLにおいて、一時テーブルが原因でディスク容量が逼迫する問題が発生することがあります。一時テーブルとは、クエリを実行する際に生成される一時的なテーブルで、中間結果やソートされたデータなどを格納するために使用されます。通常、これらのテーブルはクエリ処理後に自動的に削除されますが、場合によっては削除されずにディスク容量を占有し続けることがあります。...


              緊急対策!MariaDB 10.0.29でrootパスワードを設定してもログイン可能になる問題

              この問題は、MariaDB 10. 0.29を含むいくつかのバージョンの MySQL で発生する既知の問題です。root ユーザーにパスワードを設定しても、パスワードなしでログインできてしまうというものです。原因この問題は、auth_socket 認証プラグインがデフォルトで有効になっていることが原因です。このプラグインは、UNIX ソケットを使用しているクライアントであれば、パスワードなしで認証を許可します。...


              MariaDBで「InsertクエリがローカルDBでは実行されるがサーバーでは実行されない」問題を解決!

              原因: この問題には、主に以下の原因が考えられます。解決策: この問題を解決するには、以下の手順を試してみてください。これらの手順を試しても問題が解決しない場合は、MariaDBコミュニティフォーラムやドキュメントを参照するか、データベース管理者に連絡することをお勧めします。...


              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