私は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)
Dockerは仮想マシンのように機能します。ローカルストレージとローカル環境があります。 Dockerから127.0.0.1に接続すると、DockerのlocalhostがDockerであるため、Dockerは(Dockerが実行されたローカルマシンではなく)このDockerに接続しようとします。
次の答えを読んでください:
コンテナ内からのクエリに「127.0.0.1」の代わりにdockerホストアドレスを使用して、これを解決しました。
echo "データベースの表示" | mysql -u DB_USER -pDB_USER_PWD -h10.0.2.2--port = 3306
DockerホストのIPは異なる場合があるため、この投稿では正しいアドレスを取得する手順について説明します。
まず、次のコマンドを使用して、ファイアウォールで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データベースに簡単にアクセスできるようになりました。