<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩하는목수의 재무모델링</title>
    <link>https://blogger10136.tistory.com/</link>
    <description>코딩하는목수의 프로그램 개발기</description>
    <language>ko</language>
    <pubDate>Sat, 8 Aug 2026 04:18:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩하는목수</managingEditor>
    <item>
      <title>Docker로 PostgreSQL 생성 관리 예시</title>
      <link>https://blogger10136.tistory.com/1</link>
      <description>&lt;h1&gt;PostgreSQL 사용시 도커를 사용하는 이유&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터에 직접 설치하지 않아도 되서 편하게 만들 수 있고, OS 오염이 없음&lt;/li&gt;
&lt;li&gt;팀 또는 프로젝트마다 버전/설정을 격리할 수 있음&lt;/li&gt;
&lt;li&gt;설정을 파일(docker-compose.yml)로 남기면 누구나 똑같이 재현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 방법은 두가지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방법 1 - &lt;code&gt;docker run&lt;/code&gt; : 명령 한 줄로 빠르게 생성 가능. 단발성/실험용.&lt;/li&gt;
&lt;li&gt;방법 2 - &lt;code&gt;docker compose&lt;/code&gt; : 설정을 파일로 관리. 실제 프로젝트에서는 이 방식 사용을 권장.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;code&gt;&lt;/code&gt;&lt;/h1&gt;
&lt;h1&gt;&lt;code&gt;&lt;/code&gt;&lt;/h1&gt;
&lt;h1&gt;&lt;code&gt;&lt;/code&gt;&lt;/h1&gt;
&lt;h1&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 작성&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 루트에 &lt;code&gt;docker-compose.yml&lt;/code&gt; 작성&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;services:
  postgres:
    image: postgres:16
    container_name: my-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    ports:
      - &quot;5432:5432&quot;
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U appuser -d appdb&quot;]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pgdata:&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 서비스 정의(&lt;code&gt;services&lt;/code&gt;)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컴포즈로 실행할 컨테이너(서비스)들을 정의하는 최상위 블록&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;postgres:&lt;/code&gt; : 이 컨테이너의 서비스 이름. 도커 네트워크 내부의 컨테이너들끼리 서로를 부를 때 쓰는 주소 겸 역할명&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image: postgres:16&lt;/code&gt; : 도커 허브(Docker Hub)에서 가져올 이미지를 지정. 공식 PostgreSQL 16 버전 이미지를 사용하겠다는 의미&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_name: my-postgres&lt;/code&gt; : 실행될 컨테이너의 고유한 이름&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restart: unless-stopped&lt;/code&gt; : 컨테이너 재시작 정책. 사용자가 직접 멈추지(&lt;code&gt;docker stop&lt;/code&gt;) 않는 이상, 에러로 인해 종료되거나 컴퓨터(서버)가 재부팅될 때 컨테이너를 자동으로 다시 실행함.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;no&lt;/code&gt; : 기본값, 재시작 안함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;always&lt;/code&gt; : 무조건 다시 시작&lt;/li&gt;
&lt;li&gt;&lt;code&gt;on-failure&lt;/code&gt; : 비정상 종료시만 재시작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 환경 변수(&lt;code&gt;environment&lt;/code&gt;)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 내부에서 PostgreSQL이 처음 실행될 때 필요한 설정값들 지정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_USER: appuser&lt;/code&gt; : 데이터베이스의 최고 관리자(SuperUser) 계정 이름을 &lt;code&gt;appuser&lt;/code&gt;로 생성함.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_PASSWORD: secret&lt;/code&gt; : 해당 관리자 계정의 비밀번호를 &lt;code&gt;secret&lt;/code&gt;으로 설정함.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_DB: appdb&lt;/code&gt; : 컨테이너가 처음 실행될 때 기본적으로 만들어질 데이터베이스의 이름을 &lt;code&gt;appdb&lt;/code&gt;로 지정함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 포트 연결(&lt;code&gt;ports&lt;/code&gt;)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트(현재 내 컴퓨터 또는 서버)와 컨테이너 간의 네트워크 포트를 연결&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;- &quot;5432:5432&quot;&lt;/code&gt; : &lt;code&gt;[호스트 포트]:[컨테이너 포트]&lt;/code&gt; 형태. 내 컴퓨터의 5432포트로 들어오는 요청을, 컨테이너 내부의 5432포트(PostgreSQL 기본 포트)로 연결(포워딩)해 줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 데이터 저장소(&lt;code&gt;volumes&lt;/code&gt;)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컨테이너는 삭제되면 내부 데이터가 모두 삭제됨. 이를 방지하고 데이터를 영구 보존하기 위해 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;- pgdata:/var/lib/postgresql/data&lt;/code&gt; : 아래 정의되는 &lt;code&gt;pgdata&lt;/code&gt;라는 도커 관리 볼륨을, 컨테이너 내부에서 DB 데이터가 실제로 저장되는 경로(&lt;code&gt;/var/lib/postgresql/data&lt;/code&gt;)와 연결함. 이렇게 하면 컨테이너를 지웠다 다시 만들어도 데이터가 그대로 유지됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 볼륨 선언 (최하단 &lt;code&gt;volumes&lt;/code&gt;)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;pgdata:&lt;/code&gt; : 위 서비스 블록에서 사용한 &lt;code&gt;pgdata&lt;/code&gt;라는 이름의 '네임드 볼륨(Named Volume)'을 도커가 생성하고 관리하도록 선언하는 최상위 항목&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;도커 생성하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;docker-composer.yml&lt;/code&gt; 파일을 작성하고, 해당 폴더에서 아래와 같이 도커를 생성하고 시작합니다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ docker compose up -d      # 생성 + 시작
$ docker compose ps         # 상태 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;DB 접근하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 안에서 psql 실행&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;$ docker exec -it my-postgres psql -U appuser -d appdb&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;상태 및 로그, 시작/종료&lt;/h1&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ docker compose ps                    # 또는: docker ps
$ docker compose logs -f postgres      # 실시간 로그 (Ctrl+C로 보기 종료)

$ docker compose stop                  # 끄기(데이터&amp;middot;컨테이너 유지)
$ docker compose start                 # 다시 켜기
$ docker compose restart postgres      # 재시작&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;데이터 초기화&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB데이터는 볼륨에 저장되므로, 컨테이너를 지워도 데이터가 남음. 아래 세가지를 구분해서 사용해야 함.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령&lt;/th&gt;
&lt;th&gt;컨테이너&lt;/th&gt;
&lt;th&gt;데이터(볼륨)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;멈춤(유지)&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;제거&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down -v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;제거&lt;/td&gt;
&lt;td&gt;삭제(초기화)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>docker</category>
      <category>PostgreSQL</category>
      <author>코딩하는목수</author>
      <guid isPermaLink="true">https://blogger10136.tistory.com/1</guid>
      <comments>https://blogger10136.tistory.com/1#entry1comment</comments>
      <pubDate>Wed, 5 Aug 2026 18:06:03 +0900</pubDate>
    </item>
  </channel>
</rss>