๐Ÿ”ŒDocker

MS : Docker ์ž์Šต์„œ ์ •๋ฆฌ

harry.93 2022. 1. 13. 01:13
๋ฐ˜์‘ํ˜•

1๋ถ€ : ์‹œ์ž‘

์ปจํ…Œ์ด๋„ˆ?

์ปจํ…Œ์ด๋„ˆ๋Š” ์•ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ „์ฒด ์šด์˜ ์ฒด์ œ์˜ ์ „์ฒด ํฌ๊ธฐ์™€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋Š” VM(๊ฐ€์ƒ ๋จธ์‹ )๊ณผ ๊ฐ™์€ ์†Œ๊ทœ๋ชจ ๊ฐ€์ƒํ™” ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.
๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด  ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ๋œ, ์‚ฌ์šฉ์ž ๋จธ์‹ ์˜ ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. 

 

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

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฒฉ๋ฆฌ๋œ ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์—๋Š” ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(๋ชจ๋“  ์ข…์†์„ฑ, ๊ตฌ์„ฑ, ์Šคํฌ๋ฆฝํŠธ, ์ด์ง„ ํŒŒ์ผ ๋“ฑ)์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ์ง€์—๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ๋ช…๋ น, ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

docker ์‹คํ–‰๋ช…๋ น

docker run -d -p 80:80 docker/getting-started
-d : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ถ„๋ฆฌ ๋ชจ๋“œ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰.
-p : ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ 80์„ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ 80์— ์—ฐ๊ฒฐ

2๋ถ€ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์•ฑ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ, ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด์„  Dockerfile ์ด๋ž€๊ฒŒ ํ•„์š”ํ•˜๋‹ค.

Dockerfile?

Dockerfile์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ช…๋ น ์Šคํฌ๋ฆฝํŠธ

 

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]

 

* Apple M1 ํ™˜๊ฒฝ์—์„œ๋Š” python ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์•„๋ž˜ ๋‚ด์šฉ์œผ๋กœ ๋นŒ๋“œํ•˜์˜€๋‹ค.

FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN apk --no-cache --virtual build-dependencies add \
  python2 \
  make \
  g++
RUN yarn install --production
CMD ["node", "src/index.js"]

 

Docker Image ๋นŒ๋“œ ๋ช…๋ น

docker build -t getting-started .
-t : ํƒœ๊ทธ ๋„ค์ž„ ์ง€์ •, ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ตœ์ข… ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

 

Docker Image Run ๋ช…๋ น

docker run -dp 3000:3000 getting-started

3๋ถ€ : ์•ฑ ์—…๋ฐ์ดํŠธ

CLI๋ฅผ ์‚ฌ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ

Docker ์กฐํšŒ

docker ps

 

Docker Stop

# Swap out <the-container-id> with the ID from docker ps
docker stop <the-container-id>

 

Docker ์ œ๊ฑฐ

docker rm <the-container-id>
docker rm ๋ช…๋ น์— “force” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ: docker rm -f <the-container-id>

4๋ถ€ : ์•ฑ ๊ณต์œ 

์ด๋ฏธ์ง€ ํ‘ธ์‹œ - Docker Hub

Docker Hub ์— Docker ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ.

๋นˆ ์ƒํƒœ์˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ์ด ๊ณณ์— ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œ ํ•  ์ˆ˜ ์žˆ์Œ. 

$ docker push docker/getting-started
The push refers to repository [docker.io/docker/getting-started]
An image does not exist locally with the tag: docker/getting-started

์ฒซ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋Š”๋ฐ ์ด๋Š” ์ด๋ฏธ์ง€์— ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ. ๋”ฐ๋ผ์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์™€ ๋™์ผํ•˜๊ฒŒ ๋„ค์ด๋ฐ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

CLI - Docker Login

docker login -u <username>

 

Image Name ์ง€์ •ํ•˜๊ธฐ

docker tag getting-started <username>/getting-started:<tagname>

 

Image Push 

docker push <username>/getting-started:<tagname>

 

tagname์€ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด latest ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

 

 

์ƒˆ ์ธ์Šคํ„ด์Šค์—์„œ ์ด๋ฏธ์ง€ ์‹คํ–‰ํ•˜๊ธฐ

 

์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ์ด๋ฏธ์ง€๋ฅผ pull ๋ฐ›์•„ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

Play With Docker ๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ.

