dockerで実行中のPostgreSQLデータベースへの接続
16650 ワード
背景の説明
コンテナ化プロセスが加速するにつれて、従来の仮想マシンに比べて大きなメリットがあり、分散クラウドコンピューティングが勃発し、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です). python 2をインストールします.7(サーバのデフォルトのインストール). インストールpip webをインストールする.py、Postgresを接続するテストに使用します. pythonテストスクリプトが作成されたディレクトリ dockerバージョンのPostgresをインストールdocを読み、直接インストールします. 対応するpythonドライバをインストールします. 上記wxディレクトリの下に、以下のスクリプト が書く.
問題診断は上記のスクリプトで実行され、
Note:この戦略はLinuxリリース版で成功した. はMacバージョンでは失敗したが、MacホストではpingがコンテナのIPを通じないため、関連するチュートリアルを完備してこの問題を解決した.自分ではやってみませんでした.参考にして、理論もあります. Windows環境は試していません.なぜなら、自分のマシンがwin 7なので、dockerToolboxしか使用できず、インストールに成功しなかったからです.そして諦めた.
コンテナ化プロセスが加速するにつれて、従来の仮想マシンに比べて大きなメリットがあり、分散クラウドコンピューティングが勃発し、dockerに代表されるコンテナ化テクノロジーソリューションがますます流行しています.新興技術ではない技術として、結局dockerが使っている技術は何年も前から存在していたが、dockerの出現はこれらの技術を本当に組み合わせて、効果を発揮し始めただけだ.dockerは、仮想マシンのソリューションよりも少ないホストリソースを使用し、拡張性に優れ、個別のソフトウェアインストールよりも問題が少なく、導入が容易です.
特に、現在のマイクロサービスアーキテクチャやクラウドコンピューティングが盛んな時代には、dockerが長所を発揮する舞台がある.
問題の説明
個人の微信公衆号雑感123(注目を歓迎)の機能を開発する過程で徐々に完備している.最初は、データを格納するためにプロジェクトにデータベースが必要であり、マルチスレッド間のデカップリング方法として、いくつかの方法から選択する予定です.
その後、独立したソフトウェアをインストールする複雑さを考慮して、シナリオ2を採用し、最初はmysqlのdockerをインストールしようとしたが、webを発見した.pyで使用している接続mysqlのドライバMySQLdbはインストールできません.なぜなら、年を取っていて、久しぶりに更新したからです.そこでdockerバージョンのpostgresを選択しました.
しかし、dockerバージョンのpostgresを独立したpythonスクリプトで接続する際に問題が発生しました.このブログの主な目的は、コンテナ内のデータベースを正常に接続するための個別のスクリプトを解決することです.
環境設定
yum update
yum install *
yum install python***(Google)
pip install web.py
mkdir wx
# 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
pip install psycopg2
# 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: