728x90
λ°˜μ‘ν˜•

6μž₯ 도컀 λ³Όλ₯¨μ„ μ΄μš©ν•œ νΌμ‹œμŠ€ν„΄νŠΈ μŠ€ν† λ¦¬μ§€

6.1 μ»¨ν…Œμ΄λ„ˆ 속 데이터가 μ‚¬λΌμ§€λŠ” 이유

  • μ»¨ν…Œμ΄λ„ˆμ˜ λ””μŠ€ν¬ μ—­μ‹œ 이미지 λ ˆμ΄μ–΄λ₯Ό μˆœμ„œλŒ€λ‘œ 합쳐 λ§Œλ“  가상 파일 μ‹œμŠ€ν…œμ΄λ‹€.
  • λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” λ…λ¦½λœ 파일 μ‹œμŠ€ν…œμ„ κ°–λŠ”λ‹€.
  • 즉, ν•œ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 파일 μ‹œμŠ€ν…œμ„ 톡해 νŒŒμΌμ„ μˆ˜μ •ν•˜λ”λΌλ„ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆλŠ” 영ν–₯을 받지 μ•ŠλŠ”λ‹€.
  • μ»¨ν…Œμ΄λ„ˆλ₯Ό μ’…λ£Œν•΄λ„ 파일 μ‹œμŠ€ν…œμ€ μ‚­μ œλ˜μ§€ μ•ŠλŠ”λ‹€.
$ docker container run --name rn1 diamol/ch06-random-number

$ docker container run --name rn2 diamol/ch06-random-number

$ docker container cp rn1:/random/number.txt number1.txt
$docker container cp rn2:/random/number.txt number2.txt

$ cat number1.txt
12370
$ cat number2.txt
254
  • μ»¨ν…Œμ΄λ„ˆμ˜ 파일 μ‹œμŠ€ν…œμ€ 단일 λ””μŠ€ν¬λ‹€. (Linux: /dev/sda1, Window: C:\)
  • 이 λ””μŠ€ν¬λŠ” 도컀가 μ—¬λŸ¬ μΆœμ²˜λ‘œλΆ€ν„° 합쳐 λ§Œλ“€κ³  μ»¨ν…Œμ΄λ„ˆμ— μ „λ‹¬ν•œ 가상 파일 μ‹œμŠ€ν…œμ΄λ‹€.
  • 이 μΆœμ²˜λŠ” 기본적으둜 이미지 λ ˆμ΄μ–΄μ™€ μ»¨ν…Œμ΄λ„ˆμ˜ 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄λ‘œ κ΅¬μ„±λœλ‹€.
  • 이미지 λ ˆμ΄μ–΄λŠ” λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ κ³΅μœ ν•˜μ§€λ§Œ 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄λŠ” μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ λ‹€λ₯΄λ‹€.
  • 이미지 λ ˆμ΄μ–΄λŠ” μ½κΈ°μ „μš©μ΄κ³ , 각 μ»¨ν…Œμ΄λ„ˆκ°€ λ”°λ‘œ κ°–λŠ” 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄λŠ” μ»¨ν…Œμ΄λ„ˆμ™€ 같은 생애주기λ₯Ό κ°–λŠ”λ‹€.
  • 이미지 λ ˆμ΄μ–΄λŠ” 이미지λ₯Ό λ‚΄λ €λ°›λŠ” μˆœκ°„λΆ€ν„° μ‚­μ œν•  λ•ŒκΉŒμ§€ 둜컬 μ»΄ν“¨ν„°μ˜ 이미지 λ ˆμ΄μ–΄μ— μ‘΄μž¬ν•œλ‹€.
  • μ“°κΈ° κ°€λŠ₯ λ ˆμ΄μ–΄λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  λ•Œ μƒμ„±λ˜λ©° μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•  λ•Œ ν•¨κ»˜ μ‚­μ œλœλ‹€. 즉, μ»¨ν…Œμ΄λ„ˆλ₯Ό μ’…λ£Œν•˜λŠ” κ²ƒμœΌλ‘œλŠ” μ‚­μ œλ˜μ§€ μ•ŠλŠ”λ‹€.

