Dockerに作成したMySQLコンテナへホストから接続する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,507

ambN

score 7

 前提・実現したいこと

Dockerの勉強を行っており、MySQLとPHP+Apacheの各コンテナを作成しました。
PHP+ApacheコンテナからMySQLコンテナへの接続は問題なく行えたのですが、
ホスト側からコマンドプロンプト、A5M2などを使用してMySQLコンテナへ接続しようとしてもエラーが出て接続することができません。

ホスト側にもMySQL最新版を入れております。

ホスト側からMySQLコンテナへ接続できる方法をご教示ください。
よろしくお願いいたします。

<追記>
t_obaraさんよりいただいたURLの結果を追加しました。

 発生している問題・エラーメッセージ

下記、コマンドプロンプトから接続を試したときのコマンドとエラーメッセージです。

>mysql -h 127.0.0.1 --port 3309 -u root -p
Enter password: ********
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (10061)

 該当のソースコード

docker-compose.yml

version: '3'
services:
  db:
    container_name: bbs_mysql
    build: ./db
    ports:
      - "3309:3306"
    environment:
      MYSQL_DATABASE: db_bbs
      MYSQL_ROOT_PASSWORD: rootpass
    command: "--innodb_use_native_aio=0"
    volumes:
    - ./db/db_data:/var/lib/mysql
    - ./db/sqls:/docker-entrypoint-initdb.d

  web:
    container_name: bbs_php_apache
    build: ./web
    ports:
    - "8099:80"
    volumes:
    - ./app:/var/www/appBbs
    - ./web/000-default.conf:/etc/apache2/sites-available/000-default.conf
    - ./logs:/var/log/apache2
    depends_on:
    - db


Dockerfile

FROM mysql:8.0
COPY ./my.cnf /etc/mysql/conf.d/


my.cnf

[mysqld]
character-set-server=utf8mb4
default_authentication_plugin = mysql_native_password

[client]
default-character-set=utf8mb4


作成したコンテナ

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
cae0960fceba        bbs_web             "docker-php-entrypoi…"   7 seconds ago       Up 3 seconds        0.0.0.0:8099->80/tcp                bbs_php_apache
f2e1877a8d62        bbs_db              "docker-entrypoint.s…"   11 seconds ago      Up 8 seconds        33060/tcp, 0.0.0.0:3309->3306/tcp   bbs_mysql

<追記>
1. 外部サーバーへpingコマンドを叩く

>ping 127.0.0.1

127.0.0.1 に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128

127.0.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms


⇒返答あり

2. 外部サーバーに直接ログインし、サーバー上でMySQLにアクセス

mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.01 sec)
mysql> select host, user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | user             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
6 rows in set (0.00 sec)


⇒portが3306なのは、コンテナ内なので問題なしのはず。。
ユーザーも、root@%がいるためアクセス可能のはず。。

3. /etc/mysql/my.cnfの確認

root@f2e1877a8d62:/etc/mysql# cat my.cnf
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/


⇒bind-addressの記載なし。自分で作成したmy.cnfにも記載していない状態。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

MySQLに外部接続できない時のチェックポイント
こちらをご確認されてはいかがでしょう。

特に、bind-addressやホストとアカウントの関係が引っかかりがちかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/02 17:46

    実行しているホストでdockerを動作させているのでしょうか?
    ご提示しているdocker psの結果がmysqlコマンドを実行しているホストと同じであれば、firewallぐらいしか思いつきません。

    ちなみに、mysqlサーバが正常に待ち受けしている場合には、以下のメッセージになります。
    Connection closed by remote host
    mysqlサーバ側から接続を切った状態です。ご提示のメッセージの場合、ホスト名かポートが不正の場合、接続拒否で適当なホスト名やポートに変更しても同じメッセージになります。
    繰り返しになりますが、dockerを動かしているサーバと、mysqlコマンドで接続しようとしているサーバは同じホストですか?

    キャンセル

  • 2018/10/03 16:35

    >dockerを動かしているサーバと、mysqlコマンドで接続しようとしているサーバは同じホストですか?
    はい。Windows10の中にDockerToolboxを入れており、すべてこのPCからコンテナの作成やmysqlへの接続試行を行っております。

    firewallにポート3309の受信許可を追加して試してみたり、一度Nortonからfirewallを止めたりもしたのですが、
    ssh: connect to host 127.0.0.1 port 3309: Connection refused
    と変わらず表示されている状態です。

    firewallのあたりをもう少し調べて試してみようと思います。

    キャンセル

  • 2019/07/17 14:35

    現在、同じようにmysqlに接続してみたところ接続に成功できるようになっておりました。
    PCの設定などは特に変更しておらず、唯一変えたのはDocker toolboxからDocker for Windowsにしたことです。

    かなりの日が経ってしまいましたが、色々調べていただきましてありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる