[πŸ‹Docker] λ„μ»€μ˜ 생λͺ…μ£ΌκΈ° (Docker Life Cycle)

vincaΒ·2023λ…„ 12μ›” 1일
0
post-thumbnail

도컀 μ»¨ν…Œμ΄λ„ˆμ˜ 라이프 사이클

docker container 라이프 사이클

  • 생성 단계(Create phase) : Docker μ»¨ν…Œμ΄λ„ˆλŠ” docker create λͺ…령을 μ‚¬μš©ν•˜μ—¬
    μƒμ„±λœλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μƒμ„±λ˜μ§€λ§Œ 아직 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
  • μ‹€ν–‰ 단계(Running phase) : docker start λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•œλ‹€.
    이 λ‹¨κ³„μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μž‘λ™ν•˜κ³  μžˆλ‹€.
  • μΌμ‹œ 쀑지 단계(Paused phase) : docker pauseλͺ…령을 μ‚¬μš©ν•˜μ—¬ μ‹€ν–‰ 쀑인
    μ»¨ν…Œμ΄λ„ˆλ₯Ό μΌμ‹œ 쀑지할 수 μžˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ 싀행이 μΌμ‹œ
    μ€‘μ§€λ˜λ©°, ν•„μš”ν•œ 경우 docker unpause λͺ…령을 μ‚¬μš©ν•˜μ—¬ λ‹€μ‹œ μ‹€ν–‰ν•  수 μžˆλ‹€.
  • 정지 단계(Stopped phase) : docker stop λ˜λŠ” β€˜docker kill’ λͺ…령을 μ‚¬μš©ν•˜μ—¬
    μ»¨ν…Œμ΄λ„ˆλ₯Ό 정지할 수 μžˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μž‘λ™μ„ λ©ˆμΆ”λ©°, ν•„μš”ν•œ
    경우 β€˜docker start’ λͺ…령을 μ‚¬μš©ν•˜μ—¬ λ‹€μ‹œ μ‹œμž‘ν•  수 μžˆλ‹€.
  • 제거 단계(Destroy phase) : docker rm λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ •μ§€λœ μ»¨ν…Œμ΄λ„ˆλ₯Ό
    μ œκ±°ν•œλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μ‹œμŠ€ν…œμ—μ„œ μ™„μ „νžˆ μ œκ±°λœλ‹€.

도컀 μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ : start

도컀 μ»¨ν…Œμ΄λ„ˆλŠ” μƒμ„±ν•˜κ²Œλ˜λ©΄ 기본적으둜 λ©ˆμΆ°μžˆλŠ” μƒνƒœλ‘œ μ‹œμž‘λœλ‹€. λ”°λΌμ„œ, 이λ₯Ό μ‹œμž‘μ‹œμΌœ 주도둝 ν•˜μž.

# μ»¨ν…Œμ΄λ„ˆ 확인
docker ps -a
# μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ / containerλŠ” μƒλž΅κ°€λŠ₯
docker (container) start 914956d407a0
docker (container) start nginx

nginx와 같은 μ›Ή ν™˜κ²½μ˜ μ»¨ν…Œμ΄λ„ˆλŠ” κ³„μ†ν•΄μ„œ λ™μž‘ν•˜μ§€λ§Œ, 이와 λ°˜λŒ€λ‘œ μš°λΆ„νˆ¬μ™€ 같은 κ²½μš°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜μ§€λ§ˆμž μ’…λ£Œλœλ‹€.

μš°λΆ„νˆ¬μ™€ 같은 μ‹€μ œλ‘œ OS에 μ ‘κ·Όν•˜λŠ” κ²½μš°λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό μ¦‰μ‹œ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜λŠ” 것을 막을 수 μžˆμ„κΉŒ?

μ¦‰μ‹œ μ’…λ£Œλ˜λŠ” 것을 λ§‰λŠ” 방법

# container은 μƒλž΅ κ°€λŠ₯
docker (container) create -it --name=ubuntu1 ubuntu:latest
# 도컀 μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘
docker (container) start ubuntu1
# μ»¨ν…Œμ΄λ„ˆ 확인 / ps -a λŠ” container ls -a와 동일
docker ps -a
# μ»¨ν…Œμ΄λ„ˆμ˜ μš°λΆ„νˆ¬ μ„œλ²„μ— 접속
docker (container) attach ubuntu1

μ‹œμž‘μ„ μ‹œμΌœλ„ μ¦‰μ‹œ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜μ§€ μ•Šκ³  λ‚¨μ•„μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