λ„μ»€μ˜ 기둝 쀑 볡사 (copy-on-write)

  • λ„μ»€μ˜ 이미지 λ ˆμ΄μ–΄λŠ” 읽기 μ „μš©μ΄λ‹€.
  • κ·ΈλŸ¬λ‚˜, λ„μ»€λŠ” 기둝 쀑 볡사(copy-on-write) λΌλŠ” 방법을 μ‚¬μš©ν•΄μ„œ 읽기 μ „μš© λ ˆμ΄μ–΄μ˜ νŒŒμΌμ„ μˆ˜μ •ν•  수 μžˆλ‹€.
  • μˆ˜μ •ν•  νŒŒμΌμ„ μ“°κΈ° κ°€λŠ₯ λ ˆμ΄μ–΄λ‘œ λ³΅μ‚¬ν•œ ν›„, μ“°κΈ° κ°€λŠ₯ λ ˆμ΄μ–΄μ—μ„œ μˆ˜μ •ν•œλ‹€.
  • 이 방법이 도컀가 μŠ€ν† λ¦¬μ§€λ₯Ό 맀우 효율적으둜 μ‚¬μš©ν•  수 μžˆλŠ” 비법이닀.
$ docker container run --name f1 diamol/ch06-file-display

...

<https://www.manning.com/books/learn-docker-in-a-month-of-lunches>

$ echo β€œ<http://eltonstoneman.com>” > url.txt

$ docker container cp url.txt f1:/input.txt

$ docker container start --attach f1
<http://eltonstoneman.com>
  • 둜컬 μ»΄ν“¨ν„°μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‘œ νŒŒμΌμ„ λ³΅μ‚¬ν•˜μ—¬ 재 μ‹€ν–‰μ‹œ 좜λ ₯값이 λ³€κ²½λ˜μ—ˆλ‹€.
  • μ»¨ν…Œμ΄λ„ˆ 속 νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆμ˜ λ™μž‘μ— 영ν–₯을 λ―ΈμΉœλ‹€.
  • κ·ΈλŸ¬λ‚˜, 이미지λ₯Ό κ³΅μœ ν•˜λŠ” λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆλ‚˜ μ΄λ―Έμ§€λŠ” 영ν–₯을 받지 μ•ŠλŠ”λ‹€.
  • μˆ˜μ •λœ νŒŒμΌμ„ ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆμ˜ 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄μ—λ§Œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • λ˜ν•œ, μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλŠ” μ΄λ―Έμ§€λ‘œλΆ€ν„° 받은 졜초의 λ‚΄μš©μ„ 담은 νŒŒμΌμ‹œμŠ€ν…œμ„ 가지며, f1 μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜λ©΄ μˆ˜μ •λœ νŒŒμΌλ„ 사라진닀.
$ docker container run --name f2 diamol/ch06-file-display

# κΈ°μ‘΄ μ΄λ―Έμ§€μ˜ νŒŒμΌλ‚΄μš©μΈ 것을 확인 κ°€λŠ₯.
<https://www.manning.com/books/learn-docker-in-a-month-of-lunches>

$ docker container rm -f f1

$ docker container cp f1:/input.txt .

# μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ μ‹œ 파일 μ‹œμŠ€ν…œμ˜ λ‚΄μš©λ„ μ‚­μ œλœ 것을 확인 κ°€λŠ₯.
Error response from daemon: No such container: f1
  • μ»¨ν…Œμ΄λ„ˆ 파일 μ‹œμŠ€ν…œμ€ μ»¨ν…Œμ΄λ„ˆμ™€ 같은 생애주기λ₯Ό κ°–λŠ”λ‹€.
  • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜λ©΄ 이 μ»¨ν…Œμ΄λ„ˆμ˜ 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄μ™€ μˆ˜μ •λœ 데이터도 ν•¨κ»˜ μ‚­μ œλœλ‹€.
  • 도컀 μ‚¬μš©μ— μžˆμ–΄ μ»¨ν…Œμ΄λ„ˆ μ‚­μ œλŠ” λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚œλ‹€.
  • λ”°λΌμ„œ, μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ 데이터λ₯Ό μ˜μ†μ μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” 도컀 λ³Όλ₯¨(Docker Volume), 마운트(Mount) λ₯Ό ν™œμš©ν•΄μ•Ό ν•œλ‹€.
  • 도컀 λ³Όλ₯¨κ³Ό λ§ˆμš΄νŠΈλŠ” μ»¨ν…Œμ΄λ„ˆμ™€λŠ” λ³„κ°œμ˜ 생애주기λ₯Ό κ°–μœΌλ―€λ‘œ μ»¨ν…Œμ΄λ„ˆκ°€ λŒ€μ²΄λ˜λ”λΌλ„ 데이터λ₯Ό μ§€μ†μ μœΌλ‘œ 관리할 수 μžˆλ‹€.

