dockerで実行中のPostgreSQLデータベースへの接続


背景の説明
コンテナ化プロセスが加速するにつれて、従来の仮想マシンに比べて大きなメリットがあり、分散クラウドコンピューティングが勃発し、dockerに代表されるコンテナ化テクノロジーソリューションがますます流行しています.新興技術ではない技術として、結局dockerが使っている技術は何年も前から存在していたが、dockerの出現はこれらの技術を本当に組み合わせて、効果を発揮し始めただけだ.dockerは、仮想マシンのソリューションよりも少ないホストリソースを使用し、拡張性に優れ、個別のソフトウェアインストールよりも問題が少なく、導入が容易です.
特に、現在のマイクロサービスアーキテクチャやクラウドコンピューティングが盛んな時代には、dockerが長所を発揮する舞台がある.
問題の説明
個人の微信公衆号雑感123(注目を歓迎)の機能を開発する過程で徐々に完備している.最初は、データを格納するためにプロジェクトにデータベースが必要であり、マルチスレッド間のデカップリング方法として、いくつかの方法から選択する予定です.
  • mysql、redis、Postgres、leveldbなどの個別のデータベースをインストールします.
  • 上記のデータベースのdockerバージョンをインストールします.

  • その後、独立したソフトウェアをインストールする複雑さを考慮して、シナリオ2を採用し、最初はmysqlのdockerをインストールしようとしたが、webを発見した.pyで使用している接続mysqlのドライバMySQLdbはインストールできません.なぜなら、年を取っていて、久しぶりに更新したからです.そこでdockerバージョンのpostgresを選択しました.
    しかし、dockerバージョンのpostgresを独立したpythonスクリプトで接続する際に問題が発生しました.このブログの主な目的は、コンテナ内のデータベースを正常に接続するための個別のスクリプトを解決することです.
    環境設定
  • 今年双十一の時に最も安いアリ雲、単核2 G、40 Gハードディスク空間を購入し、3年で300元だった.もちろん通常のLinux環境でもこの機能をテストできます.注意しなければならないのは、アリクラウドのデフォルトは80ポート番号を占有し、アリクラウドシールドはこのポートを占有し、使用するwebである.pyフレームワークにはこのポートが必要で、アリ雲盾を閉じます.このブログでは、アリクラウドサーバがデフォルトで使用されています.
  • まず、サーバーを更新し、対応するソフトウェアをインストールします.
  • サーバを更新します(私のサーバインスタンスはcentosです).
    yum update
    yum install *
    
  • python 2をインストールします.7(サーバのデフォルトのインストール).
    yum install python***(Google)
    
  • インストールpip
  • webをインストールする.py、Postgresを接続するテストに使用します.
    pip install web.py
    
  • pythonテストスクリプトが作成されたディレクトリ
    mkdir wx
    
  • dockerバージョンのPostgresをインストールdocを読み、直接インストールします.
    # start a postgres instance         ,         docker     Postgres  ,       some-postgres(   ),   mysecretpassword(   ),         postgres,       postgres,        127.0.0.1
    docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
    
  • 対応するpythonドライバをインストールします.
    pip install psycopg2
    
  • 上記wxディレクトリの下に、以下のスクリプト
    # sql.py
    imoprt psycopg2
    try:
        connection = psycopg2.connect(user = "postgres",
                                      password = "root",
                                      host = "127.0.0.1",
                                      port = "5432",
                                      database = "postgres")
    
        cursor = connection.cursor()
        # Print PostgreSQL Connection properties
        print ( connection.get_dsn_parameters(),"
    "
    ) # Print PostgreSQL version cursor.execute("SELECT version();") record = cursor.fetchone() print("You are connected to - ", record,"
    "
    ) except (Exception, psycopg2.Error) as error : print ("Error while connecting to PostgreSQL", error) finally: #closing database connection. if(connection): cursor.close() connection.close() print("PostgreSQL connection is closed")
  • が書く.
    問題診断は上記のスクリプトで実行され、
    python sql.py
    
    /usr/lib64/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
      """)
    ('Error while connecting to PostgreSQL', OperationalError('could not connect to server: Connection refused
    \tIs the server running on host "
    127.0.0.1" and accepting
    \tTCP/IP connections on port 5432?
    ',)) Traceback (most recent call last): File "
    sql.py", line 22, in <module> if(connection): NameError: name 'connection' is not defined
    前半のpsycopg 2-binaryは注目せずに、このドライバが後でこの名前を呼ばない可能性があることを教えてくれただけで、私たちはしばらく気にしないで、結局今使えます.後で診断してみると、postgresのIPはlocalhostではなくdockerが割り当てたIPであることが問題である.では、問題は、docker用のIPは何でしょうか.
    docker ps
    
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
    81bac6277944        postgres            "docker-entrypoint..."   18 hours ago        Up 18 hours         5432/tcp              postgres
    
    上で実行されているコンテナの例に気づくことができます.私の本体コンテナの名前はpostgresであることに注意してください.このコンテナインスタンスの情報を参照する必要がある:
    docker inspect postgres
    
     "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "131fea24669611632eb4fdceb4c475c246a7e5ffa25746defd3c4ab45d93d55f",
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "Ports": {
                    "5432/tcp": null
                },
                "SandboxKey": "/var/run/docker/netns/131fea246696",
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "5d2a5af617dc56c11f95b874cd6e61a5f410d00b20c62e4ec1c12d13057c6234",
                "Gateway": "172.17.0.1",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.4",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "MacAddress": "02:42:ac:11:00:04",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "e91322f0782411ef7fdb56da968e30b8c0d19c95894f8fef993431c197660239",
                        "EndpointID": "5d2a5af617dc56c11f95b874cd6e61a5f410d00b20c62e4ec1c12d13057c6234",
                        "Gateway": "172.17.0.1",
                        "IPAddress": "172.17.0.4",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "02:42:ac:11:00:04"
                    }
                }
            }
    
    IPAddressというフィールドに注意することができる.このフィールドには現在のインスタンスのネットワーク関連パラメータが明記されている.上記の127.0.0.1パラメータを172.17.0.4に変更する必要がある.このパラメータは実際のdockerインスタンスが実行する実際のパラメータに基づいて設定し、パラメータをより後で上記sqlを実行する必要がある.pyスクリプト.
    [root@izm5eezkmfgg9tyd15gha9z wx]# python sql.py
    /usr/lib64/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
      """)
    ({'tty': '', 'sslcompression': '0', 'dbname': 'postgres', 'options': '', 'host': '172.17.0.4', 'target_session_attrs': 'any', 'user': 'postgres', 'sslmode': 'prefer', 'port': '5432', 'krbsrvname': 'postgres'}, '
    '
    ) ('You are connected to - ', ('PostgreSQL 11.1 (Debian 11.1-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit',), '
    '
    ) PostgreSQL connection is closed
    は、pythonスクリプトがdockerのpostgresをリンクすることに成功したことに気づくことができる.
    Note:
  • この戦略はLinuxリリース版で成功した.
  • はMacバージョンでは失敗したが、MacホストではpingがコンテナのIPを通じないため、関連するチュートリアルを完備してこの問題を解決した.自分ではやってみませんでした.参考にして、理論もあります.
  • Windows環境は試していません.なぜなら、自分のマシンがwin 7なので、dockerToolboxしか使用できず、インストールに成功しなかったからです.そして諦めた.