web-dev-qa-db-ja.com

DockerコンテナからリモートMySQLデータベースに接続する

私はODBCを介して別のサーバー上のMySQL DBに接続するDjango 1.5.xアプリケーションをコンテナ化するために取り組んでいます:

[mysql_default]
database = DB_NAME
driver = /usr/lib64/libmyodbc5.so
server = REMOTE_DB_SERVER
user = DB_USER
password = DB_USER_PWD
port = 3306

ポートフォワーディングとSSHを介してリモートDBに接続して、ローカルマシン(外部ドッカー)でDjangoアプリを実行できます。

 ssh -L 3307:127.0.0.1:3306 MYID@REMOTE_DB_SERVER

Centos 6.xを使用して、アプリのDockerコンテナーをセットアップしましたが、MySQL接続が機能しません。コンテナにMySQLがインストールされ、mysqldが実行されています。

私のdocker-compose.ymlファイルは次のようになります。

version: "2"
services:
  web:
    build: .
    image: MY_IMAGE
    container_name: MY_CONTAINER
    network_mode: "Host"
    ports:
      - "3307:3306"
    command: /bin/bash

コンテナが実行されている状態で、次のコマンド(コンテナの外部)を実行して、リモートDB上のデータベースを表示できます。

docker exec MY_CONTAINER echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3307

しかし、コンテナ内から同じコマンドが失敗します:

    echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3306

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
14
Brendenw

Dockerは仮想マシンのように機能します。ローカルストレージとローカル環境があります。 Dockerから127.0.0.1に接続すると、DockerのlocalhostがDockerであるため、Dockerは(Dockerが実行されたローカルマシンではなく)このDockerに接続しようとします。

次の答えを読んでください:

Dockerコンテナ内から、マシンのローカルホストに接続するにはどうすればよいですか?

5
Danil Valov

コンテナ内からのクエリに「127.0.0.1」の代わりにdockerホストアドレスを使用して、これを解決しました。

echo "データベースの表示" | mysql -u DB_USER -pDB_USER_PWD -h10.0.2.2--port = 3306

DockerホストのIPは異なる場合があるため、この投稿では正しいアドレスを取得する手順について説明します。

ドッカーコンテナー内からドッカーホストのIPアドレスを取得する方法

5
Brendenw

まず、次のコマンドを使用して、ファイアウォールでDockerデータベースポートが使用可能であることを確認する必要があります-

Sudo firewall-cmd --list-all

サンプル出力:

  target: default
  icmp-block-inversion: no
  interfaces: eno79841677
  sources: 
  services: dhcpv6-client ssh
  **ports: 3307/tcp**
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

ここに 3307は172.17.0.2 IPのDockerデータベースポートとして使用されます。このポートが使用できない場合は、次のコマンドを実行します-

Sudo firewall-cmd --zone=public --add-port=3307/tcp
Sudo firewall-cmd --reload

上記の設定により、ローカルシステムからDockerデータベースに簡単にアクセスできるようになりました。

0
Sanaulla