6.2 도컀 λ³Όλ₯¨μ„ μ‚¬μš©ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ν•˜κΈ°

  • 도컀 λ³Όλ₯¨μ€ λ„μ»€μ—μ„œ μŠ€ν† λ¦¬μ§€λ₯Ό λ‹€λ£¨λŠ” λ‹¨μœ„λ‹€.
  • λ³Όλ₯¨μ€ μ»¨ν…Œμ΄λ„ˆμ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜λ©°, λ³„λ„μ˜ 생애주기λ₯Ό κ°–λŠ”λ‹€.
  • νΌμ‹œμŠ€ν„΄μ‹œκ°€ ν•„μš”ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰ν•˜λ €λ©΄ λ³Όλ₯¨μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ‘œ 생성해도 λ‹€μ‹œ λ³Όλ₯¨μ„ μ—°κ²°ν•˜λ©΄ 데이터λ₯Ό μœ μ§€ν•  수 μžˆλ‹€.

μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ³Όλ₯¨μ„ μ‚¬μš©ν•˜λŠ” 방법

  • μˆ˜λ™μœΌλ‘œ 직접 λ³Όλ₯¨ μƒμ„±ν•΄μ„œ μ»¨ν…Œμ΄λ„ˆμ— μ—°κ²° ν•˜λŠ” 방법과 Dockerfile μŠ€ν¬λ¦½νŠΈμ—μ„œ VOLUME μΈμŠ€νŠΈλŸ­μ…˜μ„ μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€.
  • VOLUME μΈμŠ€νŠΈλŸ­μ…˜κ³Ό docker container --volume ν”Œλž˜κ·ΈλŠ” λ³„κ°œμ˜ κΈ°λŠ₯이닀.
  • VOLUME μΈμŠ€νŠΈλŸ­μ…˜μ€ 항상 μƒˆλ‘œμš΄ λ³Όλ₯¨μ„ ν•¨κ»˜ μƒμ„±ν•œλ‹€.
  • --volume ν”Œλž˜κ·ΈλŠ” 이미지에 λ³Όλ₯¨μ΄ μ •μ˜λ˜μ–΄ μžˆλ”λΌλ„ 항상 μ§€μ •λœ λ³Όλ₯¨μ„ μ»¨ν…Œμ΄λ„ˆμ— λ§ˆμš΄νŠΈν•œλ‹€.
  • --volume-from [container-name] μ΄λΌλŠ” λͺ…λ Ήμ–΄λ₯Ό 톡해 ν•˜λ‚˜μ˜ λ³Όλ₯¨μ„ μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆκ°€ κ³΅μœ ν•  수 μžˆλ‹€.
  • 즉, 이미지에 VOLUME μΈμŠ€νŠΈλŸ­μ…˜μ΄ μ •μ˜λ˜μ–΄ μžˆλ”λΌλ„ --volume ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•  경우, μƒˆλ‘œμš΄ λ³Όλ₯¨μ„ μƒμ„±ν•˜μ§€ μ•Šκ³  μ§€μ •λœ λ³Όλ₯¨μ„ μ‚¬μš©ν•œλ‹€.
  • λ³Όλ₯¨μ€ μ»¨ν…Œμ΄λ„ˆ κ°„ 파일 κ³΅μœ λ³΄λ‹€λŠ” μ—…λ°μ΄νŠΈ κ°„ μƒνƒœλ₯Ό λ³΄μ‘΄ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.
  • λ˜ν•œ, μ΄λ―Έμ§€μ—μ„œ μ •μ˜ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” λͺ…μ‹œμ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” 편이 더 λ‚«λ‹€.
FROM diamol/dotnet-aspnet
WORKDIR /app
ENTRYPOINT ["dotnet", "ToDoList.dll"]

# /data λ””λ ‰ν† λ¦¬μ˜ λ‚΄μš©μ€ λ³Όλ₯¨μ— 영ꡬ적으둜 μ €μž₯.
VOLUMN /data
COPY --from=builder /out/ .
$ docker container run --name todo1 -d -p 8010:80 diamol/ch06-todo-list
$ docker container inspect --format '{{.Mounts}}' todo1
[{volume 4441e43e17902fb5792ebdfa8c643b4bada7c81eaa7e501f84fc86fbb599c7df /var/lib/docker/volumes/4441e43e17902fb5792ebdfa8c643b4bada7c81eaa7e501f84fc86fbb599c7df/_data /data local  true }]
$ docker volume ls
DRIVER    VOLUME NAME
local     4441e43e17902fb5792ebdfa8c643b4bada7c81eaa7e501f84fc86fbb599c7df
...

