๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Day 18 [๋ฐฐํฌ] Docker

whenยท2022๋…„ 6์›” 10์ผ
0

Docker๋ž€?

๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์„œ๋น„์Šค
์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌ

Container

๋…๋ฆฝ์ ์ธ ์‹คํ–‰ํ™˜๊ฒฝ
์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒฉ๋ฆฌ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์œ ๋‹›(node.js code + node.js runtime)
์ด๋ฏธ์ง€์—๋Š” ์ฝ”๋“œ, ์„ค์ •, ์—ฌ๋Ÿฌ ๊ฒƒ๋“ค์ด ํฌํ•จ๋˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ทธ ์ด๋ฏธ์ง€์˜ ์‹คํ–‰ ์ธ์Šคํ„ด์Šค์ด๋‹ค.

Container๋ฐฉ์‹์˜ ์žฅ์ 

  1. ์˜์กด์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.
  2. ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์ผ์น˜์‹œํ‚จ๋‹ค.
  3. ์ˆ˜ํ‰ ํ™•์žฅ์„ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.
  4. ๊ฐ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๋ฐฐํฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

Container์˜ ํŠน์ง•

  1. ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ ์•ˆ์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋‹ค.
  2. ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜์— ํ•˜๋‚˜์˜ IP์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.
  3. ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๊ตฌํšํ™”๋˜์–ด ์žˆ์–ด ๊ทธ ์•ˆ์—์„œ์˜ ๋ช…๋ น์ด๋‚˜ ํŒŒ์ผ ๋“ฑ์˜ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

Virtual Machine vs Docker & Container

  • VM
    ์žฅ์  : OS๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํ•œ ๋…๋ฆฝ์„ฑ => ๋†’์€ ๋ณด์•ˆ์„ฑ
    ๋‹จ์  : ๋ฉ”๋ชจ๋ฆฌ, CPU, Hard Drive์— ๋งŽ์€ ๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•œ๋‹ค.
  • Container
    ์žฅ์  : OS์œ„์— ๋‹ค๋ฅธ OS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ ์ด์‹ ๋ฐ ์ฆ‰์‹œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    ๋‹จ์  : VM๋งŒํผ ๊ฒฌ๊ณ ํ•œ ๊ฒฉ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

Image

constains code + required tools/runtimes
ํ•˜๋‚˜์˜ image๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ container๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฝ๊ธฐ/์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ Templates/Blueprints

๋ ˆ์ด์–ด ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ณ

์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ช…๋ น์€ cache๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
๋ ˆ์ด์–ด๋Š” ์ด๋ฏธ์ง€ ์žฌ๊ตฌ์ถ• ๋ฐ ๊ณต์œ ๋ฅผ ๋•๋Š”๋‹ค.

DOCKER ์‚ฌ์šฉ๋ฒ•

๊ธฐ์กด Image ์ด์šฉํ•˜๊ธฐ

์ด๋ฏธ์ง€ ๊ตฌ๋ถ„ Registry_Account/Repository_Name:Tag

  • Registry
    ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„
    Docker Hub, Private Docker Hub, ํšŒ์‚ฌ ๋‚ด๋ถ€์šฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
  • Repository
    registry๋‚ด์— ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
    ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.
  • Tag
    ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ฃผ๋กœ ์ž…๋ ฅํ•œ๋‹ค.
    latest

Docker CLI ๋ช…๋ น์–ด

docker (image) pull $Registry_Account/Repository_Name:Tag : ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
docker image ls : ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ
docker (container) run $image : image๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ & ์‹คํ–‰
docker (container) run -it $image : ์‚ฌ์šฉ์ž์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ์ธํ„ฐ๋ ‰์…˜์ด ํ•„์š”ํ•  ๋•Œ์˜ ์˜ต์…˜
docker (container) ps : ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์ •๋ณด ํ‘œ์‹œ
docker (container) ps -a : docker๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ, ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ํ‘œ์‹œ
docker container rm $NAMES : ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
docker image rm $image : ํ•ด๋‹น ์ด๋ฏธ์ง€ ์‚ญ์ œ(์ด๋ฏธ์ง€ ์•ˆ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์„ ๋•Œ ์‚ญ์ œ ๊ฐ€๋Šฅ)
docker stop $NAMES ์‹คํ–‰์ค‘์ธ docker์ค‘์ง€

