Post

Docker & Docker-compose

๐Ÿค”ย Problem

Nest.js ์™€ PostgreSql ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์„ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

์ต์ˆ™ํ•œ Nginx ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์„ธํŒ… ๊ณผ์ •์ด ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์› ๋‹ค. ์ข€ ๋” ์œ ์ง€๋ณด์ˆ˜์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด ๋ฌด์—‡์ผ๊นŒ ์ƒ๊ฐํ•ด๋ดค๊ณ , ์ง€๋‚œ ํ”„๋กœ์ ํŠธ๋•Œ ๋ง›๋งŒ ๋ดค๋˜ ๋„์ปค๋ฅผ ์ •์‹์œผ๋กœ ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐ŸŒฑย Solution

์ถ”์ฒœ๋„์„œ

๋„์ปค๊ต๊ณผ์„œ

๋„์ปค ๊ด€๋ จ ์œ ํŠœ๋ธŒ ๊ฐ•์˜, ๊ณต์‹๋ฌธ์„œ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ณด์•˜์ง€๋งŒ ์—ญ์‹œ ์‚ฌ์ „์ฒ˜๋Ÿผ ๋šฑ๋šฑํ•œ ๊ต๊ณผ์„œ์—์„œ ํ•„์š”ํ•œ ๊ฐœ๋…์„ ๊ณ„์† ์ฐพ์•„๋ณด๋ฉด์„œ ๋ฐฐ์šฐ๋Š”๊ฒŒ ์ œ์ผ ๋น ๋ฅด๋”๋ผ. ์˜ˆ์ œ๊ฐ€ ๊ผผ๊ผผํ•˜๊ฒŒ ๋˜์–ด์žˆ๊ณ , ์ดˆ๋ฐ˜ ์ง„์ž…์žฅ๋ฒฝ์ด์—ˆ๋˜ ์–ด๋ ค์šด ๊ฐœ๋…๋“ค์„ ์ฐพ์•„๊ฐ€๋ฉฐ ์ •๋…ํ•˜๋‹ˆ ์ ์  ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค. ํŠนํžˆ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ, volume ์— ๊ด€ํ•œ ์„ค๋ช…์ด ํ”„๋กœ์ ํŠธ ์ค‘ ๋ฌธ์ œ์™€ ๋งˆ์ฃผ์ณค์„๋•Œ ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

ubuntu 20 ์—์„œ๋Š” docker-compose up ์ด๋Ÿฐ ์‹์œผ๋กœ ์ค‘๊ฐ„์— -๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

ubuntu 22 ์—์„œ๋Š” docker compose up ์ด๋Ÿฐ ์‹์œผ๋กœ ์ค‘๊ฐ„์— ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

ํฌํŠธํฌ์›Œ๋”ฉ, Https ์ธ์ฆ์„œ (Traefik)

  1. ssl ์ธ์ฆ์„œ๋ฅผ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฐ›๊ณ  ์‹ถ์—ˆ๋‹ค.
  2. ํฌํŠธํฌ์›Œ๋”ฉ๋„ ๋™์‹œ์— ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์—์„œ ์‹คํŒจํ–ˆ๋˜ traefik์„ ์žฌ์‹œ๋„ ํ•ด์„œ ์„ฑ๊ณตํ–ˆ๋‹ค. ์„ฑ๊ณต ์ด์œ ๋Š” ์ข€ ๋” ๊ณต๋ถ€ํ•ด์„œ ์ฐพ์•„๋ด์•ผ ๋˜๊ฒ ์ง€๋งŒ, ์ผ๋‹จ ๋ ๋•Œ๊นŒ์ง€ ํ•ด์„œ ๋์œผ๋‹ˆ ๊ธฐ์˜๋‹ค!