μ΄λŠ” -it μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λŒ€ν™”ν˜•(interactive) 터미널을 ν™œμ„±ν™”ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜μ§€ μ•Šκ³  계속 μ‹€ν–‰λ˜λ„λ‘ ν•˜μ˜€κΈ° λ•Œλ¬Έμ΄λ‹€.

이제 μ ‘μ†ν•΄λ³΄μž. μ»¨ν…Œμ΄λ„ˆκ°€ μ¦‰μ‹œ μ’…λ£Œλ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ bash μ‰˜λ‘œ 접속할 수 있게 λ˜μ—ˆλ‹€.

μ‰˜μ—μ„œ λ‚˜κ°€λ³΄μž. exit λ₯Ό μž…λ ₯ν•΄μ„œ ν˜„μž¬ μ ‘μ†ν•œ λ¦¬λˆ…μŠ€ μ‰˜μ—μ„œ λ‚˜κ°€λ©΄ μ–΄λ–€ ν˜„μƒμ΄ λ°œμƒν• κΉŒ?

β†’ μ¦‰μ‹œ μ’…λ£Œλ˜μ–΄λ²„λ¦°λ‹€..

κ·Έλ ‡λ‹€λ©΄ 계속 μ΄λ ‡κ²Œ λ‚˜κ°ˆλ•Œλ§ˆλ‹€ λ‹€μ‹œ start λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•΄μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•΄ μ€˜μ•Όν• κΉŒ?

exit μ‹œ μ’…λ£Œ ν•΄κ²°λ°©μ•ˆ

Ctrl + P, Ctrl + Q: ν˜„μž¬ attach λͺ¨λ“œμ—μ„œ λΉ μ Έλ‚˜μ™€ κΈ°μ‘΄ ν™˜κ²½μœΌλ‘œ λŒμ•„κ°„λ‹€.

즉, Ctrl + Pλ₯Ό λˆ„λ₯Έ ν›„ Ctrl + Qλ₯Ό λˆ„λ₯΄λ©΄ μ»¨ν…Œμ΄λ„ˆμ˜ 터미널을 λ– λ‚˜ λ°±κ·ΈλΌμš΄λ“œλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€ =. μ΄λ ‡κ²Œ ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆλŠ” 계속 μ‹€ν–‰λ˜μ§€λ§Œ, μ»¨ν…Œμ΄λ„ˆ ν„°λ―Έλ„κ³Όμ˜ 연결이 ν•΄μ œλœλ‹€.

🧐 μ—₯? κ·Έλƒ₯ ν”„λ‘œμ„ΈμŠ€λ₯Ό Ctril+ Z둜 λ’€μ—μ„œ 계속 μ‹€ν–‰λ˜λ„λ‘ ν•˜λ©΄ μ•ˆλ˜λ‚˜μš”?

주의 사항

Ctrl + Z λ₯Ό λˆ„λ₯΄λŠ” 것은 ν”„λ‘œμ„ΈμŠ€ μžμ²΄κ°€ λ’€λ‘œ λΉ μ Έμ„œ μ΄μƒν•˜κ²Œ λ™μž‘ν•  수 μžˆμœΌλ―€λ‘œ λ°±κ·ΈλΌμš΄λ“œλ‘œ λŒμ•„κ°€λŠ” 방법인 Ctrl + P + Q λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜μž.

μ‹€μ‹œκ°„ μ»¨ν…Œμ΄λ„ˆ 상황 확인

접속 ν›„ μ‹€μ‹œκ°„μœΌλ‘œ 확인 κ°€λŠ₯

docker container states bf2197e54575

μ‹€λ¬΄μ—μ„œλŠ”? docker run!

docker run λͺ…λ Ήμ–΄λ₯Ό μ“°λ©΄ μœ„μ˜ λͺ¨λ“  과정을 ν•¨κ»˜ μ“Έ 수 μžˆλ‹€.

create ν•˜λ©΄μ„œ λ°”λ‘œ startλ₯Ό 톡해 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ™μž‘μ‹œν‚€κ³ , 이후 μ»¨ν…Œμ΄λ„ˆ μ ‘μ†κΉŒμ§€(attach) μˆ˜ν–‰ν•œλ‹€.

docker run -it --name=myubuntu ubuntu:latest /bin/bash

μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰κ³Ό λ™μ‹œμ— λͺ…λ Ήμ–΄ μž…λ ₯

# κΈ°λ³Έ μš°λΆ„νˆ¬
docker container run --name=ubuntu00 -d ubuntu:latest /bin/bash -c 'ls'
# μ•ŒνŒŒμΈ
docker container run --name=alpine_ubuntu -d alpine:latest "ls"