์œ„ ์ฒ˜๋Ÿผ 3000๋ฐฐ์ง€๊ฐ€ ๋œจ๋ฉด running์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด ์ง„ ๊ฒƒ. ์ดํ›„ ํ•ด๋‹น ๋ฐฐ์ง€ ํด๋ฆญ์„ ํ†ตํ•ด ๊ตฌ๋™ ์ค‘์ธ ๋ชจ์Šต์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

** Apple M1 ์นฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ, ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์˜ ํ™˜๊ฒฝ์ธ linux/arm64/v8 ๋กœ ๋นŒ๋“œ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์‚ฌ์ดํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Docker build ๋ช…๋ น ์‹œ "--platform linux/amd64" ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋นŒ๋“œํ•˜๋ฉด ํ•ด๋‹น ํ™˜๊ฒฝ์œผ๋กœ ๋นŒ๋“œ๋œ๋‹ค.


5๋ถ€ : ๋ฐ์ดํ„ฐ ์œ ์ง€

์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ ์‹œ์Šคํ…œ

์ปจํ…Œ์ด๋„ˆ๋Š” ์‹คํ–‰ ์‹œ ์ด๋ฏธ์ง€์˜ ๋‹ค์–‘ํ•œ ๊ณ„์ธต์„ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด “์Šคํฌ๋ž˜์น˜ ๊ณต๊ฐ„”์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ‘๊ฒฝ์šฐ์—๋„’ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ ๋ณผ๋ฅจ

์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ.
๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ํ˜น์€ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋™์ผํ•œ ๊ฒฝ๋กœ๋กœ ํƒ‘์žฌํ•˜๋ฉด ๋˜‘๊ฐ™์ด ํ‘œ์‹œ๋œ๋‹ค. 

 

Named Volume(๋ช…๋ช…๋œ ๋ณผ๋ฅจ)

๋ช…๋ช…๋œ ๋ณผ๋ฅจ์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ๋ฒ„ํ‚ท์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Docker์—์„œ ๋””์Šคํฌ ์ƒ์˜ ์‹ค์ œ ์œ„์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋ณผ๋ฅจ ์ด๋ฆ„๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋ณผ๋ฅจ ์ƒ์„ฑ

docker volume create <volume-name>

 

์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ, ๋ณผ๋ฅจ ํƒ‘์žฌ

docker run -dp 3000:3000 -v <volume-name>:<ํƒ‘์žฌํ•  ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ> <image-name>

 

์ด๋Ÿฐ ์‹์œผ๋กœ, ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๊ฒŒ๋” ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* ๊ธฐ๋ณธ Docker ์—”์ง„ ์„ค์น˜์—์„œ ์ง€์›๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๋ณผ๋ฅจ ์œ ํ˜•์ด์ง€๋งŒ NFS, SFTP, NetApp ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ณผ๋ฅจ ํ™•์ธํ•˜๊ธฐ

docker volume inspect <volume-name>

 

 

Mountpoint๊ฐ€ ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์‹ค์ œ ์œ„์น˜์ž…๋‹ˆ๋‹ค. 

** Docker Desktop์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ Docker Desktop์˜ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์•ก์„ธ์Šค ํ•˜๋Š” Docker ๋ช…๋ น์€ ์‹ค์ œ๋กœ ๋จธ์‹ ์˜ ์ž‘์€ VM ๋‚ด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Mountpoint ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์‹ค์ œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋จผ์ € VM ๋‚ด๋ถ€์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WSL 2์—์„œ๋Š” WSL 2 ๋ฐฐํฌํŒ ๋‚ด์— ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


6๋ถ€ : ๋ฐ”์ธ๋“œ ํƒ‘์žฌ ์‚ฌ์šฉ

๋ฐ”์ธ๋“œ ํƒ‘์žฌ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ŠคํŠธ์˜ ํƒ‘์žฌ ์ง€์ ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ๋ฐ์ดํ„ฐ ์œ ์ง€๋ฟ ์•„๋‹ˆ๋ผ ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์—… ์‹œ ๋ฐ”์ธ๋“œ ํƒ‘์žฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ํƒ‘์žฌํ•˜๋ฉด ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๊ณ  ์‘๋‹ตํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ ํ™•์ธ.

