본문 바로가기
Coding

Docker 컨테이너 간에 Postgres 소켓을 공유하는 방법

by Jakegyllenhaal 2022. 5. 9.
반응형

Docker 컨테이너 간에 Postgres 소켓을 공유하는 방법

 

로컬이 아닌 컨테이너의 로컬 PG 세션

Unsplash의 캠페인 작성자 사진

Docker 컨테이너를 회전시키는 것은 매우 간단한 작업입니다. 이미지를 잡고 몇 가지 명령을 실행하면 몇 분 안에 전체 환경을 바로 사용할 수 있습니다. 상황이 그보다 조금 더 복잡해지면 어떻게 될까요?

지속성은 어떻습니까? 항구를 여는 것? 리소스 공유?

Postgres 컨테이너에 연결하는 많은 서비스로 복잡한 데이터베이스 설정을 구축하는 경우 주의하지 않으면 빠르게 엉망이 될 수 있습니다. Postgres 구성 및 악명 높은 관리 pg_hba 파일은 귀찮은 일이지만 더 쉬운 방법이 있습니다.

약간의 마법으로 데이터베이스가 바라보다 다른 서비스와 동일한 컨테이너에 있는 것처럼

기본적으로 대부분의 PG 구성에서는 일부 로컬 사용자가 데이터베이스에 연결할 수 있습니다. 포트를 열거나, 호스트를 허용하거나, 액세스 목록을 조작할 필요가 없습니다. 이 기사에서는 동일한 상위 호스트에 있는 컨테이너 간에 이 로컬 연결을 설정하고 공유하는 방법을 살펴보겠습니다. 이렇게 하면 복잡한 데이터베이스 배포를 설정하거나 기능이 풍부한 개발 환경을 구축할 때 시간을 절약할 수 있습니다.

이 가이드에서는 사용할 상위 호스트 시스템에 이미 Docker 및 Docker Compose 설정이 모두 있다고 가정합니다. 아직 확인하지 않았다면 아래 링크를 확인하세요.

또한 지속성 볼륨에 대한 일부 스토리지를 할당해야 합니다. 처음에는 많이 필요하지 않지만 호스트에 데이터베이스 데이터를 유지하려는 경우 예상 사용량에 맞는 경로와 크기를 선택하는 것이 좋습니다.

Docker가 호스트에서 사용할 준비가 되면 Compose 파일 빌드를 시작할 수 있습니다.

이 예에서는 docker-compose.yml 파일. 이렇게 하면 하나의 파일에서 한 번에 여러 컨테이너를 실행할 수 있습니다. 이 파일에는 두 개의 서비스가 있습니다. 첫 번째는 Postgres이고 두 번째는 로컬 데이터베이스 액세스가 필요한 테스트 애플리케이션입니다.

docker-compose.yml

이 파일에서 무슨 일이 일어나고 있는지 분석해 보겠습니다.

  • 두 가지 서비스(컨테이너)가 있습니다. 첫 번째는 Postgres 데이터베이스이고 두 번째는 "앱"입니다. 두 번째는 단순히 다음을 사용할 또 다른 Postgres 데이터베이스입니다. psql 첫 번째 데이터베이스에 연결합니다.
  • 두 컨테이너와 볼륨을 공유하여 첫 번째 Postgres에서 두 번째 Postgres로 Unix 소켓을 전달합니다. 이 소켓은 일반적으로 다음 위치에 있습니다. /var/run/postgresql.
  • 두 번째 "앱" 서비스에서는 이전 Postgres 이미지를 사용하고 다음을 사용하도록 진입점을 수정합니다. psql 데이터베이스에 연결하고 실행하려면 SELECT 버전 정보를 표시하는 문.
  • Postgres 버전은 동일한 컨테이너 내에서 로컬이 아닌 첫 번째 Postgres 인스턴스에 확실히 연결하는 방법을 보여주기 위해 "앱" 서비스에서 다릅니다. 실제 프로덕션 애플리케이션에서는 데이터베이스 어댑터나 일종의 ORM 라이브러리를 사용하고 소켓을 가리킵니다.
  • 우리는 또한 사용할 두 번째 "앱"서비스의 사용자를 변경합니다. postgres 대신에 root 따라서 데이터베이스의 소켓 또는 역할에 대한 권한을 변경할 필요가 없습니다. 프로덕션 애플리케이션은 적절한 권한이 있는 적절한 범위의 사용자를 사용해야 합니다.

이제 Docker Compose 파일을 실행하고 결과를 볼 차례입니다. 동일한 디렉토리 내에서 다음 명령을 실행하기만 하면 됩니다. docker-compose.yml 전체 구성을 실행하는 파일:

docker-compose up --build

빌드가 완료되면 다음 출력이 표시되어야 합니다.

Docker Compose 출력.

여기에서 데이터베이스가 시작되고 앱이 연결되고 SELECT 성공적으로 실행됩니다. 앱의 출력이 Postgres 버전을 어떻게 표시하는지 확인하십시오. 14 그리고 아니 12 앱 컨테이너에 설치된 버전입니다. 이것은 호스트에서 컨테이너에 마운트된 소켓에 연결되었음을 의미합니다.

컨테이너를 회전하는 데 문제가 있는 경우 다음 명령을 사용하여 모두 다시 빌드할 수 있습니다.

docker-compose up --build --force-recreate

이것은 단순히 테스트 앱이고 실제로 유용한 작업은 아니지만 동일한 방법을 사용하여 자신의 애플리케이션이나 서비스를 쉽게 연결할 수 있습니다.

이 방법을 사용하면 로컬 데이터베이스에 밀접하게 연결된 종속성으로 인해 컨테이너화하기 어려운 레거시 응용 프로그램을 처리하는 상황을 피할 수 있습니다. 대부분의 최신 데이터베이스 지원 응용 프로그램은 원격 데이터베이스 연결을 지원해야 하지만 소켓을 사용하여 연결하려는 경우가 있습니다.

보안이 중요하든 단순히 유연성이 부족하든 상관없이 컨테이너 간에 소켓을 공유하는 것은 빠르고 간단한 옵션입니다.

읽어 주셔서 감사합니다! 이 기사가 마음에 드셨다면 아래에서 제 다른 게시물을 확인하십시오.

2

반응형

댓글