Dockerコンテナ内のPythonスクリプトからローカルホスト上のmysqlデータベースに接続する方法

Riko

ローカルホスト(ubuntu 16.04)でmysqlデータベースを実行しています。同じホスト上に、Pythonスクリプトが実行されているDockerコンテナーがあります。このスクリプトは、ローカルホスト上のmysqldbに接続する必要があります。これらの投稿(post1post2)で説明されているように、ローカルデータベースにbind-address = 0.0.0.0を設定し、ローカルホストのIPアドレスを見つけて、Pythonスクリプトで使用してデータベースに接続しましたが、うまくいかない。以下に、セットアップとDockerコンテナーの実行方法を示します。私のPythonスクリプト(analysis.py)は次のようになります。

import pandas as pd
import sqlalchemy as db

def find_max_age():
   cnx = db.create_engine('mysql+mysqlconnector://root:[email protected]:3306/datasets')
   cnx_res = db.create_engine('mysql+mysqlconnector://root:[email protected]:3306/results')
   df = pd.read_sql("select * from test_table", cnx)
   idx = df['age'].idxmax() == df.index
   df_res = df[idx]

   df_res.to_sql('max_age4', con=cnx_res, index=False)


if __name__ == '__main__':
   find_max_age()

私のDockerfileは次のように見えます:

FROM python:2.7-slim
EXPOSE 80 3306
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r requirements.txt
COPY analysis.py /app
CMD python analysis.py

最後に、requirements.txtは次のようになります

mysql-connector-python
sqlalchemy
pandas

Dockerイメージを次のように作成します。

docker build -t max_age_app .

次に、このイメージを使用してコンテナーを次のように開始します。

docker run -d max_age_app:latest

コンテナは終了コード1で終了し、コンテナのそれぞれのログを見ると、次のエラーが見つかります。