docker run -dp 3000:3000 -w /app -v ${PWD}:/app node:12-alpine sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
  • -w /app - ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ
  • -v ${PWD}:/app" - ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ˜ธ์ŠคํŠธ์˜ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ /app ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ฐ”์ธ๋“œ ํƒ‘์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ธ๋“œ ํƒ‘์žฌ ์‚ฌ์šฉ์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„ค์ •์—์„œ ‘๋งค์šฐ’ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋จธ์‹ ์— ๋ชจ๋“  ๋นŒ๋“œ ๋„๊ตฌ์™€ ํ™˜๊ฒฝ์„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ด์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ docker run ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ’€๋˜์–ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ vs ๋ณผ๋ฅจ

- ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ŠคํŠธ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋Ÿฌ๋‹ ์‹œ, ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ํ•จ. ๋”ฐ๋ผ์„œ, ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋„ ๋ฐ”๋กœ๋ฐ”๋กœ ๋ฐ˜์˜๋จ
( ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ”๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅ )

- ๋ณผ๋ฅจ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ŠคํŠธ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋„์ปค์˜ ๋ณผ๋ฅจ ์˜์—ญ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์™€ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•œ๋‹ค. 
( ๋„์ปค์˜ ๋ณผ๋ฅจ ์˜์—ญ์—์„œ ์ œ์–ด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค )
--> ๊ทธ๋Ÿฌ๋ฉด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ?

 

๋ณผ๋ฅจ์ด ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ณด๋‹ค ์ข‹์€ ์žฅ์  From Docker Docs

1. ๋ฐฑ์—…ํ•˜๊ฑฐ๋‚˜ ์ด๋™์‹œํ‚ค๊ธฐ ์‰ฝ๋‹ค.

2. docker CLI ๋ช…๋ น์–ด๋กœ ๋ณผ๋ฅจ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๋ณผ๋ฅจ์€ ๋ฆฌ๋ˆ…์Šค, ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ชจ๋‘ ๋™์ž‘ํ•œ๋‹ค.

4. ์ปจํ…Œ์ด๋„ˆ๊ฐ„์— ๋ณผ๋ฅจ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ๋ณผ๋ฅจ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณผ๋ฅจ์˜ ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

6. ์ƒˆ๋กœ์šด ๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.


7๋ถ€ : ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์•ฑ

์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํ‚น 

๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์•ฑ ๋ผ๋ฆฌ๋Š” ์ƒํ˜ธ๊ฐ„ ํ†ต์‹  ๊ทœ์•ฝ์— ๋”ฐ๋ผ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

MySQL ์—ฐ๊ฒฐํ•˜๊ธฐ

Docker Network ์ƒ์„ฑ

docker network create <network-name>

 

MySQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ Network ์—ฐ๊ฒฐ

docker run --platform linux/x86_64 -d \
--network <network-name> --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7

* ์—ฌ๊ธฐ์„œ๋Š” todo-mysql-data๋ผ๋Š” ๋ณผ๋ฅจ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ , MySQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์œ„์น˜์ธ /var/lib/mysql์— ๋ณผ๋ฅจ์„ ํƒ‘์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ docker volume create ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค. Docker์—์„œ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์˜๋„๋ฅผ ์ธ์‹ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋ณผ๋ฅจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

MySQL ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ

docker exec -it <mysql-container-id> mysql -p

 

์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์™€ MySQL์— ์—ฐ๊ฒฐํ•˜๊ธฐ

๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ ํ•ด๊ฒฐ ๋˜๋Š” ๋””๋ฒ„๊ทธ์— ์œ ์šฉํ•œ ‘๋งŽ์€’ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ nicolaka/netshoot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉ

 

netshoot ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -it --network todo-app nicolaka/netshoot

 

MySQL ์ปจํ…Œ์ด๋„ˆ ์ฃผ์†Œ ํ™•์ธ

dig mysql

“ANSWER SECTION”์—์„œ mysql์— ๋Œ€ํ•ด A ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, 172.23.0.2๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž IP ์ฃผ์†Œ๋Š” ๋‹ค๋ฅธ ๊ฐ’์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ). mysql๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด ์•„๋‹ˆ์ง€๋งŒ, Docker์—์„œ ํ•ด๋‹น ๋„คํŠธ์›Œํฌ ๋ณ„์นญ์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ์˜ IP ์ฃผ์†Œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์•ž์—์„œ ์‚ฌ์šฉํ•œ --network-alias ํ”Œ๋ž˜๊ทธ ์ฐธ์กฐ).

๋”ฐ๋ผ์„œ ์•ฑ์ด mysql์ด๋ผ๋Š” ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

