डॉकटर कंटेनर में Postgresql को बाहर से जोड़ना


198

मैं एक docker कंटेनर में एक सर्वर पर Postgresql है। मैं इसे अपने स्थानीय कंप्यूटर से बाहर से कैसे कनेक्ट कर सकता हूं? अनुमति देने के लिए मुझे क्या सेटिंग लागू करनी चाहिए?


1
Postresql को शुरू करने के लिए आपने किस कमांड का उपयोग किया? आप एक बंदरगाह को उजागर करने और इसे मैप करने में सक्षम हैं
lvthillo

इस संदर्भ लें reachmnadeem.wordpress.com/2020/06/02/...
craftsmannadeem

जवाबों:


314

आप इस तरह से पोस्टग्रैज को चला सकते हैं (पोर्ट को मैप करें):

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 है।


1
@Tjorriemorrie आपको यकीन है कि आपके पोस्टग्रेज आपके स्थानीय मशीन पर चल रहे हैं? हो सकता है कि लोकलहोस्ट की बजाय 127.0.0.1 कोशिश करें लेकिन मिले के लिए यह काम कर रहा है।
lvthillo

2
अपना सार्वजनिक आईपी पता (ओएसएक्स) प्राप्त करें:ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
पॉल

4
सभी विभिन्न पोस्टर्स / docker से संबंधित पोस्टों में से मैंने पाया है कि यह सबसे उपयोगी में से एक है। धन्यवाद।
rg88

1
@GarouDan यदि आप एक पोर्ट मैप नहीं करना चाहते हैं, लेकिन फिर भी अपने होस्ट से पोस्टग्रैज कंटेनर तक पहुंचना चाहते हैं, तो आपको अपने कंटेनर को होस्ट नेटवर्क पर इस तरह से तैनात करना होगा:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
एक्ज़िटिंग psql \ q के साथ काम करता है (सिर्फ मेरे जैसे नए लोगों के लिए)
डिर्क शूमाकर

40

मैं इसे लिनक्स पर चलाने में कामयाब रहा

  1. docker postgres चलाएं - सुनिश्चित करें कि पोर्ट प्रकाशित है, मैं अल्पाइन का उपयोग करता हूं क्योंकि यह हल्का है।

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. दूसरे टर्मिनल का उपयोग करते हुए, पोस्टग्रैड यूरी का उपयोग करके होस्ट से डेटाबेस तक पहुंचें

    psql postgresql://postgres:1234@localhost:5432/postgres

मैक उपयोगकर्ताओं के लिए, psgl को pgcli से बदलें


7
खुशी है कि किसी ने जवाब दिया कि कंटेनर में कूदने के बिना कैसे कनेक्ट किया जाए। thnx।
पाबोर्रे

1
आपको वास्तव में sudoअपने कंटेनर को चलाने के लिए उपयोग नहीं करना चाहिए ।
रस बेटमैन

29

तुम भी docker के माध्यम से पहुँच कर सकते हैं:

$ docker exec -it postgres-container bash

# su postgres

$ psql

या

$ docker exec -it postgres-container psql -U postgres

3
psql -U पोस्टग्रेट्स
मैरीना क्रास्नोवा

यह एक आश्चर्यजनक रूप से उपयोगी टिप्पणी है
Dan Rosenstark

क्या करता su postgresहै?
ब्रेनो

14

मेरे पास पहले से ही होस्ट मशीन पर पोस्टग्रेज चल रहे थे और नेटवर्क से कनेक्शन की अनुमति नहीं देना चाहते थे, इसलिए मैंने कंटेनर में अस्थायी पोस्टग्रेज उदाहरण चलाए और सिर्फ दो लाइनों में डेटाबेस बनाया:

# 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 बनाने के लिए
30

13

मैं 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 द्वारा एक्सेस नहीं कर सका।


1
मुझे यह सबसे ज्यादा मददगार लगा। लोगों के लिए डॉक-कंपोज़ करना, यह जाने का सबसे अच्छा तरीका लगता है।
डेविड फ्रिक

धन्यवाद डेविड, खुश कोडिंग!
ओमेरेमन

9

लोकलहोस्ट से कनेक्ट करने के लिए आपको '--नेट होस्ट' को जोड़ना होगा:

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

आप अपने लोकलहोस्ट से निष्पादन का उपयोग किए बिना सीधे सर्वर का उपयोग कर सकते हैं:

