Kết nối với Postgresql trong một container docker từ bên ngoài


197

Tôi có Postgresql trên một máy chủ trong một container docker. Làm thế nào tôi có thể kết nối với nó từ bên ngoài, nghĩa là từ máy tính cục bộ của tôi? Tôi nên áp dụng cài đặt nào để cho phép điều đó?


1
bạn đã sử dụng lệnh nào để bắt đầu postresql? bạn có thể để lộ một cổng và lập bản đồ đó
lvthillo

Câu trả lời:


313

Bạn có thể chạy Postgres theo cách này (ánh xạ một cổng):

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

Vì vậy, bây giờ bạn đã ánh xạ cổng 5432 của container sang cổng 5432 của máy chủ của bạn. -p <host_port>:<container_port> . Vì vậy, bây giờ postgres của bạn có thể truy cập từpublic-server-ip:5432

Để kiểm tra: Chạy cơ sở dữ liệu postgres (lệnh ở trên)

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

Đi vào bên trong container của bạn và tạo một cơ sở dữ liệu:

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

Chuyển đến localhost của bạn (nơi bạn có một số công cụ hoặc máy khách psql).

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

(mật khẩu 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   

Vì vậy, bạn đang truy cập cơ sở dữ liệu (đang chạy trong docker trên máy chủ) từ localhost của bạn.

Trong bài viết này, nó được trình bày chi tiết.


1
@Tjorriemorrie Bạn có chắc rằng bưu điện của bạn đang chạy trên máy cục bộ của bạn không? Có thể thử 127.0.0.1 thay vì localhost nhưng để đáp ứng thì nó vẫn hoạt động.
lvthillo

2
Nhận địa chỉ IP công cộng của bạn (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

4
Trong số tất cả các bài đăng liên quan đến postgres / docker tôi đã thấy đây là một trong những bài viết hữu ích nhất. Cảm ơn bạn.
rg88

1
@GarouDan nếu bạn không muốn lập bản đồ một cổng nhưng vẫn muốn truy cập vào thùng chứa bưu điện từ máy chủ của mình, bạn sẽ cần triển khai container của mình trên mạng máy chủ như sau:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
thoát khỏi psql hoạt động với \ q (chỉ dành cho những người mới như tôi)
Dirk Schumacher

39

Tôi quản lý để có được nó chạy trên linux

  1. chạy các postgres docker - đảm bảo rằng cổng được xuất bản, tôi sử dụng alpine vì nó nhẹ.

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

  2. sử dụng thiết bị đầu cuối khác, truy cập cơ sở dữ liệu từ máy chủ bằng cách sử dụng postgres uri

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

Đối với người dùng mac, thay thế psql bằng pgcli


7
vui mừng vì ai đó đã trả lời làm thế nào để kết nối mà không nhảy vào container. thnx.
PabTorre

1
Bạn thực sự không nên sử dụng sudođể chạy container của bạn.
Russ Bateman

29

Bạn cũng có thể truy cập thông qua lệnh docker exec bằng cách:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Hoặc là

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

3
psql -U postgres
Maryna Krasnova

đó là một nhận xét hữu ích đáng ngạc nhiên
Dan Rosenstark

Không gì su postgreslàm gì?
Breno

14

Tôi đã chạy postgres trên máy chủ và không muốn cho phép kết nối từ mạng, vì vậy tôi đã chạy cá thể postgres tạm thời trong container và tạo cơ sở dữ liệu chỉ trong hai dòng:

# 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

nếu bạn muốn tạo một cơ sở dữ liệu mặc định duy nhất, bạn cũng có thể thêm: -e POSTGRES_DB=my-dbđể tạo my-db thay vì postgres
framp

13

Tôi đang sử dụng django với postgres trong Docker container. trong tập tin docker-compose, thêm vào như sau:

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

Nó sẽ thêm cổng có thể truy cập bằng máy cục bộ của bạn. Đối với bản thân tôi, tôi đã kết nối DBeaver với nó. điều này sẽ ngăn xung đột cổng giữa yêu cầu ứng dụng của bạn và yêu cầu máy cục bộ. Lúc đầu, tôi nhận được một thông báo nói rằng cổng 5432 đang được sử dụng (là ứng dụng django) vì vậy tôi không thể truy cập bằng pgAdmin hoặc DBeaver.


1
Tôi thấy điều này là hữu ích nhất. Đối với những người uisng docker-compose, đây có vẻ là cách tốt nhất để đi.
David Frick

Cảm ơn David, mã hóa hạnh phúc!
omeraiman

9

Để kết nối từ localhost, bạn cần thêm '--net host':

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

Bạn có thể truy cập máy chủ trực tiếp mà không cần sử dụng exec từ localhost của mình, bằng cách sử dụng:

psql -h localhost -p 5432 -U postgres

6

Tôi đã cố gắng kết nối từ localhost (mac) đến một thùng chứa postgres. Tôi đã thay đổi cổng trong tệp soạn thảo docker từ 5432 thành 3306 và khởi động container. Không biết tại sao tôi làm điều đó: |

Sau đó, tôi đã cố gắng kết nối với postgres thông qua PSequel và adminer và kết nối không thể được thiết lập.

Sau khi chuyển về cổng 5432, tất cả đều hoạt động tốt.

  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

Đây là kinh nghiệm của tôi, tôi muốn chia sẻ. Có lẽ ai đó có thể sử dụng nó.


3
Đường dẫn âm lượng : /var/lib/mysql?
David Tabernero M.

5432 là cổng mặc định của Postgres. 3306 là cổng mặc định của MySQL. Nếu bạn thay đổi cổng đã xuất bản trong docker-compose thì bất kỳ công cụ máy khách nào bạn cố sử dụng để kết nối cũng sẽ mặc định là cố gắng kết nối với cổng 5432 trừ khi bạn bảo họ sử dụng cổng khác.
Davos

6

Tôi giả sử rằng bạn muốn có thể xem dữ liệu có trong thùng chứa của mình mỗi khi bạn kết nối với nó từ bên ngoài. Để làm điều này, bạn sẽ phải duy trì dữ liệu trên hình ảnh postgres.

Nếu bạn không có dữ liệu liên tục, bạn sẽ phải lặp lại mọi thứ bạn đã làm lần đầu tiên.
Bước 3, 5, 6, 7 và 8 trả lời câu hỏi của bạn trực tiếp.

Dưới đây là tổng quan chi tiết về toàn bộ quá trình tôi đã thực hiện trên Windows 10 powershell (các lệnh cũng giống nhau trong Linux và macOS):

Bước 1 : Bắt đầu powershell ở chế độ không phải quản trị viên

Bước 2 : Tải xuống hình ảnh docker postgres:
docker pull postgres:latest

Bước 3 : Bắt đầu bộ chứa docker ở chế độ tách rời và duy trì dữ liệu trên hình ảnh postgres bằng cách tạo một khối lượng và ràng buộc nó với một đích
( Lưu ý : theo mặc định 5432 là cổng mặc định được sử dụng; nhưng hãy nêu rõ để tránh lỗi kết nối từ máy khách như pgadmin, dbeaver, v.v.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Bước 4 : Kiểm tra trạng thái của các container đang chạy
docker ps -a

Bước 5 : Vào bên trong container_name ở chế độ tương tác
( Lưu ý : các lệnh như ls, pwd, v.v. có thể được thực thi tại đây nếu bạn đã kiểm tra các thùng chứa linux trong khi cài đặt)
docker exec -it postgres-test psql -U postgres

Bước 6 : Tạo dữ liệu mẫu. Tại thời điểm này, bạn có thể chơi vớipsqlcác lệnh theo cách sau:

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

Bước 7 : Mở một ứng dụng khách cơ sở dữ liệu nhưpgadminhoặcdbeaver và nhập vào bên dưới trong các trường kết nối:

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

Bước 8 : Nhập truy vấnselect * from test_tablevào trình chỉnh sửa truy vấn và bạn sẽ có thể thấy đầu ra123


5

Đối với một số lý do cổng 5432 dường như được bảo vệ. Tôi đã thay đổi cấu hình cổng của mình từ 5432:5432thành 5416:5432và lệnh sau hoạt động để kết nối với cơ sở dữ liệu postgres của bạn từ bên ngoài bộ chứa docker của nó :

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

Nó có hiệu quả với tôi nhưng tôi không tìm thấy lời giải thích nào trên Internet. Bạn đã tìm?
negas

2
@negas Có lẽ bạn đang chạy postgresdịch vụ trên máy chủ của mình, nó sẽ liên kết với localhost: 5432 ngăn bạn sử dụng nó. Ánh xạ một cổng máy chủ khác đến cổng mặc định 5432 bên trong container là một giải pháp tốt cho điều đó; cách khác, bạn có thể dừng dịch vụ postgres trên máy chủ của mình nhưng có lẽ nó được sử dụng cho thứ bạn cần.
Davos

5

đầu tiên mở hình ảnh docker cho postgres

docker exec -it <container_name>

sau đó bạn sẽ nhận được root - root@868594e88b53:/# nó cần kết nối cơ sở dữ liệu

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

1

Trong trường hợp, nó là một ứng dụng phụ trợ django, bạn có thể làm một cái gì đó như thế này.

docker exec -it container_id python manage.py dbshell

1

Có câu trả lời tốt ở đây nhưng nếu bạn muốn có một số giao diện để quản lý cơ sở dữ liệu postgres, bạn có thể cài đặt pgAdmin trên máy tính cục bộ của mình và kết nối với máy từ xa bằng IP của nó và cổng tiếp xúc với postgres (theo mặc định 5432).



-1

Tôi biết điều này là muộn, nếu bạn đã sử dụng docker-compose như @Martin

Đây là những đoạn giúp tôi kết nối với psql bên trong container

docker-compose run db bash

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

Tôi không thể bình luận vì tôi không có 50 danh tiếng. Vì vậy, hy vọng điều này sẽ giúp.


Op muốn kết nối từ bên ngoài.
avizzzy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.