# μƒˆλ‘œμš΄ λ³Όλ₯¨κ³Ό ν•¨κ»˜ 생성
$ docker container run --name todo2 -d diamol/ch06-todo-list

$ docker container exec todo2 ls /data

# todo1 μ»¨ν…Œμ΄λ„ˆμ˜ λ³Όλ₯¨μ„ 곡유
$ docker container run -d --name t3 --volumes-from todo1 diamol/ch06-todo-list

$ docker container exec t3 ls /data

# 볡사 λŒ€μƒ 경둜 ν™˜κ²½λ³€μˆ˜ μ •μ˜
$ target='/data'

# λ³Όλ₯¨ 생성
$ docker volume create todo-list

# μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker container run -d -p 8011:80 -v todo-list:$target --name todo-v1 diamol/ch06-todo-list

# <http://localhost:8011> 데이터 μΆ”κ°€

# v1 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
$ docker container rm -f todo-v1

# v1 이 μ‚¬μš©ν•˜λ˜ λ³Όλ₯¨ μ—°κ²°
$ docker container run -d -p 8011:80 -v todo-list:$target --name todo-v2 diamol/ch06-todo-list:v2

6.3 파일 μ‹œμŠ€ν…œ 마운트λ₯Ό μ‚¬μš©ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ν•˜κΈ°

  • λ³Όλ₯¨μ€ 호슀트 컴퓨터에 μ‘΄μž¬ν•˜μ§€λ§Œ, μ»¨ν…Œμ΄λ„ˆμ™€λŠ” λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€.
  • λ³Όλ₯¨μ˜ μž₯점은 μ»¨ν…Œμ΄λ„ˆμ™€ μŠ€ν† λ¦¬μ§€μ˜ 생애주기λ₯Ό λΆ„λ¦¬ν•˜λ©΄μ„œλ„ 도컀λ₯Ό μ‚¬μš©ν•˜λŠ” 방식 κ·ΈλŒ€λ‘œ μŠ€ν† λ¦¬μ§€λ₯Ό λ‹€λ£° 수 μžˆλ‹€λŠ” 점이닀.

λ°”μΈλ“œ 마운트(bind mou)λž€?

  • λ°”μš΄λ“œ λ§ˆμš΄νŠΈλŠ” 호슀트 컴퓨터 파일 μ‹œμŠ€ν…œμ˜ 디렉터리λ₯Ό μ»¨ν…Œμ΄λ„ˆ 파일 μ‹œμŠ€ν…œμ˜ λ””λ ‰ν„°λ¦¬λ‘œ λ§Œλ“ λ‹€.
  • λ°”μš΄λ“œ 마운트λ₯Ό μ‚¬μš©ν•˜λ©΄ 호슀트 μ»΄ν“¨ν„°μ˜ 파일 μ‹œμŠ€ν…œμ„ λͺ…μ‹œμ μœΌλ‘œ 지정해 μ»¨ν…Œμ΄λ„ˆ λ°μ΄ν„°λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • λ°”μΈλ“œ λ§ˆμš΄νŠΈλŠ” μ–‘λ°©ν–₯으둜 λ™μž‘ν•œλ‹€.
  • μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ§Œλ“  νŒŒμΌμ„ ν˜ΈμŠ€νŠΈμ—μ„œ μˆ˜μ •ν•  μˆ˜λ„ 있고, ν˜ΈμŠ€νŠΈμ—μ„œ λ§Œλ“  νŒŒμΌμ„ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μˆ˜μ •ν•  수 μžˆλ‹€.
$ source="$(pwd)/databases" && target='/data'

$ mkdir ./databases

$ docker container run --mount type=bind,source=$source,target=$target -d -p 8012:80 diamol/ch06-todo-list

$ curl <http://localhost:8012>

