๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Back
NestJs
48-Docker

1. Docker๋ž€?

Docker๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”Œ๋žซํผ์ด๋‹ค.

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

1.1 ์ปจํ…Œ์ด๋„ˆ vs ๊ฐ€์ƒ๋จธ์‹ 

nestjs-fastcam-docker_48-1

  • ๊ฐ€์ƒ ๋จธ์‹ (VM): ์šด์˜์ฒด์ œ(OS) ์ „์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ: ํ˜ธ์ŠคํŠธ OS ์ปค๋„์„ ๊ณต์œ ํ•˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ›จ์”ฌ ๊ฐ€๋ณ๋‹ค

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

OOP์™€ ๋น„๊ตํ•˜๋ฉด ๋งค์šฐ ์‰ฝ๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” Class๊ณ , ์ปจํ…Œ์ด๋„ˆ๋Š” Class๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋‹ค.

  • ๋ฏธ๋ฆฌ ์ •์˜๋ผ์žˆ๋Š” Image๋ฅผ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Container๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • Class ํ•˜๋‚˜๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ Image ํ•˜๋‚˜๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ Container๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • ์ด๋ฏธ์ง€ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šค๋ƒ…์ƒท
  • ์ปจํ…Œ์ด๋„ˆ : ์ด๋ฏธ์ง€์˜ ์‹คํ–‰ ์ธ์Šคํ„ด์Šค

1.2.1 ์ด๋ฏธ์ง€ ๋‹ค์šด ๋ฐ ์‹คํ–‰

1
docker pull nginx

์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ : Nginx๊ฐ€ ์ •์˜๋ผ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค

1
docker run -d -p 80:80 --name my-nginx nginx

์ด๋ฏธ์ง€ ์‹คํ–‰ (์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰) : Nginx๋ฅผ ๋‹ค์šด๋ฐ›์ง€ ์•Š๋”๋ผ๋„ Nginx๋ฅผ ์›ํ•˜๋Š” ๊ฐฏ์ˆ˜๋งŒํผ Container๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š”๋ฐ ๋งค์šฐ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฐ€์ƒ๋จธ์‹ ๊ณผ ๋‹ค๋ฅด๊ฒŒ, Docker ์ปจํ…Œ์ด๋„ˆ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›”๋“ฑํžˆ ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.


2. ๊ธฐ๋ณธ Docker ๋ช…๋ น์–ด

2.1 ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ

1
docker pull nginx

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

1
docker run -d -p 80:80 --name my-nginx nginx
2
# ๊ฒฐ๊ณผ : ์ปจํ…Œ์ด๋„ˆ IOD ์ถœ๋ ฅ

2.3 ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒ

1
docker ps
2
# ๊ฒฐ๊ณผ : ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์ŠคํŠธ ์•„์›ƒํ’‹

2.4 ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ ๋ฐ ์‚ญ์ œ

1
docker stop my-nginx
2
docker rm my-nginx
3
# ๊ฒฐ๊ณผ : ์ปค๋งจ๋“œ๋ณ„ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅ

2.5 ์ด๋ฏธ์ง€ ์‚ญ์ œ

1
docker images # ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
2
docker rmi nginx # ์‚ญ์ œ๋œ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ

2.6 Docker Hub๋กœ Push

1
docker pull redis
2
docker push your-dockerhub-usename/your-image

3. Dockerfile

1
# ๊ณต์‹ Node.js ๋Ÿฐํƒ€์ž„์„ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ
2
# ์•„๋ž˜ ๋นŒ๋“œ ๊ณผ์ • ๋ช…ใ…Š์ž‰์„ development๋ผ๊ณ  ์ •์˜
3
FROM node:14 AS development
4
5
# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
6
WORKDIR /usr/src/app
7
8
# package.json ๋ณต์‚ฌ ๋ฐ ์˜์กด์„ฑ ์„ค์น˜
9
COPY package*.json ./
10
RUN npm install
11
12
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ ๋ณต์‚ฌ
13
COPY . .
14
15
# ์• ํ”Œ๋ง„์ด์…˜์ด ์‚ฌ์šฉํ•  ํฌํŠธ ๋…ธ์ถœ
16
EXPOSE 3000
17
18
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๋ช…๋ น์–ด
19
CMD ["npm", "start"]

Dockerfile์€ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ์ด๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์ •์˜ํ•˜๊ณ ,
    • ๊ทธ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒจํ‚ค์ง•ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ช…๋ น์–ด๋“ค์ด ์ •์˜๋ผ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ Dockerfile์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€, ํŒŒ์ผ ๋ณต์‚ฌ, ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜, ํฌํŠธ ์„ค์ •, ๋ช…๋ น์–ด ์‹คํ–‰ ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.
  • ๋„์ปค๋Š” ์ด Dockerfile์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ ,
    • ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์—ฌ๋Ÿฌ ๊ณณ ์—์„œ ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค
1
# Dockerfile ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ๋นŒ๋“œ
2
docker build -t my-node-app .
1
# ๋นŒ๋“œํ•œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
2
docker run -d -p 3000:3000 \ --name node-app my-node-app

4. Docker Compose

Compose๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฃจ์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜์˜ docker-compose.yml ํŒŒ์ผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

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

4.1 docker-compose.yml

1
version: '3'
2
sevices:
3
web:
4
image: my-node-app
5
ports :
6
- "3000:3000"
7
depends_on:
8
- db
9
db:
10
image: mysql
11
environment:
12
MYSQL_ROOT_PASSWORD: my-secret-pw
13
volumes:
14
- db-date:/var/lib/mysql
15
16
volumes:
17
db-data:

Docker Compose ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ , ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” YAML ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ์ด๋‹ค.

  • ์ด ํŒŒ์ผ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ Docker Container๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ• ์ง€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค

4.2 Docker Compose ์ปค๋งจ๋“œ

1
# ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
2
docker-compose up
3
4
# ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ํ›„ ์‹คํ–‰
5
docker-compose up --build
6
7
# ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ
8
docker-compose down