मैं एक docker कंटेनर में एक सर्वर पर Postgresql है। मैं इसे अपने स्थानीय कंप्यूटर से बाहर से कैसे कनेक्ट कर सकता हूं? अनुमति देने के लिए मुझे क्या सेटिंग लागू करनी चाहिए?
मैं एक docker कंटेनर में एक सर्वर पर Postgresql है। मैं इसे अपने स्थानीय कंप्यूटर से बाहर से कैसे कनेक्ट कर सकता हूं? अनुमति देने के लिए मुझे क्या सेटिंग लागू करनी चाहिए?
जवाबों:
आप इस तरह से पोस्टग्रैज को चला सकते हैं (पोर्ट को मैप करें):
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
तो अब आपने अपने सर्वर के 5432 पोर्ट को अपने सर्वर के पोर्ट 5432 पर मैप कर दिया है। -p <host_port>:<container_port>
.तो अब आपके पोस्टग्रैड आपके से सुलभ हैंpublic-server-ip:5432
परीक्षण करने के लिए: पोस्टग्रेज डेटाबेस (ऊपर कमांड) चलाएँ
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05b3a3471f6f postgres "/docker-entrypoint.s" 1 seconds ago Up 1 seconds 0.0.0.0:5432->5432/tcp some-postgres
अपने कंटेनर के अंदर जाएं और एक डेटाबेस बनाएं:
docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q
अपने लोकलहोस्ट पर जाएं (जहां आपके पास कोई टूल या psql क्लाइंट है)।
psql -h public-ip-server -p 5432 -U postgres
(पासवर्ड mysecretpassword)
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
mytest | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres
इसलिए आप अपने लोकलहोस्ट से डेटाबेस (जो सर्वर में डूकर चल रहा है) को एक्सेस कर रहे हैं।
में इस पोस्ट में यह विस्तार से expained है।
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
मैं इसे लिनक्स पर चलाने में कामयाब रहा
docker postgres चलाएं - सुनिश्चित करें कि पोर्ट प्रकाशित है, मैं अल्पाइन का उपयोग करता हूं क्योंकि यह हल्का है।
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
दूसरे टर्मिनल का उपयोग करते हुए, पोस्टग्रैड यूरी का उपयोग करके होस्ट से डेटाबेस तक पहुंचें
psql postgresql://postgres:1234@localhost:5432/postgres
मैक उपयोगकर्ताओं के लिए, psgl को pgcli से बदलें
sudo
अपने कंटेनर को चलाने के लिए उपयोग नहीं करना चाहिए ।
तुम भी docker के माध्यम से पहुँच कर सकते हैं:
$ docker exec -it postgres-container bash
# su postgres
$ psql
या
$ docker exec -it postgres-container psql -U postgres
su postgres
है?
मेरे पास पहले से ही होस्ट मशीन पर पोस्टग्रेज चल रहे थे और नेटवर्क से कनेक्शन की अनुमति नहीं देना चाहते थे, इसलिए मैंने कंटेनर में अस्थायी पोस्टग्रेज उदाहरण चलाए और सिर्फ दो लाइनों में डेटाबेस बनाया:
# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres
# Create database
docker exec -it postgres-container createdb -U postgres my-db
-e POSTGRES_DB=my-db
पोस्टग्रेज के बजाय my-db बनाने के लिए
मैं django का उपयोग Docker कंटेनरों में पोस्टग्रेज के साथ कर रहा हूं। docker-compose फ़ाइल में, निम्नलिखित जोड़ें:
db:
image: postgres:10-alpine
environment:
- POSTGRES_DB=app
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=supersecretpassword
**ports:
- "6543:5432"**
जो आपके स्थानीय मशीन द्वारा सुलभ पोर्ट को जोड़ेगा। अपने लिए, मैंने इसके लिए DBeaver को जोड़ा। यह आपके ऐप अनुरोध और स्थानीय मशीन अनुरोध के बीच पोर्ट क्लैश को रोकेगा। सबसे पहले, मुझे एक संदेश मिला जिसमें कहा गया था कि पोर्ट 5432 उपयोग में है (जो कि django ऐप के द्वारा है) इसलिए मैं pgAdmin या DBeaver द्वारा एक्सेस नहीं कर सका।
लोकलहोस्ट से कनेक्ट करने के लिए आपको '--नेट होस्ट' को जोड़ना होगा:
docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
आप अपने लोकलहोस्ट से निष्पादन का उपयोग किए बिना सीधे सर्वर का उपयोग कर सकते हैं:
psql -h localhost -p 5432 -U postgres
मैंने लोकलहोस्ट (मैक) से एक पोस्टग्रेज कंटेनर से जुड़ने की कोशिश की। मैंने डॉकटर-कंपोज़ फ़ाइल में 5432 से 3306 तक पोर्ट बदल दिया और कंटेनर शुरू कर दिया। पता नहीं मैंने ऐसा क्यों किया: |
फिर मैंने पीएसपीसेल और व्यवस्थापक के माध्यम से पोस्टग्रेज से कनेक्ट करने की कोशिश की और कनेक्शन स्थापित नहीं किया जा सका।
5432 पोर्ट पर वापस जाने के बाद सभी ठीक काम करता है।
db:
image: postgres
ports:
- 5432:5432
restart: always
volumes:
- "db_sql:/var/lib/mysql"
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres_db
यह मेरा अनुभव था जिसे मैं साझा करना चाहता था। शायद कोई इसका उपयोग कर सकता है।
/var/lib/mysql
:?
मैं यह सोचते हैं रहा है कि आप अपने कंटेनर में डेटा मौजूद देखने में सक्षम होना चाहता हूँ हर आप बाहर से यह करने के लिए कनेक्ट। ऐसा करने के लिए, आपको पोस्टग्रेज छवि पर डेटा जारी रखना होगा ।
यदि आपके पास लगातार डेटा नहीं है, तो आपको पहली बार किया गया सब कुछ दोहराना होगा।
चरण 3, 5, 6, 7 और 8 आपके प्रश्न का सीधा उत्तर देते हैं।
यहाँ पूरी प्रक्रिया का विस्तृत अवलोकन है जो मैंने विंडोज 10 पॉवरशेल पर किया था (कमांड लिनक्स और मैकओएस में भी समान हैं):
चरण 1 : गैर-व्यवस्थापक मोड में शक्तियाँ प्रारंभ करें
चरण 2 : डाउनलोड करें पोस्टर छवि:
docker pull postgres:latest
चरण 3 : डिटैक्ड कंटेनर को डिटैच मोड में शुरू करें और एक वॉल्यूम बनाकर और इसे एक गंतव्य के लिए बाँधकर छवि को बनाए रखने के लिए डेटा को बनाए रखें
( नोट : डिफ़ॉल्ट रूप से 5432 डिफ़ॉल्ट पोर्ट है जिसका उपयोग किया जाता है; लेकिन यह स्पष्ट रूप से ग्राहकों की तरह कनेक्शन त्रुटियों को रोकने के लिए है। pgadmin, dbeaver, आदि)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest
चरण 4 : चल रहे कंटेनरों की स्थिति देखें
docker ps -a
चरण 5 : इंटरैक्टिव मोड में कंटेनर_नाम के अंदर जाएं
( नोट : एलएस, पीडब्ल्यूडी जैसे कमांड को यहां निष्पादित किया जा सकता है यदि आपने स्थापना के दौरान लिनक्स कंटेनर की जांच की है)
docker exec -it postgres-test psql -U postgres
चरण 6 : नमूना डेटा बनाएँ। इस बिंदु पर, आपpsql
निम्न तरीके से आदेशों केसाथ खेल सकते हैं:
# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q
चरण 7 : डेटाबेस क्लाइंट एप्लिकेशन को खोलेंpgadmin
याजैसेdbeaver
कनेक्शन फ़ील्ड में नीचे दर्ज करें:
Host: localhost
Database: test
User: postgres
Password: password
चरण 8 :select * from test_table
क्वेरी संपादक मेंक्वेरी दर्ज करेंऔर आपको आउटपुट देखने में सक्षम होना चाहिए123
किसी कारण से 5432 बंदरगाह संरक्षित लगता है। मैंने अपने पोर्ट कॉन्फ़िगर को इससे बदल दिया 5432:5432
है 5416:5432
और निम्न कमांड ने अपने dogr कंटेनर के बाहर से आपके पोस्टग्रेज डेटाबेस से कनेक्ट करने के लिए काम किया है :
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
अपने होस्ट मशीन पर सेवा चला रहे हैं जो पहले से ही लोकलहोस्ट से बंध जाएगा: 5432 आपको इसका उपयोग करने से रोक रहा है। कंटेनर के अंदर एक अलग होस्ट पोर्ट को डिफ़ॉल्ट पोर्ट 5432 में मैप करना उस का एक अच्छा समाधान है; वैकल्पिक रूप से आप अपने होस्ट पर पोस्टग्रेज सेवा को रोक सकते हैं, लेकिन शायद इसका उपयोग आपकी ज़रूरत के लिए किया जाता है।
पोस्टर्स के लिए पहले docker की छवि खोलें
docker exec -it <container_name>
फिर यू को रूट मिलेगा - root@868594e88b53:/#
इसके लिए डेटाबेस कनेक्शन की आवश्यकता है
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
docker ps -a
कंटेनर आईडी प्राप्त करने के लिए तब doit -it psql -U -W करें
मुझे पता है कि यह देर है, अगर आपने @ मर्टिन जैसे डॉकटर-कंपोज़ का इस्तेमाल किया है
ये वे स्निपेट्स हैं जिन्होंने मुझे कंटेनर के अंदर psql से जुड़ने में मदद की
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
मैं टिप्पणी नहीं कर सकता क्योंकि मेरे पास 50 प्रतिष्ठा नहीं है। तो उम्मीद है कि यह मदद करता है।