$ ls ./databases
  • μ»¨ν…Œμ΄λ„ˆλŠ” 보톡 호슀트 μ‹œμŠ€ν…œμ— λŒ€ν•œ 영ν–₯λ ₯을 μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 루트 κΆŒν•œμ΄ μ•„λ‹Œ 일반 μ‚¬μš©μžλ‘œ μ‹€ν–‰λœλ‹€.
  • κ·ΈλŸ¬λ‚˜, λ°”μΈλ“œ 마운트λ₯Ό μ‚¬μš©ν•˜λ©΄ 호슀트 컴퓨터 νŒŒμΌμ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ κΆŒν•œ μƒμŠΉ ν•„μš”ν•˜λ‹€.
  • κ·Έλž˜μ„œ, Dockerfile μŠ€ν¬λ¦½νŠΈμ—μ„œ USER μΈμŠ€νŠΈλŸ­μ…˜μ„ μ‚¬μš©ν•΄ μ»¨ν…Œμ΄λ„ˆμ— κ΄€λ¦¬μž κΆŒν•œμ„ λΆ€μ—¬ν•œλ‹€.
  • νŒŒμΌμ— μ“°κΈ° μž‘μ—…μ„ ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ 호슀트 μ»΄ν“¨ν„°μ˜ 디렉터리λ₯Ό 읽기 μ „μš©μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆμ— μ—°κ²°ν•  μˆ˜λ„ μžˆλ‹€.
  • 이 방법은 주둜 conf 같이 μ„€μ •νŒŒμΌμ„ ν˜ΈμŠ€νŠΈμ— λ§ˆμš΄νŠΈν•΄λ‘κ³ , μ΄λ―Έμ§€μ˜ 변경없이 호슀트의 conf 파일 μˆ˜μ •λ§ŒμœΌλ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό 섀정을 λ³€κ²½ν•˜κΈ° μœ„ν•΄ 많이 μ‚¬μš©λœλ‹€.
$ cd ./ch06/exercises/todo-list

# 경둜 λ¬Έμžμ—΄μ„ ν™˜κ²½ λ³€μˆ˜λ‘œ μ •μ˜
$ source="$(pwd)/config" && target='/app/config'             # λ¦¬λˆ…μŠ€

# λ°”μΈλ“œ 마운트λ₯Ό μ μš©ν•΄ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker container run --name todo-configured -d -p 8013:80 --mount type=bind,source=$source,target=$target,readonly diamol/ch06-todo-list

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž‘λ™ μ—¬λΆ€ 확인
$ curl <http://localhost:8013>

# μ»¨ν…Œμ΄λ„ˆ 둜그 확인
# 호슀트의 둜그 레벨 μ„€μ • νŒŒμΌμ„ μ½μ–΄μ„œ DEBUG λ‘œκ·Έκ°€ 좜λ ₯됨
$ docker container logs todo-configured
  • 호슀트 컴퓨터가 μ ‘κ·Όν•  수 μžˆλŠ” μŠ€ν† λ¦¬μ§€λΌλ©΄ 무엇이든 λ°”μš΄λ“œ 마운트λ₯Ό 톡해 μ»¨ν…Œμ΄λ„ˆμ— μ—°κ²°ν•  수 μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ /mnt/nfs 와 같이 NFS μ‹œμŠ€ν…œ 경둜λ₯Ό λ§ˆμš΄νŠΈν•˜μ—¬ λΆ„μ‚° μŠ€ν† λ¦¬μ§€λ₯Ό μ»¨ν…Œμ΄λ„ˆμ— μ—°κ²°ν•΄ μ‚¬μš©ν•˜μ—¬ 신뒰성을 크게 κ°œμ„ ν•  수 μžˆλ‹€.

6.4 파일 μ‹œμŠ€ν…œ 마운트의 ν•œκ³„μ 

  • λ°”μΈλ“œ λ§ˆμš΄νŠΈμ™€ λ³Όλ₯¨μ„ 효율적으둜 ν™œμš©ν•˜λ €λ©΄ 각 μš”μ†Œμ˜ 핡심 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€μ™€ ν•œκ³„μ μ„ 이해해야 ν•œλ‹€.

첫 번째 μ‹œλ‚˜λ¦¬μ˜€ - μ»¨ν…Œμ΄λ„ˆμ˜ 마운트 λŒ€μƒ 디렉터리가 이미 μ‘΄μž¬ν•˜κ³  이미지 λ ˆμ΄μ–΄μ— 이 λ””λ ‰ν„°λ¦¬μ˜ 파일이 포함돼 μžˆλŠ” 경우.

# ν™˜κ²½λ³€μˆ˜ 지정
$ source="$(pwd)/new" && target='/init'

# μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker container run diamol/ch06-bind-mount
abc.txt
def.txt

