Docker ๊ฐœ๋…

๊น€์ง„ํšจยท2026๋…„ 8์›” 27์ผ

[CS] ๋ฉด์ ‘ ๋Œ€๋น„

๋ชฉ๋ก ๋ณด๊ธฐ
11/12
post-thumbnail

'๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” ๋„์ปค์™€ CI ํ™˜๊ฒฝ' ์ฑ…์„ ์ฝ๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ์“ธ๊นŒ ํ•˜๋‹ค๊ฐ€ ๊ฐœ๋…์„ ์ „์ฒด์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚จ๊ธฐ๋Š” ๊ธ€ ๐Ÿซ 


๐Ÿ‹ Docker ๋ž€

๋„์ปค๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ "์ปจํ…Œ์ด๋„ˆ"๋ผ๋Š” ํ‘œ์ค€ํ™”๋œ ์œ ๋‹›์œผ๋กœ ํŒจํ‚ค์ง•ํ•ด์„œ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌ์ถ•, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ, ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ
โ†’ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„

์ปจํ…Œ์ด๋„ˆ์™€ ์ด๋ฏธ์ง€

์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ ๋‹ค!
์ด๋ฏธ์ง€: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ์‹คํ–‰์— ํ•„์š”ํ•œ ์‹œ์Šคํ…œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ์‹คํ–‰ ํ…œํ”Œ๋ฆฟ
์ปจํ…Œ์ด๋„ˆ: ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰ํ•œ ์ธ์Šคํ„ด์Šค

Docker ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ€์ƒ๋จธ์‹ (VM)์˜ ์ฐจ์ด

docker-containerized-and-vm
๊ฐ€์ƒ๋จธ์‹ (VM)์€ ํ•˜์ดํผ๋ฐ”์ด์ € ๊ธฐ๋ฐ˜(๋ฌผ๋ฆฌ ํ•˜๋“œ์›จ์–ด ์œ„์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ƒ ๋จธ์‹ ์„ ๊ตฌ๋™)์œผ๋กœ, ์ „์ฒด ์šด์˜ ์ฒด์ œ(OS)๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์ฒด ์ปค๋„, ํ•˜๋“œ์›จ์–ด ๋“œ๋ผ์ด๋ฒ„, ํ”„๋กœ๊ทธ๋žจ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ๋ฌด๊ฒ๋‹ค
๋”ฐ๋ผ์„œ ๋‹จ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๋‹ค
๋‹ค๋งŒ ๋” ๊ฐ•๋ ฅํ•œ ๊ฒฉ๋ฆฌ์™€ ๋ณด์•ˆ ์ œ๊ณต
์ปจํ…Œ์ด๋„ˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด๋„ ๋™์ผํ•œ ์ปค๋„์„ ๊ณต์œ ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ์ข…์†์„ฑ๋งŒ์„ ํฌํ•จํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋‹ค
์‹คํ–‰ ์‹œ๊ฐ„์ด ์งง๊ณ  ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋„ ํšจ์œจ์ 
๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๊ฒฉ๋ฆฌ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰

Docker๋ฅผ ์“ฐ๋Š” ์ด์œ 