MySQL ๊ณผ ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐ

ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— MySQL ์ •๋ณด๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ ์‹คํ–‰

docker run -dp 3000:3000 \
  -w /app -v ${PWD}:/app \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"

 

์•ฑ ๋Ÿฌ๋‹ ํ›„, ์ ‘์†ํ•˜์—ฌ ๋ช‡๊ฐœ์˜ ์•„์ดํ…œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„, ๋‹ค์‹œ MySQL์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜๋ฉด todo์—์„œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


8๋ถ€ : Docker Compose ์‚ฌ์šฉ

Docker Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Compose์—์„œ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•˜๋Š” YAML ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Compose๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์˜ ‘์ค‘์š”ํ•œ’ ์ด์ ์€ ํŒŒ์ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์„ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ(์ด์ œ ๋ฒ„์ „ ์ œ์–ด ์‚ฌ์šฉ) ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

* mac์šฉ docker desktop์„ ์„ค์น˜ํ•˜์˜€๋‹ค๋ฉด, ๋ณ„๋„๋กœ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

docker-compose version

 

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฒ„์ „์ด ๋ณด์ธ๋‹ค๋ฉด ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

Docker Compose ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— docker-compose.yml ์ด๋ผ๋Š” ํŒŒ์ผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •

# ์Šคํ‚ค๋งˆ ๋ฒ„์ „ ์ •์˜. ์ตœ์‹ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.
version: "3.7" 

# ์„œ๋น„์Šค ๋ชฉ๋ก ์ •์˜
services:
  # ์•ฑ ์„œ๋น„์Šค ์ •์˜
  app:
    # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ์ •์˜ 
    image: node:12-alpine
    # ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ช…๋ น์–ด
    command: sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
    # ํฌํŠธ ์ •์˜ ( host 3000 ์„ container 3000์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ )
    ports:
      - 3000:3000
    # ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์™€ ๋ณผ๋ฅจ ๋งคํ•‘์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
    # ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๊ณณ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    working_dir: /app
    volumes:
      - ./:/app
    # ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ DB ์„ธํŒ….
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
  # MySQL ์„œ๋น„์Šค ์ •์˜ 
  mysql:
    # ์ด๋ฏธ์ง€ ์ด๋ฆ„ ์ •์˜
    image : mysql:5.7
    # docker run ์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ž๋™์œผ๋กœ volume ์ด ์„ค์ •๋˜์—ˆ์ง€๋งŒ
    # ์—ฌ๊ธฐ์„œ๋Š” ์ž๋™์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. 
    # ์ด๋ฆ„ : ๊ฒฝ๋กœ ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ง€์ •๋œ ์ด๋ฆ„์„ ๋ฐ”๊นฅ volumes ์—์„œ ํƒ‘์žฌํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
    volumes:
      - todo-mysql-data:/var/lib/mysql
    # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos
volumes:
  todo-mysql-data:

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ ์‹คํ–‰

์œ„์™€ ๊ฐ™์ด ์„ค์ •์„ ๋๋ƒˆ์œผ๋ฉด, ์ด์ œ ์‹คํ–‰์„ ํ•˜๋ฉด ๋œ๋‹ค.

 

docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ์‹คํ–‰.

docker-compose up -d

 

์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋œจ๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... done

 

ํ•ด๋‹น ๋Ÿฌ๋‹ ๋กœ๊ทธ๋ฅผ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธ.

docker-compose logs -f

 

์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ๊ธฐ๊ฐ€ ๋œ๋‹ค๋ฉด ๋Ÿฌ๋‹์— ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
app_1    | Connected to mysql db at host mysql
app_1    | Listening on port 3000

 

์‹คํ–‰ ์ค‘์ธ ์•ฑ ์Šคํƒ ํ™•์ธ

vscode์—์„œ docker ํ™•์žฅ์„ ๋ณด๋ฉด ์Šคํƒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด๋กœ์จ docker compose ๋ฅผ ํ†ตํ•ด mysql๊ณผ ์•ฑ์„ ๋„คํŠธ์›Œํ‚น์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š”๋ฐ ์„ฑ๊ณตํ•˜์˜€๋‹ค.

 

์ข…๋ฃŒํ•˜๊ธฐ

๋ชจ๋‘ ์ข…๋ฃŒํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋ฉด docker-compose down์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ VS Code Docker ํ™•์žฅ์˜ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋‹จ์ถ”๋กœ ํด๋ฆญํ•˜๊ณ  Compose ์ข…๋ฃŒ ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜๊ณ  ๋„คํŠธ์›Œํฌ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.


