Menghubungkan ke Postgresql dalam wadah buruh pelabuhan dari luar


197

Saya memiliki Postgresql di server dalam wadah buruh pelabuhan. Bagaimana saya bisa terhubung dari luar, yaitu dari komputer lokal saya? Pengaturan apa yang harus saya terapkan untuk memungkinkan itu?


1
perintah apa yang Anda gunakan untuk memulai postresql? Anda dapat mengekspos port dan memetakannya
lvthillo

Jawaban:


313

Anda dapat menjalankan Postgres dengan cara ini (memetakan porta):

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

Jadi sekarang Anda telah memetakan port 5432 wadah Anda ke port 5432 server Anda. -p <host_port>:<container_port> Jadi sekarang postgres Anda dapat diakses dari Andapublic-server-ip:5432

Untuk menguji: Jalankan database postgres (perintah di atas)

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

Masuk ke dalam wadah Anda dan buat database:

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

Pergi ke localhost Anda (di mana Anda memiliki beberapa alat atau klien psql).

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

(kata sandi 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   

Jadi Anda mengakses basis data (yang berjalan di buruh pelabuhan pada server) dari hosting Anda.

Dalam postingan ini dikeluarkan secara rinci.


1
@Tjorriemorrie Anda yakin postgres Anda berjalan di komputer lokal Anda? Mungkin mencoba 127.0.0.1 bukan localhost tetapi untuk bertemu itu berfungsi.
lvthillo

2
Dapatkan alamat IP publik Anda (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

4
Dari semua postingan terkait / berbagai docker terkait Saya telah menemukan ini adalah salah satu yang paling berguna. Terima kasih.
rg88

1
@ GarouDan jika Anda tidak ingin memetakan port tetapi masih ingin mengakses wadah postgres dari host Anda, Anda perlu menggunakan kontainer Anda di jaringan host seperti ini:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
keluar dari psql bekerja dengan \ q (hanya untuk pemula seperti saya)
Dirk Schumacher

39

Saya berhasil menjalankannya di linux

  1. Jalankan poster docker - pastikan portnya dipublikasikan, saya menggunakan alpine karena ringan.

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

  2. menggunakan terminal lain, akses database dari host menggunakan postgres uri

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

untuk pengguna mac, ganti psql dengan pgcli


7
senang bahwa seseorang menjawab bagaimana menghubungkan tanpa melompat ke wadah. thnx.
PabTorre

1
Anda benar-benar tidak boleh menggunakan sudountuk menjalankan wadah Anda.
Russ Bateman

29

Anda juga dapat mengakses melalui perintah docker exec dengan:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Atau

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

3
psql -U postgres
Maryna Krasnova

itu komentar yang sangat berguna
Dan Rosenstark

Apa yang su postgresharus dilakukan
Breno

14

Saya sudah menjalankan postgres di mesin host dan tidak ingin mengizinkan koneksi dari jaringan, jadi saya menjalankan instance postgres sementara dalam wadah dan membuat database hanya dalam dua baris:

# 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

jika Anda ingin membuat database default tunggal, Anda juga dapat menambahkan: -e POSTGRES_DB=my-dbuntuk membuat my-db alih-alih postgres
framp

13

Saya menggunakan Django dengan postgres di wadah Docker. dalam file pembuatan docker, tambahkan berikut ini:

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

yang akan menambah port yang dapat diakses oleh mesin lokal Anda. untuk diri saya sendiri, saya menghubungkan DBeaver ke sana. ini akan mencegah bentrokan port antara permintaan aplikasi Anda dan permintaan mesin lokal. pada awalnya, saya mendapat pesan yang mengatakan bahwa port 5432 sedang digunakan (yang oleh aplikasi Django) jadi saya tidak bisa mengakses dengan pgAdmin atau DBeaver.


1
Saya menemukan ini sebagai yang paling bermanfaat. Bagi orang-orang yang membuat komposisi buruh pelabuhan, ini sepertinya cara terbaik untuk pergi.
David Frick

Terima kasih David, selamat coding!
omeraiman

9

Untuk terhubung dari localhost, Anda perlu menambahkan '--net host':

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

Anda dapat mengakses server secara langsung tanpa menggunakan exec dari localhost Anda, dengan menggunakan:

psql -h localhost -p 5432 -U postgres

6

Saya mencoba menghubungkan dari localhost (mac) ke wadah postgres. Saya mengubah port di file docker-compose dari 5432 menjadi 3306 dan memulai wadah. Tidak tahu mengapa saya melakukannya: |

Kemudian saya mencoba terhubung ke postgres via PSequel dan adminer dan koneksi tidak dapat dibangun.

Setelah beralih kembali ke port 5432 semua berfungsi dengan baik.

  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

Ini adalah pengalaman yang ingin saya bagikan. Mungkin seseorang dapat memanfaatkannya.


3
Volume jalan: /var/lib/mysql?
David Tabernero M.

5432 adalah port default Postgres. 3306 adalah port default MySQL. Jika Anda mengubah port yang diterbitkan di docker-compose maka alat klien apa pun yang Anda coba gunakan untuk terhubung juga akan default untuk mencoba terhubung ke port 5432 kecuali Anda menyuruh mereka menggunakan port lain.
Davos

6

Saya berasumsi bahwa Anda ingin dapat melihat data yang ada di wadah Anda setiap kali Anda terhubung dari luar. Untuk melakukan ini, Anda harus bertahan data pada gambar postgres.

Jika Anda tidak memiliki data tahan, Anda harus mengulang semua yang Anda lakukan pertama kali.
Langkah 3, 5, 6, 7, dan 8 menjawab pertanyaan Anda secara langsung.

Berikut ini adalah ikhtisar terperinci dari seluruh proses yang saya ikuti pada Windows 10 PowerShell (perintahnya juga sama di Linux dan MacOS):

Langkah 1 : Mulai PowerShell dalam mode non-admin

Langkah 2 : Unduh gambar postgres docker:
docker pull postgres:latest

Langkah 3 : Mulai wadah buruh pelabuhan dalam mode terpisah dan tahan data pada gambar postgres dengan membuat volume dan mengikatnya ke tujuan
( Catatan : secara default 5432 adalah port default yang digunakan; tetapi nyatakan secara eksplisit untuk mencegah kesalahan koneksi dari klien seperti pgadmin, dbeaver, dll.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Langkah 4 : Periksa status wadah yang berjalan
docker ps -a

Langkah 5 : Masuk ke dalam container_name dalam mode interaktif
( Catatan : perintah seperti ls, pwd, dll. Dapat dieksekusi di sini jika Anda telah memeriksa wadah linux selama instalasi)
docker exec -it postgres-test psql -U postgres

Langkah 6 : Buat data sampel. Pada titik ini, Anda dapat bermain denganpsqlperintah dengan cara berikut:

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

Langkah 7 : Buka aplikasi klien basis data sepertipgadminataudbeaverdan masukkan di bawah ini di bidang koneksi:

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

Langkah 8 : Masukkan kueriselect * from test_tabledi editor kueri dan Anda akan dapat melihat hasilnya123


5

Untuk beberapa alasan 5432 port tampaknya dilindungi. Saya mengubah konfigurasi port saya dari 5432:5432menjadi 5416:5432dan perintah berikut berfungsi untuk menghubungkan ke database postgres Anda dari luar wadah buruh pelabuhan :

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

Ini berfungsi untuk saya, tetapi saya tidak menemukan penjelasan di Internet. Apakah kamu menemukan?
negas

2
@negas Anda mungkin sudah menjalankan postgreslayanan di mesin host Anda yang sudah akan mengikat ke localhost: 5432 mencegah Anda menggunakannya. Memetakan port host yang berbeda ke port default 5432 di dalam container adalah solusi yang bagus untuk itu; atau Anda dapat menghentikan layanan postgres pada host Anda, tetapi mungkin itu digunakan untuk sesuatu yang Anda butuhkan.
Davos

5

pertama buka gambar buruh pelabuhan untuk postgres

docker exec -it <container_name>

maka Anda akan mendapatkan root - root@868594e88b53:/# itu membutuhkan koneksi database

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

1

Dalam hal ini adalah aplikasi backend Django, Anda dapat melakukan sesuatu seperti ini.

docker exec -it container_id python manage.py dbshell

1

Ada jawaban yang baik di sini tetapi Jika Anda ingin memiliki antarmuka untuk manajemen basis data postgres, Anda dapat menginstal pgAdmin di komputer lokal Anda dan terhubung ke mesin jarak jauh menggunakan IP-nya dan port postposposed port (secara default 5432).


0

docker ps -a untuk mendapatkan id kontainer, maka docker exec -it psql -U -W


-1

Saya tahu ini terlambat, jika Anda menggunakan docker-compose seperti @Martin

Ini adalah cuplikan yang membantu saya terhubung ke psql di dalam wadah

docker-compose run db bash

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

Saya tidak dapat berkomentar karena saya tidak memiliki 50 reputasi. Jadi harap ini membantu.


Op ingin terhubung dari luar.
avizzzy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.