# 마운트 경둜 λ³€κ²½
$ # docker container run --mount type=bind,source=$source,target=$target diamol/ch06-bind-mount
._123.txt
._456.txt
123.txt
456.txt

  • 이미 μ‘΄μž¬ν•˜λŠ” λŒ€μƒ 디렉터리에 λ§ˆμš΄νŠΈν•˜λ©΄, 마운트의 원본 디렉터리가 κΈ°μ‘΄ 디렉터리λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•œλ‹€.
  • 즉, 이미지에 포함돼 있던 μ›λž˜ νŒŒμΌμ€ μ‚¬μš©ν•  수 μ—†λ‹€.
  • 처음 μ‹€ν–‰μ—μ„œλŠ” abc.txt , def.txt λ₯Ό 좜λ ₯λ˜μ—ˆλ‹€,
  • 이 νŒŒμΌμ€ 이미지 λ ˆμ΄μ–΄μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‘œ μ „λ‹¬λœ νŒŒμΌμ΄λ‹€.
  • 두 번째 μ»¨ν…Œμ΄λ„ˆλŠ” 이미지 λ ˆμ΄μ–΄μ—μ„œ λ°›λŠ” 파일이 마운트된 파일둜 λŒ€μ²΄λ˜μ—ˆμœΌλ©°, 파일 λͺ©λ‘μ΄ 123.txt , 456.txt 둜 λ°”λ€Œμ—ˆλ‹€.

λ‘λ²ˆμ§Έ μ‹œλ‚˜λ¦¬μ˜€ - 호슀트 파일 ν•˜λ‚˜λ₯Ό μ»¨ν…Œμ΄λ„ˆ 이미 μ‘΄μž¬ν•˜λŠ” λ””λ ‰ν† λ¦¬λ‘œ λ§ˆμš΄ν•  경우

  • 이미지 λ ˆμ΄μ–΄ λΆ€ν„°μ˜ 파일과 호슀트 마운트 된 경둜의 파일이 λͺ¨λ‘ λ‚˜νƒ€λ‚œλ‹€.
  • 단, μœˆλ„μš° μ»¨ν…Œμ΄λ„ˆλŠ” ν•΄λ‹Ή κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μœˆλ„μš° μ»¨ν…Œμ΄λ„ˆμ™€ λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆμ˜ λ™μž‘μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” λͺ‡ μ•ˆλ˜λŠ” μ˜μ—­μ΄λ‹€.
# 호슀트 마운트 κ²½λ‘œμ™€ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ 경둜 파일 λͺ¨λ‘ 좜λ ₯됨.
$ docker container run --mount type=bind,source="$(pwd)/new/123.txt",target=/init/123.txt diamol/ch06-bind-mount
123.txt
abc.txt
def.txt

μ„Έ 번째 μ‹œλ‚˜λ¦¬μ˜€ - λΆ„μ‚° 파일 μ‹œμŠ€ν…œμ„ μ»¨ν…Œμ΄λ„ˆμ— λ°”μš΄λ“œ 마운트 ν•˜λŠ” 경우.

  • λΆ„μ‚° 파일 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ©΄ λ„€νŠΈμ›Œν¬μƒμ˜ λͺ¨λ“  μ»΄ν“¨ν„°μ—μ„œ 데이터에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • λΆ„μ‚° 파일 μ‹œμŠ€ν…œμ„ μ»¨ν…Œμ΄λ„ˆμ— λ§ˆμš΄νŠΈν•˜λ©΄ 일반적인 파일 μ‹œμŠ€ν…œμ˜ μΌλΆ€μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, μ§€μ›ν•˜μ§€ μ•ŠλŠ” λ™μž‘μ΄ μžˆμ„ 수 μžˆλ‹€.
  • 예λ₯Όλ“€μ–΄, Azure Files λŠ” ν•˜λ“œ 링크 κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, PostgreSQL κ°€ ν•΄λ‹Ή Azure Files λ₯Ό λ§ˆμš΄νŠΈν•˜μ—¬ μ‚¬μš©ν•  경우 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.
  • μ΄λŸ¬ν•œ κ²½μš°λŠ” 맀우 λ“œλ¬Έ κ²½μš°μ΄μ§€λ§Œ, ν•œλ²ˆ λ°œμƒν•˜λ©΄ 해결이 νž˜λ“€λ‹€.
  • λ˜ν•œ, λ§Žμ€ μ»¨ν…Œμ΄λ„ˆκ°€ λΆ„μ‚° μ‹œμŠ€ν…œμ— λ§ˆμš΄νŠΈλ˜μ–΄ 있고, ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆλ“€μ΄ λ§Žμ€ File IO κ°€ 일어날 κ²½μš°κ°€ μžˆλ‹€.
  • λ”°λΌμ„œ, μ»¨ν…Œμ΄λ„ˆμ— λΆ„μ‚° μŠ€ν† λ¦¬μ§€λ₯Ό λ§ˆμš΄νŠΈν•  κ³„νšμ΄λΌλ©΄, μ»¨ν…Œμ΄λ„ˆλ“€μ˜ 마운트 λͺ©μ κ³Ό μ»¨ν…Œμ΄λ„ˆμ™€ λΆ„μ‚° μ‹œμŠ€ν…œμ˜ 관계λ₯Ό μΆ©λΆ„νžˆ κ³ λ €ν•΄μ•Ό ν•œλ‹€