์„œ๋กœ ํ˜‘์—…ํ•˜๋ฉด์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž!

  1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜

    A : ํ”„๋กœ์ ํŠธ ์‹คํ–‰ํ•˜๋ ค๋‹ˆ๊นŒ ๊ฐ‘์ž๊ธฐ ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด์„œ ์•ˆ๋ผ์š” (java 17)
    B : ์ œ ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋˜๋Š”๋ฐ์š”? (java 11)

    ๐Ÿ”Ž ๋ฌธ๋ฒ•๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์ด ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์–ด๊ธ‹๋‚˜๋ฉด์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜๋กœ ์˜ค๋ฅ˜๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ
    โœ… ๋„์ปค๋ฅผ ์“ด๋‹ค๋ฉด ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์šด์˜ ํ™˜๊ฒฝ์„ ์ผ์น˜์‹œ์ผœ ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค!

  2. ๋ณต์žกํ•œ ์„ค์น˜ ๊ณผ์ • ์ƒ๋žต
    ๋ฌผ๋ก ๋ฌผ๋ก  ์ด๋Ÿฐ ์ผ์ด ์‹ค๋ฌด์—๋Š” ์—†๊ฒ ์ง€๋งŒ ๊ฐœ๋ฐœ์„ ๋ง‰ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ•œ ์‹œ์ ์— ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์•„์ง ๋ฐฐํฌ ์ „์ด๋ผ ํ”„๋ก ํŠธ์—”๋“œ A๊ฐ€ ๋ฐฑ์—”๋“œ API๋ฅผ ์—ฐ๋™ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•˜์ž

    A: API ์—ฐ๋™ ํ…Œ์ŠคํŠธ ํ•  ๊ฑด๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
    B: ์•— ๋จผ์ € Java๋ž‘ MySQL ๊นŒ์‹œ๊ตฌ์š” ์Šคํฌ๋ฆฝํŠธ ํ•œ ๋ฒˆ ๋Œ๋ฆฌ์‹œ๊ณ  ์•— ๊ทธ๋ฆฌ๊ณ  Redis๋„ ํฌํŠธ ์—ด์–ด์„œ ๋„์›Œ๋‘์…”์•ผํ•˜๋Š”๋ฐ...
    A: (๋ฐฑ์—”๋“œ DB ์„ธํŒ…๊นŒ์ง€ ํ•ด์•ผํ•˜๋Š”๊ฑฐ..?)

    ๐Ÿ”Ž ์ด๋ ‡๊ฒŒ API ์—ฐ๊ฒฐ ํ•˜๋‚˜๋ฅผ ์œ„ํ•ด์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋ฐฑ์—”๋“œ ๋‹ค ๋กœ์ปฌ์— ์ง์ ‘ ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋˜๋ฉด ํ™˜๊ฒฝ ์„ธํŒ…์—๋งŒ ํ•˜๋ฃจ๋ฅผ ์“ฐ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค
    โœ… ๋„์ปค๋ฅผ ์“ด๋‹ค๋ฉด ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฐฑ์—”๋“œ ์ชฝ์—์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“์€ docker-compose.yml ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐ›์•„๋‹ค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค


Docker ์‹คํ–‰ ๋ฐฉ์‹

docker-architecture
1. ๋„์ปค ํด๋ผ์ด์–ธํŠธ(CLI) ์—์„œ ๋ช…๋ น(์š”์ฒญ)

์˜ˆ) docker run hello-world

2-1. ๋„์ปค ์„œ๋ฒ„(๋ฐ๋ชฌ)
ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ๋กœ์ปฌ์— ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ (์ด๋ฏธ์ง€ ์บ์‹œ ๋ณด๊ด€ ์žฅ์†Œ)
์—†์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋˜๋ฉฐ docker๊ฐ€ ์–ด๋–ค ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๋Š”์ง€ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:5dd0d3e6e255913fc30f90b9f2b1d359cc2cbdb48090cc4b65f1676e203243cc
Status: Downloaded newer image for hello-world:latest

2-2. ๋„์ปค ํ—ˆ๋ธŒ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์™€์„œ ๋กœ์ปฌ์— ๋ณด๊ด€ ํ›„ ์ด๋ฏธ์ง€ ์ด์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค
์ด๋Š” ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ๋‚˜์˜ค๋Š” ์ถœ๋ ฅ ๊ฒฐ๊ณผ์—์„œ๋„ ํ™•์ธ ๊ฐ€๋Šฅ

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64)
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
  1. ์ดํ›„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰

Docker ์ปจํ…Œ์ด๋„ˆ ์ƒ๋ช…์ฃผ๊ธฐ

docker_container_lifecycle


Docker Hub

๋„์ปคํ—ˆ๋ธŒ๋Š” ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ์œ„์น˜)
๋‹ค์–‘ํ•œ ๊ณต๊ฐœ Docker ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
docker-compose.yml์—์„œ build ๋Œ€์‹  image:<๋„์ปค์•„์ด๋””>/<๋„์ปค์ด๋ฏธ์ง€์ด๋ฆ„> ์œผ๋กœ ๋„์ปค์ด๋ฏธ์ง€๋ฅผ ์‹ค์ œ๋กœ ๋นŒ๋“œ ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ๋„์ปค ํ—ˆ๋ธŒ์— ๋นŒ๋“œ๋œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉ

services:
  # ๋กœ์ปฌ Dockerfile์„ ๋นŒ๋“œํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  my-app:
    build: .

  # ๋„์ปค ํ—ˆ๋ธŒ์— ์ด๋ฏธ ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒฝ์šฐ
  my-app:
    image: ppnyoong/my-app:latest