μ΄λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성 및 λ°°ν¬ν•˜λ©΄μ„œ λ¦¬λˆ…μŠ€ μ‰˜μ— ls λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λŠ” μ˜ˆμ œμ΄λ‹€.

각각 ubuntu λ¦¬λˆ…μŠ€μ™€ alpine λ¦¬λˆ…μŠ€λ₯Ό μ»¨ν…Œμ΄λ„ˆν™” ν•˜μ—¬ λ°°ν¬ν•˜κ³ μžˆλ‹€.

-d μ˜΅μ…˜

-d λ˜λŠ” --detach μ˜΅μ…˜μ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•œ ν›„ μ»¨ν…Œμ΄λ„ˆμ˜ 좜λ ₯을 ν‘œμ‹œν•˜μ§€ μ•Šκ³ , μ»¨ν…Œμ΄λ„ˆλ₯Ό λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•˜λ„λ‘ ν•œλ‹€.

-c μ˜΅μ…˜

alpine λ¦¬λˆ…μŠ€ μ—λŠ” -c μ˜΅μ…˜μ΄ 듀어가지 μ•ŠλŠ”λ‹€. -c μ˜΅μ…˜μ˜ μ˜λ―ΈλŠ” λ¬Έμžμ—΄(char)둜 λͺ…령을 μ „λ‹¬ν•˜λ„λ‘ ν•˜λŠ” 것이닀.

ubuntuμ—μ„œ ls λͺ…λ Ήμ–΄λŠ” λ°”μ΄λ„ˆλ¦¬ 파일이며, μ‰˜μ— λ“±λ‘λœ λͺ…λ Ήμ–΄κ°€ μ•„λ‹ˆλ‹€. λ”°λΌμ„œ /bin/bashμ—μ„œ 직접 lsλ₯Ό μ‹€ν–‰ν•˜λ €κ³  ν•˜λ©΄ "cannot execute binary file"와 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

λ”°λΌμ„œ ubuntu의 /bin/bashμ—μ„œ ls λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ -c μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λͺ…λ Ήμ–΄λ₯Ό μ „λ‹¬ν•΄μ•Όν•œλ‹€.

ν•˜μ§€λ§Œ μ•ŒνŒŒμΈ λ¦¬λˆ…μŠ€μ˜ κ²½μš°μ—λŠ” ls κ°€ 기본적으둜 λͺ…λ Ήμ–΄λ‘œ μ§€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ -c μ˜΅μ…˜μ΄ 없어도 μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€.

exec

execλ₯Ό ν†΅ν•΄μ„œ μ»¨ν…Œμ΄λ„ˆ ν™˜κ²½μ— λͺ…λ Ήμ–΄λ₯Ό λ„£κ³ , 이에 λŒ€ν•œ κ²°κ³Όλ₯Ό μ»¨ν…Œμ΄λ„ˆ λ°–μ˜ 호슀트 ν™˜κ²½μ—μ„œ 확인할 수 μžˆλ‹€.

도컀 μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ 및 정지

κΈ°λ³Έ μ‹œμž‘/μ’…λ£Œ

docker container stop hello
docker container start hello

도컀 μΌμ‹œμ€‘μ§€

 docker pause my_nginx

μΌμ‹œμ€‘μ§€ ν•΄μ œ

 docker unpause my_nginx

μ»¨ν…Œμ΄λ„ˆμ˜ μž¬μ‹œμž‘

--restart=always μ˜΅μ…˜μ„ μΆ”κ°€ν•œλ‹€.

일반적으둜 도컀 μ»¨ν…Œμ΄λ„ˆμ— μš°λΆ„νˆ¬(λ¦¬λˆ…μŠ€)λ₯Ό λ°°ν¬ν•˜κ³ , 이λ₯Ό 접속(attach)ν•˜κ³  exitλ₯Ό ν†΅ν•΄μ„œ shell을 λ‚˜κ°€κ²Œ 되면 shell이 μ’…λ£Œλ˜κ²Œ λœλ‹€.

ν•˜μ§€λ§Œ 배포할 λ•Œ, --restart=always μ˜΅μ…˜μ„ μΆ”κ°€ν•œλ‹€λ©΄, μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜μ—ˆμ„ λ•Œ μžλ™μœΌλ‘œ λ‹€μ‹œ μ‹œμž‘λ˜λ„λ‘ μ„€μ •ν•  수 μžˆλ‹€.

profile
뢉은 λ°° μ˜€μƒ‰ 딱닀ꡬ리 개발자 πŸ¦ƒCloud & DevOps

0개의 λŒ“κΈ€