6.5 μ»¨ν…Œμ΄λ„ˆμ˜ 파일 μ‹œμŠ€ν…œμ€ μ–΄λ–»κ²Œ λ§Œλ“€μ–΄μ§€λŠ”κ°€?

  • λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” 도컀가 λ‹€μ–‘ν•œ μΆœμ²˜λ‘œλΆ€ν„° λͺ¨μ•„ λ§Œλ“  단일 가상 λ””μŠ€ν¬λ‘œ κ΅¬μ„±λœ 파일 μ‹œμŠ€ν…œμ„ κ°–λŠ”λ‹€.
  • 이 파일 μ‹œμŠ€ν…œμ„ μœ λ‹ˆμ–Έ 파일 μ‹œμŠ€ν…œ(Union File System) 이라 ν•œλ‹€.
  • μœ λ‹ˆμ–Έ 파일 μ‹œμŠ€ν…œμ€ OS λ§ˆλ‹€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμ§€λ§Œ, λ„μ»€λŠ” 호슀트의 μš΄μ˜μ²΄μ œμ— 맞게 μ΅œμ„ μ˜ κ΅¬ν˜„μ„ 선택해주기 λ•Œλ¬Έμ— 이것에 λŒ€ν•΄μ„œλŠ” μ‹ κ²½ μ“Έ ν•„μš”κ°€ μ—†λ‹€.
  • μ»¨ν…Œμ΄λ„ˆλŠ” μœ λ‹ˆμ–Έ 파일 μ‹œμŠ€ν…œμ„ 톡해 물리적 μœ„μΉ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ 파일과 디렉토리에 마치 단일 λ””μŠ€ν¬λ₯Ό μ‚¬μš©ν•˜λ“― μ ‘κ·Όν•  수 μžˆλ‹€.
  • μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž…μž₯μ—μ„œλŠ” 단일 λ””μŠ€ν¬λ§Œμ„ λ°”λΌλ³΄μ§€λ§Œ, λ„μ»€μ˜ 경우 μ—¬λŸ¬ λ ˆμ΄μ–΄(이미지, 마운트 λ³Όλ₯¨)λ₯Ό 톡해 κ΅¬μ„±λœ 것이닀.
  • κ·ΈλŸ¬λ‚˜, 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄λŠ” 단 ν•˜λ‚˜μ΄λ‹€.

기둝 κ°€λŠ₯ λ ˆμ΄μ–΄

λΉ„μš©μ΄ λΉ„μ‹Ό κ³„μ‚°μ΄λ‚˜ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μ €μž₯ν•΄μ•Ό ν•˜λŠ” λ°μ΄ν„°μ˜ 캐싱 λ“± 단기 μ €μž₯에 μ ν•©ν•˜λ‹€.