Dockerfile

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ
์ด ํŒŒ์ผ ์•ˆ์—๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ช…๋ น์–ด๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ์ˆ 
โ†’ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค์ •์„ ์ •์˜
docker build ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Dockerfile๋กœ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ๊ฐ ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰

์˜ˆ์‹œ ๋ฐ ์„ค๋ช…

FROM node:10
WORKDIR /usr/src/app

COPY package.json ./
RUN npm install

COPY ./ ./
EXPOSE 8080

CMD ["node","server.js"]
  • FROM
    ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด ๋ช…์‹œ
    <์ด๋ฏธ์ง€ ์ด๋ฆ„>:<ํƒœ๊ทธ> ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ
    ํƒœ๊ทธ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋‚ด๋ ค ๋ฐ›์Œ
  • WORKDIR <๊ฒฝ๋กœ>
    ํ–ฅํ›„ ๋ช…๋ น์ด ์‹คํ–‰๋  ์œ„์น˜์™€ ๋””๋ ‰ํ„ฐ๋ฆฌ ํŒŒ์ผ์ด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋‚ด๋ถ€์— ๋ณต์‚ฌ๋  ์œ„์น˜๊ฐ€ ์ง€์ • โ†’ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •
  • COPY
    ๋กœ์ปฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋„์ปค ์ด๋ฏธ์ง€๋กœ ๋ณต์‚ฌ (๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์œผ๋กœ ๋ณต์‚ฌ)
  • EXPOSE
    ํฌํŠธ ์ง€์ •
  • RUN
    ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•  ์…ธ ๋ช…๋ น์–ด
  • CMD
    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋์„ ๋•Œ ์‹คํ–‰ํ•  ์‹คํ–‰ ํŒŒ์ผ ๋˜๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ
    ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” ๋„์ปค ํŒŒ์ผ ๋‚ด์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

COPY ์ง€์‹œ์ž๋ฅผ ๋‚˜๋ˆ„์–ด ํšจ์œจ์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ

Dockerfile-copy-cache

์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ๋งŒ ์ผ์–ด๋‚œ ๊ฒฝ์šฐ์—๋Š” ์ข…์†์„ฑ๊นŒ์ง€ ๋‹ค์‹œ ๋‚ด๋ ค๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†๋‹ค
์ข…์†์„ฑ์„ ๋‚ด๋ ค๋ฐ›๋Š” ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ„์–ด ์ข…์†์„ฑ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„๋•Œ๋งŒ ๋‹ค์‹œ ๋‚ด๋ ค๋ฐ›๊ณ  ์—†์œผ๋ฉด ์บ์‹œ(cache)๋ฅผ ์ด์šฉํ•ด ํ•ด๋‹น ๊ณผ์ • ์ƒ๋žต
โ†’ ๋นŒ๋“œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์—์„œ Using Cache ๊ฐ€ ๋œจ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค


Docker Volume

์ฝ”๋“œ ์ˆ˜์ • ์‹œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉ
โ†’ COPY ํ•ด์„œ ์žฌ๋นŒ๋“œํ•  ํ•„์š”๋ฅผ ์ค„์ด๊ณ  ๋ฐ”๋กœ๋ฐ”๋กœ ์ž‘์—… ๋‚ด์šฉ ํ™•์ธ ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ฝ”๋“œ

docker_volume
-v๋Š” ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ, ์ต๋ช… ๋ณผ๋ฅจ
์•ž์€ ์ต๋ช… ๋ณผ๋ฅจ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ๋’ค๋Š” ๋ฐ”์ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค -v ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ:์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ

  • PWD(print working directory)
    ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

Docker Compose

ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ
docker-compose.yaml ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ

๋ช…๋ น์–ด

  • ์‹คํ–‰ docker-compose up
    --build ๋ฅผ ๋ถ™์ด๋ฉด ์ด๋ฏธ์ง€ ์žˆ๋“  ์—†๋“  ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ณ  ์‹œ์ž‘
  • ์ •์ง€ docker-compose stop
  • ์ •์ง€+์‚ญ์ œ docker-compose down

์˜ˆ์‹œ ๋ฐ ์„ค๋ช…

version: '3.8' 			# ๋„์ปค ์ปดํฌ์ฆˆ์˜ ๋ฒ„์ „