psql -h localhost -p 5432 -U postgres

6

मैंने लोकलहोस्ट (मैक) से एक पोस्टग्रेज कंटेनर से जुड़ने की कोशिश की। मैंने डॉकटर-कंपोज़ फ़ाइल में 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

यह मेरा अनुभव था जिसे मैं साझा करना चाहता था। शायद कोई इसका उपयोग कर सकता है।


3
मात्रा पथ /var/lib/mysql:?
डेविड टबरेरो एम।

5432 Postgres डिफ़ॉल्ट पोर्ट है। 3306 MySQL डिफ़ॉल्ट पोर्ट है। यदि आप प्रकाशित पोर्ट को डॉकटर-कंपोज़ में बदलते हैं, तो कनेक्ट करने के लिए आपके द्वारा उपयोग किए जाने वाले किसी भी क्लाइंट टूल को पोर्ट 5432 से कनेक्ट करने का प्रयास करने के लिए भी डिफ़ॉल्ट होगा जब तक कि आप उन्हें दूसरे पोर्ट का उपयोग करने के लिए नहीं कहेंगे।
दावोस

6

मैं यह सोचते हैं रहा है कि आप अपने कंटेनर में डेटा मौजूद देखने में सक्षम होना चाहता हूँ हर आप बाहर से यह करने के लिए कनेक्ट। ऐसा करने के लिए, आपको पोस्टग्रेज छवि पर डेटा जारी रखना होगा ।

यदि आपके पास लगातार डेटा नहीं है, तो आपको पहली बार किया गया सब कुछ दोहराना होगा।
चरण 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


5

किसी कारण से 5432 बंदरगाह संरक्षित लगता है। मैंने अपने पोर्ट कॉन्फ़िगर को इससे बदल दिया 5432:5432है 5416:5432और निम्न कमांड ने अपने dogr कंटेनर के बाहर से आपके पोस्टग्रेज डेटाबेस से कनेक्ट करने के लिए काम किया है :

psql -h localhost -p 5416 -U <my-user> -d <my-database>

यह मेरे लिए काम करता है लेकिन मुझे इंटरनेट पर स्पष्टीकरण नहीं मिला। आपको मिला क्या?
नेगास

2
@negas आप शायद पहले से ही postgresअपने होस्ट मशीन पर सेवा चला रहे हैं जो पहले से ही लोकलहोस्ट से बंध जाएगा: 5432 आपको इसका उपयोग करने से रोक रहा है। कंटेनर के अंदर एक अलग होस्ट पोर्ट को डिफ़ॉल्ट पोर्ट 5432 में मैप करना उस का एक अच्छा समाधान है; वैकल्पिक रूप से आप अपने होस्ट पर पोस्टग्रेज सेवा को रोक सकते हैं, लेकिन शायद इसका उपयोग आपकी ज़रूरत के लिए किया जाता है।
दावोस

5

पोस्टर्स के लिए पहले docker की छवि खोलें

docker exec -it <container_name>

फिर यू को रूट मिलेगा - root@868594e88b53:/# इसके लिए डेटाबेस कनेक्शन की आवश्यकता है

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

1

मामले में, यह एक django बैकएंड एप्लिकेशन है, आप इस तरह से कुछ कर सकते हैं।

docker exec -it container_id python manage.py dbshell

1

यहाँ अच्छे उत्तर हैं, लेकिन यदि आप डेटाबेस प्रबंधन के लिए कुछ इंटरफ़ेस रखना पसंद करते हैं, तो आप अपने स्थानीय कंप्यूटर पर pgAdmin स्थापित कर सकते हैं और इसके IP का उपयोग कर रिमोट मशीन से कनेक्ट हो सकते हैं और पोस्टग्रोज़ एक्सपोज़र पोर्ट (डिफ़ॉल्ट रूप से 5432)।



-1

मुझे पता है कि यह देर है, अगर आपने @ मर्टिन जैसे डॉकटर-कंपोज़ का इस्तेमाल किया है

ये वे स्निपेट्स हैं जिन्होंने मुझे कंटेनर के अंदर psql से जुड़ने में मदद की

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

मैं टिप्पणी नहीं कर सकता क्योंकि मेरे पास 50 प्रतिष्ठा नहीं है। तो उम्मीद है कि यह मदद करता है।


Op बाहर से जुड़ना चाहता है।
avizzzy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.