가장 빨리 만나는 Docker 17장 - 3. PostgreSQL 데이터베이스 Dockerfile 작성하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker로 Ruby on Rails 애플리케이션 구축하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

PostgreSQL 데이터베이스 Dockerfile 작성하기

이제 데이터베이스 이미지를 생성합니다. postgresql 디렉터리를 생성하고 다음 내용을 Dockerfile로 저장합니다.

~$ mkdir postgresql
~$ cd postgresql
~/postgresql/Dockerfile
FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y postgresql-9.3

WORKDIR /etc/postgresql/9.3/main
RUN sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" postgresql.conf
RUN echo "host all all 0.0.0.0/0 password" >> pg_hba.conf

EXPOSE 5432

ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT /entrypoint.sh
  • apt-get update로 패키지 목록을 최신 상태로 업데이트한 뒤 postgresql-9.3 패키지를 설치합니다.
  • sed/etc/postgresql/9.3/main 디렉터리의 postgresql.conf 파일 내용을 수정합니다. #listen_addresses = 'localhost' 부분을 listen_addresses = '*'으로 수정합니다. 이 부분을 수정하지 않으면 외부에서 PostgreSQL에 접속할 수 없습니다.
  • pg_hba.conf 파일에 host all all 0.0.0.0/0 password를 추가하여 외부에서 접속했을 때는 비밀번호로 인증하도록 설정합니다.
  • entrypoint.sh 파일을 추가한 뒤 실행할 수 있도록 권한을 설정합니다.
  • EXPOSE에 5432을 설정하여 5432번 포트에 접속할 수 있도록 합니다.
  • ENTRYPOINT에 /entrypoint.sh 파일을 설정하여 컨테이너가 시작되었을 때 스크립트 파일을 실행합니다.

VOLUME
각자 상황에 따라 데이터베이스를 컨테이너 안에 저장하지 않고 VOLUME을 설정하여 호스트에 저장할 수도 있습니다.

VOLUME ["/var/lib/postgresql"]

다음 내용을 entrypoint.sh로 저장합니다.

~/postgresql/entrypoint.sh
#!/bin/bash

if [ -z $POSTGRESQL_PASSWORD ]; then
  exit 1
fi

POSTGRESQL_BIN=/usr/lib/postgresql/9.3/bin/postgres
POSTGRESQL_CONFIG_FILE=/etc/postgresql/9.3/main/postgresql.conf

POSTGRESQL_SINGLE="sudo -u postgres $POSTGRESQL_BIN --single --config-file=$POSTGRESQL_CONFIG_FILE"
$POSTGRESQL_SINGLE <<< "ALTER USER postgres PASSWORD '$POSTGRESQL_PASSWORD';" > /dev/null

exec sudo -u postgres $POSTGRESQL_BIN --config-file=$POSTGRESQL_CONFIG_FILE
  • 환경 변수에 POSTGRESQL_PASSWORD가 없으면 데이터베이스를 실행하지 않고 빠져나옵니다.
  • postgres를 싱글 모드로 실행한 뒤 postgres 계정의 비밀번호를 설정합니다. 비밀번호는 환경 변수의 POSTGRESQL_PASSWORD를 사용합니다. Dockerfile에서 비밀번호를 설정하지 않고 이곳에서 비밀번호를 설정하는 이유는 docker run 명령의 -e 옵션으로 비밀번호를 설정하기 위해서입니다. -e 옵션으로 설정한 환경 변수 값은 CMD, ENTRYPOINT에서만 사용할 수 있습니다.
  • postgres를 실행합니다. Nginx와 마찬가지로 PostgreSQL도 foreground로 실행합니다.

docker build 명령으로 이미지를 생성합니다.

~/postgresql$ sudo docker build --tag postgresql .

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2014-11-30