Docker container์— ํŒŒ์ผ ๋ณต์‚ฌํ•˜๊ธฐ

์›น ์„œ๋ฒ„๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ณ , ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํŒŒ์ผ์€ ์ง์ ‘ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ ๊ตฌ์„ฑ

  • ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ํ˜ธ์ŠคํŠธ์™€ ๋ณ„๊ฐœ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ์„œ๋ฒ„๋ฅผ ๋„๊ณ  ๊ณต์žฅ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋“ฏ ๋„์ปค ์ด๋ฏธ์ง€๋กœ ์„œ๋ฒ„๋ฅผ ์žฌ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กœ์ปฌ์— ์žˆ๋Š” ํŒŒ์ผ๊ณผ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

  • CP : ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์— ํŒŒ์ผ์„ ๋ณต์‚ฌ
  • Volume : ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์— ๊ณต๊ฐ„์„ ๋งˆ์šดํŠธ

์˜ˆ์‹œ)httpd ์›น ์„œ๋ฒ„

httpd(http daemon) : Apache HTTP Server๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด
docker container run --name $NAMES -p 818:80 httpd : local port 818๊ณผ container port 80์„ ์—ฐ๊ฒฐํ•œ๋‹ค.
docker container cp ./ $NAMES:/usr/local/apache2/htdocs/ : localhost์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•œ๋‹ค.
์ฃผ์˜!์•ž ๊ฒฝ๋กœ(./)์˜ ํŒŒ์ผ์„ ๋’ค๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•œ๋‹ค.
docker exec -it $NAMES bash : ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ„ฐ๋ฏธ๋„๋กœ ์ ‘์†, root@$containerID:/usr/local/apache2# ์ถœ๋ ฅ

Docker Image ๋งŒ๋“ค๊ธฐ

๊ตฌ๋™ํ•œ Docker Container๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“œ๋Š” ๋ฒ•

docker container commit $NAMES $Repository:$Tag
docker run --name $์ƒˆ๋กœ๋งŒ๋“ค์ปจํ…Œ์ด๋„ˆ์ด๋ฆ„ -p 900:80 $Repository:$Tag : ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋ฅผ 900ํฌํŠธ์—์„œ ์›น์„œ๋ฒ„๋กœ ๊ตฌ๋™
=> 127.0.0.1:900 ๋˜๋Š” localhost:900์—์„œ ์›น์„œ๋ฒ„๊ฑฐ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Dockerfile๋กœ ์ž์ฒด ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ธฐ(Custom Image)

< ์ด๋ฏธ์ง€๋ฅผ ์…‹ํŒ…ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ(์ปจํ…Œ์ด๋„ˆ์˜ ํ…œํ”Œ๋ฆฟ) >

FROM node(node์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ด)
WORKDIR /app(์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ)
COPY package.json /app(์†Œ์Šค์ฝ”๋“œ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ๊ณ„์† ์„ค์น˜๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€)
RUN npm install(๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜)
COPY ./app(์ฒ˜์Œ โ€˜.โ€™์€ ํ˜„์žฌ ํด๋”์˜ ๋ชจ๋“  ํŒŒ์ผ, โ€˜/appโ€™์€ ์˜ฎ๊ธธ ์žฅ์†Œ)
EXPOSE 80(์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•  ๊ฒƒ์ž„์„ ๋ฌธ์„œํ™”)
CMD [โ€œnodeโ€, โ€œserver.jsโ€](์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰)

docker build . : Dockerfile์— ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ
docker run -p 3000:80 $containerID : local port 3000์— ๋‚ด๋ถ€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ์ธ 80์„ ๋…ธ์ถœํ•˜๊ณ  publishํ•œ๋‹ค.
(CMD์— ์˜ํ•ด์„œ ์œ„์—์„œ ๋งŒ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘..)

profile
์ƒ์ƒ์€ ํ˜„์‹ค์ด ๋œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€