docker-compose.yml ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
version: "3.8"
services:
  web: # ์ด ์นœ๊ตฌ์— ์ฃผ์˜
    image: shinyubin/fow-be
    container_name: fow-be
    restart: always
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
      - "traefik.enable=true"
      - "traefik.http.routers.web.rule=Host(`api.yubinhome.com`)"
      - "traefik.http.routers.web.entrypoints=websecure"
      - "traefik.http.routers.web.tls.certresolver=myresolver"
    ports:
      - "5000:5000"
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    command: sh -c "npx prisma migrate dev && npm run start:dev"
    networks:
      - freecodecamp # ๋„คํŠธ์›Œํฌ๋ฅผ ๋งž์ถฐ์•ผํ•œ๋‹ค
  traefik:
    image: "traefik:v2.0"
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80" 
      - "--entrypoints.websecure.address=:443"  
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"#  ๋„์ปค์ปจํ…Œ์ด๋„ˆ์˜ ์„œ๋น„์Šค๋ช…๊ณผ ๋งž์ถฐ์•ผํ•œ๋‹ค
      - "--certificatesresolvers.myresolver.acme.email=fogofseoul@gmail.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"  # acme.json ์„ ์ €์žฅํ•  ๊ณณ์„ ๋งž์ถฐ์ค˜์•ผํ•œ๋‹ค
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - freecodecamp # ๋„คํŠธ์›Œํฌ๋ฅผ ๋งž์ถฐ์•ผํ•œ๋‹ค
networks:
  freecodecamp: # ๋„คํŠธ์›Œํฌ๋ฅผ ๋งž์ถฐ์•ผํ•œ๋‹ค

์šด์˜์ฒด์ œ ์˜ค๋ฅ˜

๋‚ด AWS EC2(ubuntu 20.04) ๋จธ์‹ ๊ณผ ์•„์ด๋งฅ(m1)์˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋‹ฌ๋ผ์„œ ๊ฐ์ž์˜ ์šด์˜์ฒด์ œ์—์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. ๊ธฐ์กด์— ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด(arm64) ์—์„œ ๊ฒช์–ด๋ดค๋˜ ๋ฌธ์ œ๋ผ ๊ธˆ๋ฐฉ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

1
2
3
// standard_init_linux.go:228: exec user process caused:ย **exec format error**

$ docker buildx build --platform linux/amd64 -t shinyubin/fow-be:0.1 . --push

CI&CD ํŒŒ์ดํ”„๋ผ์ธ

๋‚ด m1 ์•„์ด๋งฅ์—์„œ ๋ฆฌ์•กํŠธ, Nest.js, postgresql ์„œ๋ฒ„, Prisma studio ๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋‹ˆ, ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์ค‘๊ฐ„์— ์…ธ ํ”„๋กœ์„ธ์„œ ์—ฐ๊ฒฐ์ด ๋Š๊ฒผ๋‹ค๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ์žฆ์•„์กŒ๋‹ค. ์•„์ด๋งฅ์„ ๋„ˆ๋ฌด ๊ตด๋ ธ๋”๋‹ˆ ์•„๋ฌด๋ฆฌ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋ฐฉ์‹์œผ๋กœ ๋„์ปคํŒŒ์ผ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , node-alpine ๋ฒ„์ „์œผ๋กœ ์ตœ๋Œ€ํ•œ ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถฐ์„œ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ๋„ ๋นŒ๋“œํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค์—ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ๋นŒ๋“œ 1๋ฒˆ ํ•˜๋Š” ๋ฐ์— ์ตœ๋Œ€ 200์ดˆ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š”๋ฐ๋‹ค๊ฐ€, ๋นŒ๋“œ ํ›„ ๋ฐฐํฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ec2์— ์˜ฌ๋ฆฌ๋ฉด์„œ SSL์ด ์ž˜ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ์™”๋‹ค ๊ฐ”๋‹ค ํ™•์ธํ•˜๋Š” nnํšŒ์ฐจ ์‹œ๋„๋ฅผ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ํ•˜๋‹ˆ API ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์‹œ๊ฐ„์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ณ„์† ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ CI&CD ๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ์„ฑ๊ณตํ–ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€๋กœ ์ฒจ๋ถ€ํ•˜๊ฒ ๋‹ค.

์ด์Šˆ๋ช…๋งํฌ
ํ™ˆ์—์„œ Traefik์˜ ์žฅ์ ์ด ๋ฌด์—‡์ผ๊นŒ์š”?https://svrforum.com/svr/311870
Put Wildcard Certificates and SSL on EVERYTHINGhttps://technotim.live/posts/traefik-portainer-ssl/
node.js argon2 crash Docker containerhttps://techoverflow.net/2023/04/27/how-to-fix-nodejs-argon2-crash/
Prisma Migrate: Deploy Migration with Dockerhttps://notiz.dev/blog/prisma-migrate-deploy-with-docker
Arm-AMD CPU ๋กœ ์ธํ•œ exec format error ์—๋Ÿฌhttps://kimjingo.tistory.com/221
This post is licensed under CC BY 4.0 by the author.