Connecting to Postgresql in a docker container from outside
我在Docker容器中的服务器上有Postgresql。 如何从外部(即从我的本地计算机)连接到它? 我应该采用什么设置才能允许?
你可以这样运行Postgres(映射端口):
1 | docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres |
所以现在您已将容器的端口5432映射到服务器的端口5432。
去测试:
运行postgres数据库(上面的命令)
1 2 3 | 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 |
进入容器内部并创建一个数据库:
1 2 3 4 | docker EXEC -it 05b3a3471f6f bash root@05b3a3471f6f:/# psql -U postgres postgres-# CREATE DATABASE mytest; postgres-# \q |
转到您的localhost(您有一些工具或psql客户端)。
1 | psql -h public-ip-server -p 5432 -U postgres |
(密码mysecretpassword)
1 2 3 4 5 6 7 8 | 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 |
因此,您从localhost访问数据库(在服务器上的docker中运行)。
在这篇文章中详细阐述了它。
我设法让它在Linux上运行
-
1首先运行docker postgres,确保端口发布,我使用alpine因为它是轻量级的。
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine -
2使用另一个终端,使用postgres uri从主机访问数据库
psql postgresql://postgres:1234@localhost:5432/postgres
对于mac用户,用pgcli替换psql
您也可以通过docker exec命令访问。
1 2 3 4 5 | $ docker EXEC -it postgres-container bash # su postgres $ psql |
我已经在主机上运行了postgres并且不想允许来自网络的连接,所以我确实在容器中运行了临时postgres实例并且只用两行创建了数据库:
1 2 3 4 5 | # 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 |
我在Docker容器中使用django和postgres。在docker-compose文件中,添加以下内容:
1 2 3 4 5 6 7 8 | db: image: postgres:10-alpine environment: - POSTGRES_DB=app - POSTGRES_USER=postgres - POSTGRES_PASSWORD=supersecretpassword **ports: -"6543:5432"** |
这将为您的本地计算机添加可访问端口。对于我自己,我将DBeaver连接到它。这将防止您的应用程序请求和本地计算机请求之间的端口冲突。
起初,我得到一条消息说端口5432正在使用(由django应用程序),所以我无法通过pgAdmin或DBeaver访问。
要从localhost连接,您需要添加'--net host':
1 | docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres |
您可以直接访问服务器,而无需使用localhost中的exec,方法是:
1 | psql -h localhost -p 5432 -U postgres |
我试图从localhost(mac)连接到postgres容器。我将docker-compose文件中的端口从5432更改为3306并启动了容器。不知道为什么我这样做了:|
然后我试图通过PSequel和adminer连接到postgres,并且无法建立连接。
切换回端口5432后,一切正常。
1 2 3 4 5 6 7 8 9 10 11 | 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 |
这是我想分享的经验。也许有人可以利用它。
首先打开postgres的docker图像
1 | docker EXEC -it <container_name> |
然后你会得到根 -
它需要数据库连接
1 | psql postgresql://<username>:<databasepassword>@postgres:5432/<database> |
出于某种原因5432端口似乎受到保护。我将端口配置从
1 | psql -h localhost -p 5416 -U <my-user> -d <my-database> |
这里有很好的答案,但是如果你想为postgres数据库管理提供一些界面,可以在本地计算机上安装pgAdmin,并使用其IP和postgres公开的端口连接到远程计算机(默认为5432)。
docker exec -it psql -U -W
如果它是一个django后端应用程序,你可以做这样的事情。
1 | docker EXEC -it container_id python manage.py dbshell |