외부에서 도커 컨테이너의 PostgreSQL에 연결


202

도커 컨테이너의 서버에 Postgresql이 있습니다. 외부, 즉 로컬 컴퓨터에서 어떻게 연결할 수 있습니까? 이를 위해 어떤 설정을 적용해야합니까?


1
postresql을 시작하기 위해 어떤 명령을 사용 했습니까? 당신은 포트를 노출하고 그것을 매핑 할 수 있습니다
lvthillo

답변:


318

이 방법으로 Postgres를 실행할 수 있습니다 (포트 매핑).

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

이제 컨테이너의 포트 5432를 서버의 포트 5432에 매핑했습니다. -p <host_port>:<container_port> 이제 postgres에 액세스 할 수 있습니다.public-server-ip:5432

테스트하려면 : postgres 데이터베이스를 실행하십시오 (위의 명령).

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

컨테이너 내부로 이동하여 데이터베이스를 작성하십시오.

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

로컬 호스트 (도구 또는 psql 클라이언트가있는 곳)로 이동하십시오.

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

(암호 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   

따라서 로컬 호스트에서 데이터베이스 (서버의 docker에서 실행중인)에 액세스하고 있습니다.

이 게시물 에서는 자세히 설명되어 있습니다.


1
@Tjorriemorrie postgres가 로컬 컴퓨터에서 실행되고 있습니까? 어쩌면 localhost 대신 127.0.0.1을 시도해 보았지만 충족되었습니다.
lvthillo

2
공개 IP 주소 받기 (osx) :ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

5
다양한 postgres / docker 관련 게시물 중 가장 유용한 게시물 중 하나입니다. 감사합니다.
rg88

1
@GarouDan 포트를 매핑하고 싶지 않지만 호스트에서 postgres 컨테이너에 계속 액세스하려면 다음과 같이 호스트 네트워크에 컨테이너를 배포해야합니다.docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
psql을 종료하면 \ q와 함께 작동합니다 (나 같은 초보자를위한 것)
Dirk Schumacher

43

나는 리눅스에서 실행할 수 있었다.

  1. docker postgres를 실행하십시오-포트가 게시되어 있는지 확인하십시오. 경량이므로 알파인을 사용합니다.

    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 사용자의 경우 psql을 pgcli로 교체하십시오.


7
누군가 컨테이너에 뛰어 들지 않고 연결하는 방법에 대해 답변했습니다. thnx.
PabTorre

1
sudo컨테이너를 실행 하는 데 사용해서는 안됩니다 .
Russ Bateman 19 :

30

다음과 같이 docker exec 명령을 통해 액세스 할 수도 있습니다.

$ docker exec -it postgres-container bash

# su postgres

$ psql

또는

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

3
psql -U postgres
Maryna Krasnova

그것은 놀랍게도 유용한 의견입니다
Dan Rosenstark

무엇을 su postgres합니까?
Breno

14

이미 호스트 컴퓨터에서 postgres를 실행 중이었고 네트워크 연결을 허용하고 싶지 않았으므로 컨테이너에서 임시 postgres 인스턴스를 실행하고 단 두 줄로 데이터베이스를 만들었습니다.

# 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를 만들려면 다음 을 추가 할 수도 있습니다. postgres 대신 my-db 만들기
framp at

13

Docker 컨테이너에서 postgres와 함께 django를 사용하고 있습니다. docker-compose 파일에서 다음을 추가하십시오.

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

로컬 컴퓨터에서 액세스 가능한 포트를 추가합니다. 나는 DBeaver를 연결했다. 이렇게하면 앱 요청과 로컬 컴퓨터 요청 간의 포트 충돌이 방지됩니다. 처음에는 포트 5432가 (django 앱에서 사용 중) 사용 중이라는 메시지가 표시되어 pgAdmin 또는 DBeaver로 액세스 할 수 없었습니다.


1
나는 이것이 가장 도움이된다는 것을 알았다. 도커 작곡을 사용하는 사람들에게는 이것이 가장 좋은 방법 인 것 같습니다.
David Frick

데이빗 감사합니다, 행복한 코딩!
omeraiman

9

로컬 호스트에서 연결하려면 '--net host'를 추가해야합니다.

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

다음을 사용하여 로컬 호스트에서 exec를 사용하지 않고 서버에 직접 액세스 할 수 있습니다.

psql -h localhost -p 5432 -U postgres

6

localhost (mac)에서 postgres 컨테이너에 연결하려고했습니다. docker-compose 파일의 포트를 5432에서 3306으로 변경하고 컨테이너를 시작했습니다. 내가 왜 그랬는지 모르겠다 : |

그런 다음 PSequel 및 관리자를 통해 postgres에 연결하려고 시도했지만 연결을 설정할 수 없습니다.

포트 5432로 다시 전환하면 모두 정상적으로 작동합니다.

  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

이것은 내가 공유하고 싶었던 나의 경험이었습니다. 아마도 누군가가 그것을 이용할 수 있습니다.


3
음량 경로 : /var/lib/mysql?
David Tabernero M.

5432는 Postgres 기본 포트입니다. 3306은 MySQL 기본 포트입니다. docker-compose에서 게시 된 포트를 변경하면 다른 포트를 사용하도록 지시하지 않는 한 연결에 사용하려는 클라이언트 도구도 기본적으로 포트 5432에 연결하려고 시도합니다.
다 보스

6

컨테이너 외부에 연결할 때마다 컨테이너에있는 데이터를 볼 수 있기를 원한다고 가정합니다 . 이렇게하려면 postgres 이미지에 데이터 를 유지 해야합니다 .

지속적인 데이터가없는 경우 처음 수행 한 모든 작업을 반복해야합니다.
3, 5, 6, 7, 8 단계 는 질문에 직접 답변합니다.

다음은 Windows 10 powershell에서 수행 한 전체 프로세스에 대한 자세한 개요입니다 (Linux 및 macOS에서도 명령이 동일 함).

1 단계 : 비 관리자 모드에서 powershell 시작

2 단계 : postgres docker 이미지 다운로드 :
docker pull postgres:latest

3 단계 : 분리 모드에서 도커 컨테이너를 시작하고 볼륨을 생성하고 대상에 바인딩하여 postgres 이미지에서 데이터를 유지합니다
( 참고 : 기본적으로 5432가 사용되는 기본 포트이지만 클라이언트의 연결 오류를 방지하기 위해 명시 적으로 명시하십시오) pgadmin, dbeaver 등)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

