๐Ÿ’พ Docker ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

study 2025๋…„ 5์›” 14์ผ

๐Ÿ’พ ๋„์ปค ์Šคํ† ๋ฆฌ์ง€

PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ํ…Œ์ŠคํŠธ:

# PostgreSQL ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
docker image pull postgres

# PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

# ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†
docker container exec -it {CONTAINER ID} /bin/bash

# PostgreSQL์— ์ ‘์†
$ psql -U postgres

# ์‚ฌ์šฉ์ž ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
postgres=# CREATE USER user01 PASSWORD '1234' SUPERUSER;
postgres=# CREATE DATABASE test01 OWNER user01;
postgres=# \c test01 user01

# ํ…Œ์ด๋ธ” ์ƒ์„ฑ
test01=# CREATE TABLE table01(
            id INTEGER PRIMARY KEY, 
            name VARCHAR(20)
         );
test01=# \dt
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | table01 | table | user01

# ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
test01=# INSERT INTO table01 (id, name) 
            VALUES(1, 'sajacaros');
test01=# \q
$ exit

# ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ํ›„ ๋ฐ์ดํ„ฐ ํ™•์ธ
docker container stop {CONTAINER ID} 
docker container start {CONTAINER ID}
docker container exec -it {CONTAINER ID} /bin/bash
$ psql -U postgres
postgres=# \c test01 user01
test01=# \dt
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | table01 | table | user01
test01=# SELECT * FROM table01;
 id |   name
----+-----------
  1 | sajacaros
test01=# \q
$ exit

# ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์†์‹ค
docker container stop {CONTAINER ID}
docker container rm {CONTAINER ID}
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
docker container exec -it {CONTAINER ID} /bin/bash
$ psql -U postgres
postgres=# \c test01 user01
connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  role "user01" does not exist
Previous connection kept
test01=# \q
$ exit
docker container stop {CONTAINER ID}
docker container rm {CONTAINER ID}

Volume๊ณผ Bind Mount ๐Ÿ—ƒ๏ธ

Docker ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํœ˜๋ฐœ์„ฑ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Docker๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Volume

Docker Volume์€ Docker์— ์˜ํ•ด ์™„์ „ํžˆ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•:

  • Docker ์—”์ง„์ด ๊ด€๋ฆฌํ•˜๋Š” ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ํŠน์ • ์˜์—ญ(๋ณดํ†ต /var/lib/docker/volumes/)์— ์ €์žฅ
  • Docker CLI ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ํ˜ธ์ŠคํŠธ๋‚˜ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์— ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ
  • ์‚ฌ์ „์— ์ปจํ…์ธ ๋กœ ๋ณผ๋ฅจ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ๋ณผ๋ฅจ ์ƒ์„ฑ
docker volume create my-data

# ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run -v my-data:/app/data nginx

์žฅ์ :

  • Docker์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด ๋ฐฑ์—…, ๋ณต์›, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์‰ฌ์›€
  • ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ์— ์ด์ƒ์ 
  • ํ˜ธ์ŠคํŠธ OS์™€ ๋…๋ฆฝ์ ์ธ ๋ฐฑ์—… ๊ฐ€๋Šฅ
  • ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋จ
# ๋ณผ๋ฅจ ๋ชฉ๋ก ํ™•์ธ
docker volume ls

# ์ƒˆ ๋ณผ๋ฅจ ์ƒ์„ฑ
docker volume create myvolume01

# ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜์—ฌ PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword --mount type=volume,source=myvolume01,target=/var/lib/postgresql/data -d postgres

# ๋ณผ๋ฅจ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
docker volume inspect myvolume01
[
    {
        "CreatedAt": "2025-05-10T23:48:48Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvolume01/_data",
        "Name": "myvolume01",
        "Options": null,
        "Scope": "local"
    }
]

Bind Mount

Bind Mount๋Š” ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋งˆ์šดํŠธํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•:

  • ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ์–ด๋А ์œ„์น˜๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ๋งˆ์šดํŠธ ๊ฐ€๋Šฅ
  • ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋™์ผํ•œ ํŒŒ์ผ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
  • ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ตฌ์กฐ์™€ OS์— ์˜์กด์ 

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ
docker run -v /host/path:/container/path nginx

์žฅ์ :

  • ๊ฐœ๋ฐœ ์ค‘ ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์ปจํ…Œ์ด๋„ˆ์— ๋ฐ˜์˜ ๊ฐ€๋Šฅ
  • ํ˜ธ์ŠคํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํŠน์ • ๋„๊ตฌ๋‚˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ์„ค์ • ๋ณ€๊ฒฝ ์‹œ ๋น ๋ฅธ ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ ์‚ฌ์ดํด ์ œ๊ณต
# Bind Mount๋ฅผ ์‚ฌ์šฉํ•œ PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker container run --name some-postgres2 -e POSTGRES_PASSWORD=mysecretpassword --mount type=bind,source=/home/sajacaros/work/ch04,target=/work -d postgres

์ฃผ์š” ์ฐจ์ด์  ๋น„๊ต โš–๏ธ

ํŠน์„ฑVolumeBind Mount
๊ด€๋ฆฌ ์ฃผ์ฒดDocker ์—”์ง„์‚ฌ์šฉ์ž(ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ)
์ €์žฅ ์œ„์น˜/var/lib/docker/volumes/ ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธํ˜ธ์ŠคํŠธ์˜ ์–ด๋А ์œ„์น˜๋“  ๊ฐ€๋Šฅ
๋‚ด์šฉ ๋ณ€๊ฒฝ์ฃผ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋งŒ ๋ณ€๊ฒฝํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
๋ฐฑ์—… ์šฉ์ด์„ฑ๋†’์Œ๋ณดํ†ต (ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ ์ข…์†)
์ด์‹์„ฑ๋†’์Œ๋‚ฎ์Œ (ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ์— ์˜์กด)
์šฉ๋„๋ฐ์ดํ„ฐ ์˜์†์„ฑ, ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๊ณต์œ ๊ฐœ๋ฐœํ™˜๊ฒฝ, ์„ค์ • ํŒŒ์ผ, ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ ๊ฐ์ง€

์‚ฌ์šฉ ๊ถŒ์žฅ ์‚ฌ๋ก€ ๐Ÿ’ก

  • Volume ์‚ฌ์šฉ ๊ถŒ์žฅ:
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ์†Œ
    • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ 
    • ๋ฐฑ์—… ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ
    • ๋„์ปค ์Šค์›œ ์„œ๋น„์Šค์—์„œ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ํ•„์š”์‹œ
  • Bind Mount ์‚ฌ์šฉ ๊ถŒ์žฅ:
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์†Œ์Šค ์ฝ”๋“œ ๊ณต์œ 
    • ์„ค์ • ํŒŒ์ผ ๊ณต์œ 
    • ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํŒŒ์ผ ๋น ๋ฅธ ์ „์†ก ํ•„์š”์‹œ
    • ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋„๊ตฌ๋‚˜ ๊ธฐ๋Šฅ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ

ํƒœ๊ทธ