각 μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ 독립적인 기둝 κ°€λŠ₯ λ ˆμ΄μ–΄λ₯Ό 가지며, μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜λ©΄ μ €μž₯된 λ°μ΄ν„°λŠ” μœ μ‹€λœλ‹€.

  • 둜컬 λ°”μΈλ“œ 마운트
    • 호슀트 컴퓨터와 μ»¨ν…Œμ΄λ„ˆ κ°„ 데이터λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    • 호슀트의 μ„€μ •νŒŒμΌμ„ κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•¨μœΌλ‘œμ¨, 이미지 λΉŒλ“œ 없이 μ¦‰μ‹œ μ»¨ν…Œμ΄λ„ˆλ‘œ 전달할 수 μžˆλ‹€.
  • λΆ„μ‚° λ°”μΈλ“œ 마운트:
    • λ„€νŠΈμ›Œν¬ μŠ€ν† λ¦¬μ§€μ™€ μ»¨ν…Œμ΄λ„ˆ 간에 데이터λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    • κ°€μš©μ„±μ΄ λ†’μ§€λ§Œ 둜컬 λ””μŠ€ν¬μ™€ 비ꡐ해 μ§€μ›ν•˜μ§€ μ•ŠλŠ” 파일 μ‹œμŠ€ν…œ κΈ°λŠ₯이 μžˆκ±°λ‚˜ μ„±λŠ₯ λ©΄μ—μ„œ 차이가 μžˆμ„ 수 μžˆλ‹€.
    • 읽기 μ „μš©μœΌλ‘œ μ„€μ • νŒŒμΌμ„ μ „λ‹¬ν•˜κ±°λ‚˜ 곡유 μΊμ‹œλ‘œ ν™œμš©ν•  수 있으며, 읽기 μ“°κΈ° κ°€λŠ₯으둜 데이터λ₯Ό μ €μž₯ν•΄ 동일 λ„€νŠΈμ›Œν¬μƒμ˜ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ‚˜ 컴퓨터와 데이터λ₯Ό κ³΅μœ ν•˜λŠ” 데 μ ν•©ν•˜λ‹€.
  • λ³Όλ₯¨ 마운트
    • μ»¨ν…Œμ΄λ„ˆμ™€ 도컀 객체인 λ³Όλ₯¨ 간에 데이터λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
    • λ³Όλ₯¨ 마운트λ₯Ό μ‚¬μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ³Όλ₯¨μ— 데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•œλ‹€.
    • μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΅μ²΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—…λ°μ΄νŠΈν•΄λ„, 이전 버전 μ»¨ν…Œμ΄λ„ˆμ˜ 데이터λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•  수 μžˆλ‹€.

이미지 λ ˆμ΄μ–΄

  • 이미지 λ ˆμ΄μ–΄λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ 초기 파일 μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•œλ‹€.
  • λ ˆμ΄μ–΄λŠ” 적측 ꡬ쑰λ₯Ό κ°–λŠ”λ°, 후속 λ ˆμ΄μ–΄μ™€ 이전 λ ˆμ΄μ–΄μ˜ λ‚΄μš©μ΄ μ„œλ‘œ μΆ©λŒν•˜λŠ” 경우 후속 λ ˆμ΄μ–΄μ˜ λ‚΄μš©μ΄ μ μš©λœλ‹€.
  • λ ˆμ΄μ–΄λŠ” 읽기 μ „μš©μ΄λ©° μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆκ°€ κ³΅μœ ν•œλ‹€.

6.6 μ—°μŠ΅λ¬Έμ œ

  • 문제: 기쑴에 ν•  일이 λ“±λ‘λœ μƒνƒœλ‘œ μ‹œμž‘λ˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό, μ΄ˆκΈ°ν™”λœ μƒνƒœλ‘œ μ‹œμž‘ν•˜λ„λ‘ μ„€μ •.
  • ν•΄κ²° λ°©μ•ˆ: μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ μ„€μ • νŒŒμΌμ„ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜κ³ , μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μ‹œ 이 νŒŒμΌμ„ λ§ˆμš΄νŠΈν•˜μ—¬ μ΄ˆκΈ°ν™”λœ μƒνƒœλ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
# 싀행쀑인 λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
$ docker rm -f $(docker ps -aq)

# μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker container run -d -p 8081:80 diamol/ch06-lab

# <http://host:8081> 접속 ν›„ todo list 4개 λ“±λ‘λ˜μ–΄μžˆλŠ”κ±° 확인

# μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ 접속
$ docker exec -it d6ef8f670f7f /bin/bash

# 이미지 λ ˆμ΄μ–΄μ—μ„œ κ°€μ Έμ˜¨ μ„€μ •νŒŒμΌ 확인.
$ cat appsettings.json
{
  "ConnectionStrings": {
    "ToDoDb": "Filename=/init-data/todo-list.db"
  }
}

$ exit

# 문제 μ„€μ • 파일 경둜 이동
$ cd /ch06/lab/solution

# 문제 μ„€μ •νŒŒμΌ 확인
$ cat config.json 
{
  "ConnectionStrings": {
    "ToDoDb": "Filename=/new-data/todo-list.db"
}
$ cd ..

# λ³Όλ₯¨ 생성
$ docker volume create ch06-lab

# 마운트 경둜 ν™˜κ²½ λ³€μˆ˜ 등둝
$ configSource="$(pwd)/solution" && configTarget='/app/config' && dataTarget='/new-data'

# μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker container run -d -p 8016:80 --mount type=bind,source=$configSource,target=$configTarget,readonly --volume ch06-lab:$dataTarget diamol/ch06-lab

728x90
λ°˜μ‘ν˜•
MyeongDev