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 đó?
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 đó?
Câu trả lời:
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.
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
Tôi quản lý để có được nó chạy trên linux
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
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
sudo
để chạy container của bạn.
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
su postgres
làm gì?
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
-e POSTGRES_DB=my-db
để tạo my-db thay vì postgres
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.
Để 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
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ó.
/var/lib/mysql
?
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ớipsql
cá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ưpgadmin
hoặ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_table
vào trình chỉnh sửa truy vấn và bạn sẽ có thể thấy đầu ra123
Đố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:5432
thành 5416:5432
và 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>
postgres
dị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.
đầ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>
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
docker ps -a
để lấy id container thì docker exec -it psql -U -W
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.