質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1060閲覧

Dockerコンテナ内のdjangoとホストのmariadbを接続したい

mnmnmmmn

総合スコア18

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/02/25 01:44

編集2021/02/27 06:53

前提・実現したいこと

dockerコンテナ内にdjangoプロジェクトを作成し、ホストPCのmariadbと接続してrunserverしたいです。

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

djangoプロジェクト作成後、runserverコマンド実行で以下エラーが発生します。

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")

該当のソースコード

・settings.py

(略) ALLOWED_HOSTS = ['*'] (略) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django', 'USER': 'test_user', 'PASSWORD': 'test', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', }, } }

試したこと

・ホストの/var/lib/mysqlにmysql.sock作成
・ホストの/etc/mysql/mariadb.conf.d/50-server.cnfの「bind-address=127.0.0.1」をコメントアウト
→いずれもエラー内容に変化なし

補足情報(FW/ツールのバージョンなど)

・ホストOSはXubuntu、dockerコンテナ内OSはcentos7を使用しています
・ufwでホスト側の3306ポートが開いていることは確認しています
・ホスト側でのmariadbログインはできています(mysql -u test_user -P 3306 -p→パスワード入力でログイン)

その他追記すべき情報等ございましたらご指摘いただければ幸いです。
何卒よろしくお願いいたします。

追記(2/27)

ご指摘を受け、dockerの起動方法等について追記します。
・dockerコンテナ作成~起動

$ sudo docker pull centos:centos7 $ sudo docker run --name centos -itd -p 80:80 --privileged centos:centos7 /sbin/init $ sudo docker exec -it [コンテナID] bash →コンテナに入りdjango、mariadbインストール(nginx・uwsgiもインストールするが取り急ぎDBとの接続確認だけしたいので使用せず)

本番環境で稼働させることを考え、docker-composeは使用せずイメージのプルはOSのみとしています。

・dockerネットワーク構成

$ docker network ls NETWORK ID NAME DRIVER SCOPE 516********* bridge bridge local bd8********* host host local 3ee********* none null local $ docker network inspect bridge [ { "Name": "bridge", "Id": "516********************", "Created": "2021-02-27T15:31:52.454035418+09:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2021/02/26 01:17

dockerのネットワーク構成の問題だと思うので、お手数ですがdockerの起動方法などを詳細にご説明ください(質問を編集して追記)。 デフォルトだとdockerのネットワーク構成はブリッジになっており、ホストとは別のIPでコンテナが動作しています。
mnmnmmmn

2021/02/27 06:55

ご指摘いただきありがとうございます! 質問末尾に追記いたしましたので、ご確認いただければ幸いです。 的外れな追記でしたら申し訳ありません、お手数ですが再度ご指摘ただければ幸いです。
dameo

2021/02/28 09:56

編集ありがとうございます。 デフォルトのままなので、恐らくbridgeが使われていると思います。 とりあえずbridgeのままホストにアクセスするにはGatewayのIPアドレスを使えば接続しに行くと思います。
mnmnmmmn

2021/03/02 01:26

ご回答ありがとうございます。 djangoのsetitings.pyのDATABASE部分'HOST'をGatewayのIPアドレス(172.17.0.1)に変更する、ということでしょうか? 上記修正を行ったところ、エラー内容が django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '172.17.0.1' (111)") となりました。 どの部分にGatewayのIPアドレスを反映させればよいでしょうか。何度もお手数をおかけし申し訳ありません。
dameo

2021/03/02 05:22

それで繋がらないようであれば、dockerは関係ないと思います。 mariadbに所定のユーザーで別のホストから繋げられるかご確認ください。 差し出がましい話で大変恐縮ですが、お勉強の類でなく、本番環境などが存在するお話であれば、もう少しmariadbやdjangoやdockerそれぞれの理解を深めてからの方が良いかと思います。
mnmnmmmn

2021/03/02 08:07

ご回答ありがとうございます。 mariadbログイン時にホスト(-h)にlocalhostを指定すると入れましたが、それ以外の値では入れませんでした。(ERROR 2002 (HY000): Can't connect to MySQL server on 'ホスト名' (115) ) ユーザー作成時、ホストはワイルドカード(%)指定して全権限を付与しているのですが、権限の設定方法に問題があるのでしょうか? 仰る通りいずれについても勉強不足なので、もう少し知識を蓄えてから再トライしたいと思います。(本番環境を独力で云々するのは当分先の話です、ご配慮ありがとうございます)
dameo

2021/03/02 09:45

やってみて上手く行かなかった場合は、そのまま「どうすればいい?」と聞くのではなく、なぜ上手く行かなかったのか、原因を調査する手段を探す習慣があった方がいいかもしれません。 今回は接続を拒否されたようなメッセージなので、 # ss -l などとして、listenしてるポートを調べ、Local Address:Port列に*:mysqlがないかを探してください。
mnmnmmmn

2021/03/03 05:56

いただいたアドバイス通り原因調査してみたところ、解決に至りました!今後は自分で原因を調査する習慣を身に着けます。(どうしても解決しなかったらまたご質問させていただきます…)長期間本当にありがとうございました。
guest

回答1

0

自己解決

解決方法

ホストの/etc/mysql/mariadb.conf.d/50-server_bk.cnfの「bind-address=127.0.0.1」をコメントアウト→mariadb再起動

原因

バックアップとして作成していた上記cnfの設定を読み込んでいたことが原因。
/etc/mysql/my.cnfの下記コメントを見落としていました…

# Import all .cnf files from configuration directory ←構成ディレクトリ内のすべてのcnfを読み込む !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mariadb.conf.d/

原因発覚にいたるまで

$ ss -l →*:mysqlがない $ netstat -ant | grep LISTEN →127.0.0.1:3306

⇒bind-addressコメントアウトしたつもりだったが外部接続できていないらしい。confファイルを見直す⇒原因発覚

dameoさん、ありがとうございました。

投稿2021/03/03 05:56

mnmnmmmn

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問