4 단계 : 컨테이너 실행 상태 확인
docker ps -a

5 단계 : 대화 형 모드에서 container_name으로 이동하십시오
( 참고 : 설치 중에 Linux 컨테이너를 확인한 경우 ls, pwd 등의 명령을 실행할 수 있습니다)
docker exec -it postgres-test psql -U postgres

6 단계 : 샘플 데이터를 작성하십시오. 이 시점psql에서 다음과 같은 방식으로 명령을 사용할 수 있습니다.

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

7 단계 : 오픈과 같은 데이터베이스 클라이언트 응용 프로그램pgadmin또는dbeaver과 연결 필드에서 아래를 입력 :

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

8 단계 :select * from test_table쿼리 편집기에서쿼리를입력하면 출력을 볼 수 있어야합니다123


5

어떤 이유로 5432 포트는 보호 된 것으로 보입니다. 포트 구성을에서 5432:5432로 변경 5416:5432했으며 다음 명령 이 docker 컨테이너 외부에서 postgres 데이터베이스연결하는 데 효과적이었습니다 .

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

그것은 나를 위해 작동하지만 인터넷에 대한 설명을 찾지 못했습니다. 찾았어요?
부정

2
@negas 아마도 postgres호스트 시스템에서 이미 서비스를 실행 중일 것이므로 localhost : 5432에 바인딩하여 사용하지 못하게 될 것입니다. 컨테이너 내의 다른 호스트 포트를 기본 포트 5432에 매핑하는 것이 좋은 해결책입니다. 또는 호스트에서 postgres 서비스를 중지 할 수 있지만 필요한 것으로 사용되었을 수 있습니다.
다 보스

5

먼저 postgres의 도커 이미지를 엽니 다.

docker exec -it <container_name>

그런 다음 루트를 얻습니다- root@868594e88b53:/# 데이터베이스 연결이 필요합니다.

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

1

장고 백엔드 응용 프로그램 인 경우 이와 같은 작업을 수행 할 수 있습니다.

docker exec -it container_id python manage.py dbshell

1

여기에는 좋은 대답이 있지만 postgres 데이터베이스 관리를위한 인터페이스를 원한다면 로컬 컴퓨터에 pgAdmin을 설치하고 IP 및 postgres 노출 포트 (기본값 : 5432)를 사용하여 원격 시스템에 연결할 수 있습니다.



-1

@Martin과 같은 docker-compose를 사용하면 이것이 늦다는 것을 알고 있습니다.

이것들은 컨테이너 내부의 psql에 연결하는 데 도움이 된 스 니펫입니다.

docker-compose run db bash

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

명성이 50 개나 없기 때문에 댓글을 달 수 없습니다. 이것이 도움이되기를 바랍니다.


Op는 외부에서 연결하려고합니다.
avizzzy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.