Dışarıdan bir docker kapsayıcısında Postgresql'e bağlanma


Yanıtlar:


318

Postgres'i şu şekilde çalıştırabilirsiniz (bir bağlantı noktasını eşleyin):

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

Artık konteynerinizin 5432 numaralı bağlantı noktasını sunucunuzun 5432 numaralı bağlantı noktasına eşlediniz. -p <host_port>:<container_port> Artık postgres'lerinizepublic-server-ip:5432

Test etmek için: Postgres veritabanını çalıştırın (yukarıdaki komut)

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

Kapsayıcınızın içine girin ve bir veritabanı oluşturun:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Yerel ana makinenize (bazı araçların veya psql istemcinizin olduğu yerde) gidin.

psql -h public-ip-server -p 5432 -U postgres

(şifre yanlış şifre)

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   

Böylece, yerel ana makinenizden veritabanına (sunucudaki docker'da çalışan) erişiyorsunuz.

Gelen bu yazı o ayrıntılı olarak expained oluyor.


1
@Tjorriemorrie Postgresinizin yerel makinenizde çalıştığından emin misiniz? Belki localhost yerine 127.0.0.1'i deneyin ama tanıştığı için çalışıyor.
lvthillo

2
Genel IP adresinizi (osx) alın:ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

5
Çeşitli postgres / docker ile ilgili mesajların hepsinin bu en yararlı olduğunu bulduk. Teşekkür ederim.
rg88

1
@GarouDan, bir limanı eşlemek istemiyor ancak yine de ana makinenizden postgres konteynerine erişmek istiyorsanız, konteynerinizi şu şekilde ana bilgisayar ağına dağıtmanız gerekir:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
psql'den çıkma \ q ile çalışır (sadece benim gibi yeni başlayanlar için)
Dirk Schumacher

44

Linux üzerinde çalıştırmayı başardım

  1. liman işçisinin postgresini çalıştırın - portun yayınlandığından emin olun, hafif olduğu için alp kullanıyorum.

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

  2. başka bir terminal kullanarak, postgres uri'yi kullanarak ana bilgisayardan veritabanına erişin

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

mac kullanıcıları için psql yerine pgcli


7
Birisinin konteynere atlamaksızın nasıl bağlanacağını yanıtladı. thnx.
PabTorre

1
Gerçekten sudokonteynırınızı çalıştırmak için kullanmamalısınız .
Russ Bateman

30

Docker exec komutu ile aşağıdaki yollarla da erişebilirsiniz:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Veya

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

3
psql -U postgres
Maryna Krasnova

bu şaşırtıcı derecede faydalı bir yorum
Dan Rosenstark

Ne yapar su postgres?
Breno

14

Zaten ana makinede postgres çalışan vardı ve ağdan bağlantılara izin vermek istemiyordu, bu yüzden konteynerde geçici postgres örneği çalıştırdım ve sadece iki satırda veritabanı oluşturdum:

# 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

tek bir varsayılan veritabanı oluşturmak istiyorsanız, şunu da ekleyebilirsiniz: -e POSTGRES_DB=my-dbpostgres yerine my-db oluşturmak için
framp

13

Docker kapsayıcılarında postgres ile django kullanıyorum. docker-compose dosyasında aşağıdakileri ekleyin:

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

yerel makineniz tarafından erişilebilir port eklenecektir. kendim için DBeaver'ı bağladım. bu, uygulama isteğiniz ile yerel makine isteği arasında bağlantı noktası çakışmalarını önler. ilk başta, 5432 bağlantı noktasının (django uygulaması tarafından) kullanımda olduğunu söyleyen bir mesaj aldım, bu yüzden pgAdmin veya DBeaver ile erişemedim.


1
En yararlı buldum. Docker-compose uisng insanlar için, bu gitmek için en iyi yol gibi görünüyor.
David Frick

Teşekkürler David, mutlu kodlama!
omeraiman

9

Yerel ana bilgisayardan bağlanmak için '--net host' eklemeniz gerekir:

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

Sunucuya, yerel ana makinenizden exec kullanmadan, aşağıdakileri kullanarak doğrudan erişebilirsiniz:

psql -h localhost -p 5432 -U postgres

6

Ben bir postgres konteyner localhost (mac) bağlanmaya çalıştı. Docker-compose dosyasındaki bağlantı noktasını 5432'den 3306'ya değiştirdim ve konteyneri başlattım. Neden yaptığım hakkında bir fikrim yok: |

Sonra PSequel ve yönetici aracılığıyla postgres bağlanmaya çalıştı ve bağlantı kurulamadı.

5432 numaralı bağlantı noktasına geri döndükten sonra her şey yolunda gidiyor.

  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

Bu benim paylaşmak istediğim deneyimdi. Belki birisi bundan faydalanabilir.


3
Cilt yolu: /var/lib/mysql?
David Tabernero M.Haziran

5432 Postgres varsayılan bağlantı noktasıdır. 3306, MySQL varsayılan bağlantı noktasıdır. Docker-compose'da yayınlanan bağlantı noktasını değiştirirseniz, bağlanmak için kullanmaya çalıştığınız istemci araçları, başka bir bağlantı noktası kullanmasını söylemediğiniz sürece varsayılan olarak 5432 numaralı bağlantı noktasına bağlanmaya çalışır.
Davos

6

Dışarıdan her bağlandığınızda kapsayıcınızdaki verileri görüntülemek istediğinizi varsayıyorum . Bunu yapmak için, gerekecek devam postgres görüntü üzerinde veri.

Kalıcı verileriniz yoksa, ilk yaptığınız her şeyi tekrarlamanız gerekecektir.
Adım 3, 5, 6, 7 ve 8 sorunuzu doğrudan yanıtlar.

İşte Windows 10 powershell'de izlediğim tüm işlemin ayrıntılı bir özeti (komutlar Linux ve macOS'ta da aynıdır):

