Bir docker kapsayıcısındaki bir sunucuda Postgresql var. Dışarıdan, yani yerel bilgisayarımdan nasıl bağlanabilirim? Buna izin vermek için hangi ayarı yapmalıyım?
Bir docker kapsayıcısındaki bir sunucuda Postgresql var. Dışarıdan, yani yerel bilgisayarımdan nasıl bağlanabilirim? Buna izin vermek için hangi ayarı yapmalıyım?
Yanıtlar:
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.
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
Linux üzerinde çalıştırmayı başardım
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
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
sudo
konteynırınızı çalıştırmak için kullanmamalısınız .
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
su postgres
?
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
-e POSTGRES_DB=my-db
postgres yerine my-db oluşturmak için
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.
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
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.
/var/lib/mysql
?
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,psql
komutlarla 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 :pgadmin
veyagibi bir veritabanı istemci uygulaması açındbeaver
ve bağlantı alanlarına aşağıdakileri girin:
Host: localhost
Database: test
User: postgres
Password: password
Adım 8 : Sorguyuselect * from test_table
sorgu düzenleyicisinegirin, çıktıyı görebilmeniz gerekir123
Nedense 5432 portu korumalı görünüyor. Bağlantı noktası yapılandırmamı olarak 5432:5432
değiştirdim 5416:5432
ve 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>
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.
ö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>
docker ps -a
kapsayıcı kimlikleri almak için docker exec -it psql -U -W
@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.