> Traceback (most recent call last):
  File "analysis.py", line 24, in <module>
    find_max_age()
  File "analysis.py", line 11, in find_max_age
    df = pd.read_sql("select * from test_table", cnx)
  File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 397, in read_sql
    chunksize=chunksize)
  File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 1063, in read_query
    result = self.execute(*args)
  File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 954, in execute
    return self.connectable.execute(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2074, in execute
    connection = self.contextual_connect(close_with_result=True)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2123, in contextual_connect
    self._wrap_pool_connect(self.pool.connect, None),
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2162, in _wrap_pool_connect
    e, dialect, self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1476, in _handle_dbapi_exception_noconnection
    exc_info
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2158, in _wrap_pool_connect
    return fn()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 400, in connect
    return _ConnectionFairy._checkout(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 788, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 529, in checkout
    rec = pool._do_get()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 1193, in _do_get
    self._dec_overflow()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 1190, in _do_get
    return self._create_connection()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 347, in _create_connection
    return _ConnectionRecord(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 474, in __init__
    self.__connect(first_connect_check=True)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 671, in __connect
    connection = pool._invoke_creator(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 106, in connect
    return dialect.connect(*cargs, **cparams)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 412, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/local/lib/python2.7/site-packages/mysql/connector/__init__.py", line 172, in connect
    return CMySQLConnection(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 78, in __init__
    self.connect(**kwargs)
  File "/usr/local/lib/python2.7/site-packages/mysql/connector/abstracts.py", line 731, in connect
    self._open_connection()
  File "/usr/local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 179, in _open_connection
    sqlstate=exc.sqlstate)
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 2003 (HY000): Can't connect to MySQL server on '172.17.0.1' (111) (Background on this error at: http://sqlalche.me/e/4xp6)

localhostのIPを判別するために、ifconfigコマンドを使用しました。これにより、次のような結果が得られました。

docker0   Link encap:Ethernet  HWaddr 02:42:a2:a6:d7:ff  
          inet addr:172.17.0.1 

enp0s3    Link encap:Ethernet  HWaddr 08:00:27:bb:7e:b5  
          inet addr:10.0.2.15 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1 

そこで、コンテナ内からローカルデータベースに接続するために172.17.0.1を試しましたが、機能しませんでした。

コンテナ-pを起動するときにオプションを介してコンテナとローカルホストの間のポートを一致させる必要がありますか?

助けていただければ幸いです。

Riko

この問題を解決するには、ローカルホストでmysqlデータベースを正しく構成する必要があります。上で説明したことに加えて、次の手順を実行する必要があります。

  • Pythonアプリを使用してDockerコンテナのIPアドレスを見つけます。を使用できますdocker inspect <container_name>
  • ローカルのmysqlデータベースに、そのIPアドレスの新しいユーザー(およびそれぞれのパスワード)を作成します。あなたがそれをする方法についての情報はあなたがこの投稿で見つけることができますmysqlでパスワードポリシーを設定する方法はここで説明されています

その後、コマンドでコンテナを起動するだけdocker run -d max_age_appで、Pythonスクリプトがローカルホスト上のデータベースにデータを書き込むことができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Dockerコンテナからローカルホスト上のMySQLに接続します

分類Dev

Dockerコンテナー内のキークローク+ホスト上のMySQLが[org.keycloak.services](ServerServiceスレッドプール-62)を与えるデータベースへの接続に失敗しました

分類Dev

ローカルにホストされているMySQLデータベースをDockerコンテナーに接続する方法

分類Dev

Dockerコンテナー内のローカルMySQLデータベースを接続していますか?

分類Dev

dockerコンテナーがローカル/ホストのpostgresデータベースに接続することを許可する

分類Dev

Dockerコンテナをホストマシンのlocalhostmysqlデータベースに接続する方法は?

分類Dev

ホストからデータベースに接続する方法-dockercomposeで実行されているコンテナー内のSQLサーバー

分類Dev

Dockerコンテナ内からホスト上のpostgresデータベースにアクセスする方法は?

分類Dev

リモートのMySQLデータベースに接続できないDockerコンテナをローカルで実行する

分類Dev

リモートホスト上のdockerコンテナ内でansibleタスクを実行するために接続する方法(ssh経由)

分類Dev

コンテナからDockerホストのpostgresqlデータベースに接続できません

分類Dev

VM boot2dockerコンテナ内から「実際の」ローカルホストに接続するにはどうすればよいですか?

分類Dev

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

分類Dev

Dockerホストのnginxからコンテナー内のアプリケーションに接続する方法

分類Dev

Dockerコンテナ内からローカルホストにリクエストを送信する

分類Dev

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

分類Dev

PHP-ローカルホストからherokuPostGresデータベースに接続する(Windowsの場合)

分類Dev

Dockerコンテナ内のホストからデータにアクセスする

分類Dev

ローカルホストの別のコンテナ内のコンテナからDockerポートにアクセスします

分類Dev

godaddyでホストされているリモートサーバーからローカルのMySqlデータベースにアクセスする方法

分類Dev

Herokuコンテナ化アプリからリモートSQLServerデータベースに接続する

分類Dev

Docker内のスクリプトで実行されるファイルをホストからDockerコンテナーにコピーします

分類Dev

Dockerコンテナ内からホストネットワーク上のIPアドレスに接続します

分類Dev

mqttブローカーDockerコンテナーに接続するテストDockerコンテナー内のPythonmqttクライアント

分類Dev

フラスコアプリケーションのDockerコンテナからローカルmongodbに接続する方法

分類Dev

ローカルdocker-composeから別のホストにコンテナを移行する方法

分類Dev

MySqlデータベースからリスト(コンソールベースのアプリ)にデータをロードする方法は?

分類Dev

DockerコンテナからローカルホストでMariaDBに接続します

分類Dev

ローカルホスト上のDockerコンテナ内のサーバーへの接続が非常に遅い

Related 関連記事

  1. 1

    Dockerコンテナからローカルホスト上のMySQLに接続します

  2. 2

    Dockerコンテナー内のキークローク+ホスト上のMySQLが[org.keycloak.services](ServerServiceスレッドプール-62)を与えるデータベースへの接続に失敗しました

  3. 3

    ローカルにホストされているMySQLデータベースをDockerコンテナーに接続する方法

  4. 4

    Dockerコンテナー内のローカルMySQLデータベースを接続していますか?

  5. 5

    dockerコンテナーがローカル/ホストのpostgresデータベースに接続することを許可する

  6. 6

    Dockerコンテナをホストマシンのlocalhostmysqlデータベースに接続する方法は?

  7. 7

    ホストからデータベースに接続する方法-dockercomposeで実行されているコンテナー内のSQLサーバー

  8. 8

    Dockerコンテナ内からホスト上のpostgresデータベースにアクセスする方法は?

  9. 9

    リモートのMySQLデータベースに接続できないDockerコンテナをローカルで実行する

  10. 10

    リモートホスト上のdockerコンテナ内でansibleタスクを実行するために接続する方法(ssh経由)

  11. 11

    コンテナからDockerホストのpostgresqlデータベースに接続できません

  12. 12

    VM boot2dockerコンテナ内から「実際の」ローカルホストに接続するにはどうすればよいですか?

  13. 13

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

  14. 14

    Dockerホストのnginxからコンテナー内のアプリケーションに接続する方法

  15. 15

    Dockerコンテナ内からローカルホストにリクエストを送信する

  16. 16

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

  17. 17

    PHP-ローカルホストからherokuPostGresデータベースに接続する(Windowsの場合)

  18. 18

    Dockerコンテナ内のホストからデータにアクセスする

  19. 19

    ローカルホストの別のコンテナ内のコンテナからDockerポートにアクセスします

  20. 20

    godaddyでホストされているリモートサーバーからローカルのMySqlデータベースにアクセスする方法

  21. 21

    Herokuコンテナ化アプリからリモートSQLServerデータベースに接続する

  22. 22

    Docker内のスクリプトで実行されるファイルをホストからDockerコンテナーにコピーします

  23. 23

    Dockerコンテナ内からホストネットワーク上のIPアドレスに接続します

  24. 24

    mqttブローカーDockerコンテナーに接続するテストDockerコンテナー内のPythonmqttクライアント

  25. 25

    フラスコアプリケーションのDockerコンテナからローカルmongodbに接続する方法

  26. 26

    ローカルdocker-composeから別のホストにコンテナを移行する方法

  27. 27

    MySqlデータベースからリスト(コンソールベースのアプリ)にデータをロードする方法は?

  28. 28

    DockerコンテナからローカルホストでMariaDBに接続します

  29. 29

    ローカルホスト上のDockerコンテナ内のサーバーへの接続が非常に遅い

ホットタグ

アーカイブ