1. Adım : Powershell'i yönetici olmayan modda başlatın

Adım 2 : Postgres docker görüntüsünü indirin:
docker pull postgres:latest

Adım 3 : Docker kapsayıcısını bağımsız modda başlatın ve bir birim oluşturarak ve bir hedefe bağlayarak postgres görüntüdeki verileri saklayın
( Not : varsayılan olarak kullanılan 5432 bağlantı noktasıdır; ancak istemcilerden gelen bağlantı hatalarını önlemek için açıkça belirtin pgadmin, dbeaver vb.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Adım 4 : Çalışan konteynerlerin durumunu kontrol edin
docker ps -a

Adım 5 : Etkileşimli modda container_name'in içine girin
( Not : yükleme sırasında linux kaplarını kontrol ettiyseniz, burada ls, pwd vb. Komutlar yürütülebilir)
docker exec -it postgres-test psql -U postgres

6. Adım : Örnek veriler oluşturun. Bu noktada,psqlkomutlarla aşağıdaki şekildeoynayabilirsiniz:

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

Adım 7 :pgadminveyagibi bir veritabanı istemci uygulaması açındbeaverve bağlantı alanlarına aşağıdakileri girin:

Host: localhost
Database: test
User: postgres
Password: password

Adım 8 : Sorguyuselect * from test_tablesorgu düzenleyicisinegirin, çıktıyı görebilmeniz gerekir123


5

Nedense 5432 portu korumalı görünüyor. Bağlantı noktası yapılandırmamı olarak 5432:5432değiştirdim 5416:5432ve postgres veritabanınıza docker konteynerinin dışından bağlanmak için aşağıdaki komut çalıştı :

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

Benim için çalışıyor ama internette bir açıklama bulamadım. Buldun mu?
negas

2
@negas Büyük olasılıkla postgres, yerel makineye zaten bağlanacak olan hizmeti ana makinenizde çalıştırıyorsunuz : 5432, onu kullanmanızı engelliyor. Farklı bir ana bilgisayar bağlantı noktasını kabın içindeki varsayılan bağlantı noktası 5432 ile eşleştirmek bunun için iyi bir çözümdür; alternatif olarak postgres hizmetini ana makinenizde durdurabilirsiniz, ancak belki de ihtiyacınız olan bir şey için kullanılır.
Davos

5

önce postgres için docker görüntüsünü aç

docker exec -it <container_name>

o zaman u kök alacak - root@868594e88b53:/# veritabanı bağlantısı gerekir

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

1

Durumda, bir django arka uç uygulaması, böyle bir şey yapabilirsiniz.

docker exec -it container_id python manage.py dbshell

1

Burada iyi yanıtlar var, ancak postgres veritabanı yönetimi için bazı arayüzlere sahip olmak istiyorsanız, pgAdmin'i yerel bilgisayarınıza yükleyebilir ve IP'sini ve postgres maruz kalan portunu (varsayılan olarak 5432) kullanarak uzak makineye bağlanabilirsiniz.


0

docker ps -a kapsayıcı kimlikleri almak için docker exec -it psql -U -W


-1

@Martin gibi docker-compose kullandıysanız bunun geç olduğunu biliyorum.

Bunlar konteynerin içindeki psql'ye bağlanmama yardımcı olan parçacıklar

docker-compose run db bash

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

Yorum yapamam çünkü 50 itibarım yok. Umarım bu yardımcı olur.


Op dışarıdan bağlanmak istiyor.
avizzzy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.