Saya baru-baru ini bermain-main dengan Docker dan QGIS dan telah menginstal sebuah wadah dengan mengikuti instruksi dalam tutorial ini .
Semuanya bekerja dengan baik, meskipun saya tidak dapat terhubung ke database localhost postgres yang berisi semua data GIS saya. Saya membayangkan ini karena database postgres saya tidak dikonfigurasi untuk menerima koneksi jarak jauh dan telah mengedit file konfigurasi postgres untuk memungkinkan koneksi jarak jauh menggunakan instruksi dalam artikel ini .
Saya masih mendapatkan pesan kesalahan ketika saya mencoba dan terhubung ke database saya yang menjalankan QGIS di Docker: tidak dapat terhubung ke server: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
Server postgres sedang berjalan, dan saya telah mengedit file pg_hba.conf saya untuk memungkinkan koneksi dari berbagai Alamat IP (172.17.0.0/32). Saya sebelumnya menanyakan alamat IP dari kontainer buruh pelabuhan yang menggunakan docker ps
dan meskipun alamat IP berubah, sejauh ini selalu berada di kisaran 172.17.0.x
Ada ide mengapa saya tidak dapat terhubung ke database ini? Mungkin sesuatu yang sangat sederhana yang saya bayangkan!
Saya menjalankan Ubuntu 14.04; Postgres 9.3
sumber
pg_hba.conf
ke alamat yang Anda sarankan, tetapi masih mendapatkan pesan kesalahan koneksi yang sama setelah berhenti dan memulai ulang layanan postgres. Saya telah menambahkan baris di bawah koneksi ipv4 saya - apakah ada tempat lain yang harus saya tambahkan alamat yang Anda sarankan? Atau, di aplikasi QGIS saya yang berjalan di Docker, apakah saya perlu mengubah info koneksi postgres? Misalnya, jika saya menghubungkan dari dalam kontainer buruh pelabuhan apakah tuan rumah masih 'localhost'?localhost
bukan sistem host di dalam container Docker Anda. Coba sambungkan ke alamat IP publik sistem host. Untuk menjaga agar container tetap portabel, Anda juga dapat memulai container dengan--add-host=database:<host-ip>
dan cukup gunakandatabase
sebagai nama host untuk menghubungkan ke host PostgreSQL Anda dari dalam container Docker./etc/postgresql/9.3/main/postgresql.conf
dan menambahkaneth0
alamat IP server saya kelisten_addresses
. Secara default hanyalisten_addresses
memiliki postgres mengikatlocalhost
.host-ip
adalah alamat ip dari mesin virtual atau kontainer buruh pelabuhan?Solusi Docker untuk Mac
17.06 dan seterusnya
Berkat komentar @Birchlabs, sekarang jauh lebih mudah dengan nama DNS khusus Mac yang tersedia :
Dari 17.12.0-cd-mac46,
docker.for.mac.host.internal
sebaiknya digunakan sebagai penggantidocker.for.mac.localhost
. Lihat catatan rilis untuk detailnya.Versi yang lebih lama
Jawaban @ helmbert menjelaskan masalahnya dengan baik. Tetapi Docker untuk Mac tidak mengekspos jaringan jembatan , jadi saya harus melakukan trik ini untuk mengatasi batasannya:
Buka
/usr/local/var/postgres/pg_hba.conf
dan tambahkan baris ini:Buka
/usr/local/var/postgres/postgresql.conf
dan edit perubahanlisten_addresses
:Muat ulang layanan dan luncurkan penampung Anda:
Apa yang dilakukan solusi ini pada dasarnya sama dengan jawaban @ helmbert, tetapi menggunakan alamat IP yang dilampirkan
lo0
alih-alihdocker0
antarmuka jaringan.sumber
docker.for.mac.localhost
. ini adalah IP mesin host Anda. mencari entri di database host penampung seperti ini:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
sejak 18.03, opsi lain masih tersedia tetapi tidak digunakan lagi ( Sumber ).Solusi Sederhana untuk mac:
Versi terbaru dari buruh pelabuhan (18.03) menawarkan solusi penerusan port bawaan. Di dalam kontainer buruh pelabuhan Anda cukup mengatur host db ke
host.docker.internal
. Ini akan diteruskan ke host tempat kontainer buruh pelabuhan berjalan.Dokumentasi untuk ini ada di sini: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
sumber
host.docker.internal
terbatas pada Mac hanya?Solusi sederhana
Tambahkan saja
--network=host
kedocker run
. Itu saja!Dengan cara ini kontainer akan menggunakan jaringan host, jadi
localhost
dan127.0.0.1
akan mengarah ke host (secara default mereka menunjuk ke sebuah kontainer). Contoh:sumber
Solusi yang diposting di sini tidak berfungsi untuk saya. Oleh karena itu, saya memposting jawaban ini untuk membantu seseorang yang menghadapi masalah serupa.
OS: Ubuntu 18
PostgreSQL: 9.5 (Di-host di Ubuntu)
Docker: Aplikasi Server (yang terhubung ke PostgreSQL)
Saya menggunakan docker-compose.yml untuk membangun aplikasi.
LANGKAH 1: Silakan tambahkan
host.docker.internal:<docker0 IP>
Untuk menemukan IP buruh pelabuhan
i.e. 172.17.0.1 (in my case)
Anda dapat menggunakan:ATAU
LANGKAH 2: Di postgresql.conf, ubah listen_addresses menjadi
listen_addresses = '*'
LANGKAH 3: Di pg_hba.conf, tambahkan baris ini
LANGKAH 4: Sekarang restart layanan postgresql menggunakan,
sudo service postgresql restart
LANGKAH 5: Silakan gunakan
host.docker.internal
nama host untuk menghubungkan database dari Aplikasi Server.Ex:
jdbc:postgresql://host.docker.internal:5432/bankDB
Nikmati!!
sumber
untuk docker-compose kamu bisa coba tambahkan saja
contoh:
https://docs.docker.com/compose/compose-file/#network_mode
sumber
Di Ubuntu:
Pertama Anda harus memeriksa apakah port Database Docker tersedia di sistem Anda dengan mengikuti perintah -
Contoh OUTPUT:
Berikut
3306
digunakan sebagai Docker Database Port pada 172.17.0.2 IP, Jika port ini tidak tersedia Jalankan perintah berikut -Sekarang, Anda dapat dengan mudah mengakses Database Docker dari sistem lokal Anda dengan mengikuti konfigurasi
Di CentOS:
Pertama Anda harus memeriksa apakah port Database Docker Tersedia di firewall Anda dengan mengikuti perintah -
Contoh OUTPUT:
Berikut
3307
digunakan sebagai Docker Database Port pada 172.17.0.2 IP, Jika port ini tidak tersedia Jalankan perintah berikut -Di server, Anda dapat menambahkan port secara permanen
Sekarang, Anda dapat dengan mudah mengakses Database Docker dari sistem lokal Anda dengan konfigurasi di atas.
sumber
Untuk mengatur sesuatu yang sederhana yang memungkinkan koneksi Postgresql dari container docker ke localhost saya, saya menggunakan ini di postgresql.conf:
Dan menambahkan pg_hba.conf ini:
Kemudian lakukan restart. Klien saya dari kontainer buruh pelabuhan (yang berada di 172.17.0.2) kemudian dapat terhubung ke Postgresql yang berjalan di localhost saya menggunakan host: kata sandi, database, nama pengguna dan kata sandi.
sumber
Satu hal lagi yang diperlukan untuk penyiapan saya adalah menambahkan
untuk
/etc/hosts
sehingga Docker akan menunjuk
172.17.0.1
sebagai nama host DB, dan tidak bergantung pada ip luar yang berubah untuk menemukan DB. Semoga ini bisa membantu orang lain dengan masalah ini!sumber
database
host--add-host=database:172.17.0.1
saat menjalankan penampung. Kemudian arahkan aplikasi Anda ke host tersebut. Ini menghindari hard-coding alamat IP di dalam wadah.--add-host=database:172.17.0.1
lebih disukaiSolusi lain adalah volume layanan, Anda dapat menentukan volume layanan dan memasang direktori Data PostgreSQL host di volume itu. Lihat file tulis yang diberikan untuk mengetahui detailnya.
Dengan melakukan ini, layanan PostgreSQL lain akan berjalan di bawah wadah tetapi menggunakan direktori data yang sama yang digunakan oleh layanan PostgreSQL host.
sumber