services:				# ์ด๊ณณ์— ์‹คํ–‰ํ•˜๋ ค๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ •์˜
  # ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Redis ์„œ๋น„์Šค
  redis-server:			# ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
    image: redis:alpine	# ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€
    restart: always

  # ๋กœ์ปฌ Dockerfile์„ ๋นŒ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” Node.js ์•ฑ ์„œ๋น„์Šค
  node-app:				# ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
    build: .          	# ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Dockerfile ๋นŒ๋“œ
    ports:
      - "8080:8080"   	# ํฌํŠธ๋งคํ•‘ "๋กœ์ปฌ:์ปจํ…Œ์ด๋„ˆ ํฌํŠธ"
    depends_on:			
      - redis-server  	# redis-server๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜๋„๋ก ์„ค์ •
    environment:		# ํ™˜๊ฒฝ ๋ณ€์ˆ˜
      - REDIS_HOST=redis-server
      - REDIS_PORT=6379
  • restart ์˜ต์…˜ ๋น„๊ต
    • always ์–ธ์ œ๋‚˜ ๋‹ค์‹œ ์‹œ์ž‘
      ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฉˆ์ถ”๋ฉด ์ด์œ ๋ฅผ ๋ถˆ๋ฌธํ•˜๊ณ  ๋ฌด์กฐ๊ฑด ๋‹ค์‹œ ์‹คํ–‰
      ์šฉ๋„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์›น์„œ๋ฒ„ ์ฒ˜๋Ÿผ ์„œ๋ฒ„๊ฐ€ ์ผœ์ ธ ์žˆ๋Š” ํ•œ ๋ฌด์กฐ๊ฑด ํ•ญ์ƒ ์‚ด๋ ค๋‘์–ด์•ผ ํ•  ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • unless-stopped ๋ฉˆ์ถ”์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹ค์‹œ ์‹œ์ž‘
      docker stop์œผ๋กœ ์ง์ ‘ ๋ฉˆ์ถฐ๋†“์€ ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„๊ฐ€ ์žฌ๋ถ€ํŒ… ๋˜์–ด๋„ ์ž๋™์œผ๋กœ ์ผœ์ง€์ง€ ์•Š๊ฒŒ
      ์šฉ๋„: ์ ๊ฒ€ํ•˜๋ ค๊ณ  ๊บผ๋‘”๊ฑฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด (์‹ค๋ฌด)
    • no (๊ธฐ๋ณธ๊ฐ’)
      ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฃฝ์–ด๋„ ์ ˆ๋Œ€๋กœ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ
      ์šฉ๋„: ์ผํšŒ์„ฑ ์ž‘์—… (๋ฐ์ดํ„ฐ ๋ฐฑ์—…, ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)
    • on-failure ์‹คํŒจํ–ˆ์„ ๋•Œ๋งŒ ๋‹ค์‹œ ์‹œ์ž‘
      ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—๋Ÿฌ๋กœ ์ฃฝ์—ˆ์„ ๋•Œ๋งŒ ๋‹ค์‹œ ์‹œ์ž‘
      ์šฉ๋„: ํŠน์ • ๋ฐฐ์น˜ ์ž‘์—…์ด๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ๋„๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ

Dockerfile๊ณผ docker-compose

Dockerfile์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•˜๊ณ , compose ํŒŒ์ผ์€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ (compose ํŒŒ์ผ์€ ํŠน์ • ์„œ๋น„์Šค์— ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด Dockerfile์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ)


