도커 컨테이너의 서버에 Postgresql이 있습니다. 외부, 즉 로컬 컴퓨터에서 어떻게 연결할 수 있습니까? 이를 위해 어떤 설정을 적용해야합니까?
도커 컨테이너의 서버에 Postgresql이 있습니다. 외부, 즉 로컬 컴퓨터에서 어떻게 연결할 수 있습니까? 이를 위해 어떤 설정을 적용해야합니까?
답변:
이 방법으로 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에서 실행중인)에 액세스하고 있습니다.
이 게시물 에서는 자세히 설명되어 있습니다.
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
나는 리눅스에서 실행할 수 있었다.
docker postgres를 실행하십시오-포트가 게시되어 있는지 확인하십시오. 경량이므로 알파인을 사용합니다.
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
다른 터미널을 사용하여 postgres uri를 사용하여 호스트에서 데이터베이스에 액세스
psql postgresql://postgres:1234@localhost:5432/postgres
Mac 사용자의 경우 psql을 pgcli로 교체하십시오.
sudo
컨테이너를 실행 하는 데 사용해서는 안됩니다 .
다음과 같이 docker exec 명령을 통해 액세스 할 수도 있습니다.
$ docker exec -it postgres-container bash
# su postgres
$ psql
또는
$ docker exec -it postgres-container psql -U postgres
su postgres
합니까?
이미 호스트 컴퓨터에서 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 만들기
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로 액세스 할 수 없었습니다.
로컬 호스트에서 연결하려면 '--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
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
이것은 내가 공유하고 싶었던 나의 경험이었습니다. 아마도 누군가가 그것을 이용할 수 있습니다.
/var/lib/mysql
?
컨테이너 외부에 연결할 때마다 컨테이너에있는 데이터를 볼 수 있기를 원한다고 가정합니다 . 이렇게하려면 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
어떤 이유로 5432 포트는 보호 된 것으로 보입니다. 포트 구성을에서 5432:5432
로 변경 5416:5432
했으며 다음 명령 이 docker 컨테이너 외부에서 postgres 데이터베이스 에 연결하는 데 효과적이었습니다 .
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
호스트 시스템에서 이미 서비스를 실행 중일 것이므로 localhost : 5432에 바인딩하여 사용하지 못하게 될 것입니다. 컨테이너 내의 다른 호스트 포트를 기본 포트 5432에 매핑하는 것이 좋은 해결책입니다. 또는 호스트에서 postgres 서비스를 중지 할 수 있지만 필요한 것으로 사용되었을 수 있습니다.
docker ps -a
컨테이너 ID를 얻으려면 docker exec -it psql -U -W