9๋ถ€ : ์ด๋ฏธ์ง€ ๊ณ„์ธตํ™”

์ด๋ฏธ์ง€ ๊ณ„์ธต ํ™•์ธ

docker image history <image-name>

 

์ด๋ฏธ์ง€์— ์“ฐ์ธ ๊ณ„์ธต๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งจ ์œ„๊ฐ€ ์ตœ์‹  ๊ณ„์ธต ์ด๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๊ณ„์ธต์˜ ์šฉ๋Ÿ‰ ๋“ฑ์„ ์‰ฝ๊ฒŒ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ณ„์ธต ์บ์‹ฑ

Dockerfile์˜ ๊ฐ ๋ช…๋ น์ด ๊ณ„์ธต์ด ๋˜๋Š”๊ฒƒ ์ž„์„ ํ™•์ธ ํ–ˆ์œผ๋‹ˆ, ๊ณ„์ธต์ด ๋ณ€๊ฒฝ ๋  ๋•Œ ๋งˆ๋‹ค ์ข…์†์„ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ ์ ์ด๋ฏ€๋กœ, ์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์•ผ ํ•จ.

์˜ˆ์ œ์—์„œ๋Š” node์—์„œ ์ข…์†์„ฑ์„ ๊ฐ–๋Š” package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ์„ค์น˜ ํ•œ ํ›„, ๋‚˜๋จธ์ง€๋ฅผ ๊ทธ ์ดํ›„์— ๋ณต์‚ฌํ•˜์—ฌ package.json๋งŒ ๋ณ€๊ฒฝ ์ ์ด ์žˆ์„ ๋•Œ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•จ.

FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
# ์ข…์†์„ฑ ์นดํ”ผ
COPY package.json yarn.lock ./
 COPY . .
RUN apk --no-cache --virtual build-dependencies add \
  python2 \
  make \
  g++
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]

 

๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ

  • ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๊ณผ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ข…์†์„ฑ ๊ตฌ๋ถ„
  • ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ‘ํ•ญ๋ชฉ’๋งŒ ์ œ๊ณตํ•˜์—ฌ ์ „์ฒด ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ถ•์†Œ

 

Maven/Tomcat ์˜ˆ์ œ

# ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„. ๋นŒ๋“œ๋‹จ๊ณ„์—์„œ๋งŒ JDK ํ•„์š”, ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰.
FROM maven AS build
WORKDIR /app
COPY . .
RUN mvn package

# ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„. ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ํ†ฐ์บฃ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌ. 
# ์ด ๋‹จ๊ณ„๊ฐ€ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ, ์ตœ์ข… ๋นŒ๋“œ๋˜๋Š” ์ด๋ฏธ์ง€๋Š” ์ด ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋ฌผ์ž„.
FROM tomcat
COPY --from=build /app/target/file.war /usr/local/tomcat/webapps

 

React ์˜ˆ์ œ

# ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„. ์ด ๋‹จ๊ณ„์—์„œ ๋นŒ๋“œ ์ˆ˜ํ–‰
FROM node:12 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build

# ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„. ์ด ๋‹จ๊ณ„์—์„œ nginx์— ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์˜ฎ๊น€.
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

 

์ฆ‰, ๋นŒ๋“œ ๋‹จ๊ณ„์—๋งŒ ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์ „๋ถ€ ์ด๋ฏธ์ง€์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋นŒ๋“œ ์ˆ˜ํ–‰ ํ›„ ์ด๋ฏธ์ง€์—๋Š” ํฌํ•จ ์‹œํ‚ค์ง€ ์•Š์•„ ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ๋‘๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ๋ณด๋ฉด, ๋นŒ๋“œ ํ›„์˜ ๊ฒฐ๊ณผ๋ฌผ๋งŒ WAS์— ์˜ฎ๊ธฐ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


10๋ถ€ : ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌ

ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ผ์šฐ๋“œ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”. ํ˜„์žฌ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ docker ์ปจํ…์ŠคํŠธ์ž„.

์˜ˆ์ œ์—์„œ๋Š” Azure(์• ์ €) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ์• ์ € ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Œ.
ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ.

docker context use myacicontext
docker run  -dp 3000:3000 <username>/getting-started

๋.

728x90
๋ฐ˜์‘ํ˜•