Docker ๋ช…๋ น์–ด

  • ๋„์ปค ๋ฒ„์ „ ํ™•์ธ docker version
  • ๋„์ปค ์‹คํ–‰ ํ…Œ์ŠคํŠธ docker run hello-world
    ์ฐธ๊ณ ๋กœ docker run = docker create + docker start
  • ๋„์ปค ์ด๋ฏธ์ง€์˜ ๋‚ด๋ถ€ ํŒŒ์ผ ๊ตฌ์กฐ ๋ณด๊ธฐ docker run <์ด๋ฏธ์ง€> ls
  • ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ™•์ธ ๋ช…๋ น์–ด
    • ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ docker ps (ps=process status)
    • ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ docker ps -a (a=all)
    • ์ž์„ธํ•œ ์ •๋ณด ํ™•์ธ docker inspect <์ปจํ…Œ์ด๋„ˆ๋ช…>
  • ๋กœ๊ทธํ™•์ธ ๋ช…๋ น์–ด docker logs <์ปจํ…Œ์ด๋„ˆ๋ช…>
  • ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์–ด ์ „๋‹ฌ docker exec -it <์ปจํ…Œ์ด๋„ˆ๋ช…> <๋ช…๋ น์–ด>
    โ†’ it(interactive terminal) ๋ช…๋ น์–ด๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ์œ ์ง€(์ข…๋ฃŒ x)
  • ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ„ฐ๋ฏธ๋„ ์‚ฌ์šฉ docker exec -it <์ปจํ…Œ์ด๋„ˆ๋ช…> sh
  • ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ค‘์ง€
    • ์ž‘์—… ๋ชจ๋‘ ๋งˆ์น˜๊ณ  ์ค‘์ง€(SIGTERM+SIGKILL) docker stop <์ปจํ…Œ์ด๋„ˆ๋ช…>
    • ์ฆ‰์‹œ ์ค‘์ง€(SIGKILL) docker kill <์ปจํ…Œ์ด๋„ˆ๋ช…>
  • ๋„์ปค ์ด๋ฏธ์ง€ ์‚ญ์ œ docker rmi <์ด๋ฏธ์ง€>
  • ๋„์ปค ์ด๋ฏธ์ง€ ๋‚˜์—ด docker images

docker ps ์ถœ๋ ฅ๊ฒฐ๊ณผ ์ž์„ธํžˆ ๋ณด๊ธฐ

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
a1b2c3d4e5f6   nginx:latest   "/docker-entrypoint.โ€ฆ"   2 hours ago     Up 2 hours     0.0.0.0:80->80/tcp     web-server
  • CONTAINER ID
    ์ปจํ…Œ์ด๋„ˆ์˜ ๊ณ ์œ ํ•œ ์•„์ด๋”” ํ•ด์‹œ๊ฐ’
    ์‹ค์ œ๋กœ๋Š” ๋” ๊ธธ์ง€๋งŒ ์ผ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅ๋œ๋‹ค
  • IMAGE
    ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉํ•œ ๋„์ปค ์ด๋ฏธ์ง€ ์ด๋ฆ„
  • COMMAND
    ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์‹คํ–‰๋  ๋ช…๋ น์–ด
    ๋Œ€๋ถ€๋ถ„ ์ด๋ฏธ์ง€์— ๋‚ด์žฅ๋ผ ์žˆ์œผ๋ฏ€๋กœ ๋ณ„๋„ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ
  • CREATED
    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๊ฐ
  • STATUS
    ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ
    ์‹คํ–‰ ์ค‘์€ Up, ์ข…๋ฃŒ๋Š” Exited, ์ผ์‹œ ์ •์ง€๋Š” Pause
  • PORTS
    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐœ๋ฐฉํ•œ ํฌํŠธ์™€ ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐํ•œ ํฌํŠธ
    ํŠน๋ณ„ํ•œ ์„ค์ •์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ
  • NAMES
    ์ปจํ…Œ์ด๋„ˆ์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„
    ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ --name ์˜ต์…˜์œผ๋กœ ์ด๋ฆ„์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋„์ปค ์—”์ง„์ด ์ž„์˜๋กœ ํ˜•์šฉ์‚ฌ์™€ ๋ช…์‚ฌ๋ฅผ ์กฐํ•ฉํ•ด ์„ค์ •
    id์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค‘๋ณต์ด ์•ˆ ๋˜๊ณ  ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์žˆ์Œ (docker rename <์›๋ž˜ ์ด๋ฆ„> <๋ณ€๊ฒฝํ•  ์ด๋ฆ„>)


์ฐธ๊ณ 

Docker docs
๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” ๋„์ปค์™€ CI ํ™˜๊ฒฝ
[๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” ๋„์ปค์™€ CI ํ™˜๊ฒฝ] Docker ๊ฐœ๋…
"Docker ์—†์–ด๋„ ๋˜์ง€ ์•Š๋‚˜์š”?" โ€” ๋ฉด์ ‘๊ด€์ด ๋“ฃ๊ณ  ์‹ถ์€ ์ง„์งœ ๋Œ€๋‹ต
[๋ฉด์ ‘] ๊ธฐ์ˆ  ๋ฉด์ ‘ - Docker
๋„์ปค ๋ฉด์ ‘ ์งˆ๋ฌธ 20์„  ์ •๋ฆฌ ์‹ค๋ฌด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ผญ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ๊ฐœ๋…

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