Docker & Docker-compose
๐คย Problem
Nest.js ์ PostgreSql ์ ํจ๊ป ์ฌ์ฉํ๋ฉด์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ ํ๋ฒ์ ์คํํ๊ณ ์ถ๋ค๋ ์๊ฐ์ ํ๋ค.
์ต์ํ Nginx ์ฌ์ฉ๋ ๊ฐ๋ฅํ๊ธด ํ์ง๋ง ์ธํ ๊ณผ์ ์ด ๋๋ฌด ๋ฒ๊ฑฐ๋ก์ ๋ค. ์ข ๋ ์ ์ง๋ณด์์ ์ ํฉํ ๋ฐฉ์์ด ๋ฌด์์ผ๊น ์๊ฐํด๋ดค๊ณ , ์ง๋ ํ๋ก์ ํธ๋ ๋ง๋ง ๋ดค๋ ๋์ปค๋ฅผ ์ ์์ผ๋ก ๊ณต๋ถํด๋ณด๊ธฐ๋ก ํ๋ค.
๐ฑย Solution
์ถ์ฒ๋์
๋์ปค ๊ด๋ จ ์ ํ๋ธ ๊ฐ์, ๊ณต์๋ฌธ์ ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์๋ํด๋ณด์์ง๋ง ์ญ์ ์ฌ์ ์ฒ๋ผ ๋ฑ๋ฑํ ๊ต๊ณผ์์์ ํ์ํ ๊ฐ๋ ์ ๊ณ์ ์ฐพ์๋ณด๋ฉด์ ๋ฐฐ์ฐ๋๊ฒ ์ ์ผ ๋น ๋ฅด๋๋ผ. ์์ ๊ฐ ๊ผผ๊ผผํ๊ฒ ๋์ด์๊ณ , ์ด๋ฐ ์ง์ ์ฅ๋ฒฝ์ด์๋ ์ด๋ ค์ด ๊ฐ๋ ๋ค์ ์ฐพ์๊ฐ๋ฉฐ ์ ๋ ํ๋ ์ ์ ์ดํด๊ฐ ๋์๋ค. ํนํ ๋ฉํฐ์คํ ์ด์ง ๋น๋, volume ์ ๊ดํ ์ค๋ช ์ด ํ๋ก์ ํธ ์ค ๋ฌธ์ ์ ๋ง์ฃผ์ณค์๋ ํฐ ๋์์ด ๋์๋ค.
ubuntu 20 ์์๋ docker-compose up ์ด๋ฐ ์์ผ๋ก ์ค๊ฐ์ -๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
ubuntu 22 ์์๋ docker compose up ์ด๋ฐ ์์ผ๋ก ์ค๊ฐ์ ๋์ด์ฐ๊ธฐ๋ฅผ ํด์ผ ํ๋ค.
ํฌํธํฌ์๋ฉ, Https ์ธ์ฆ์ (Traefik)
- ssl ์ธ์ฆ์๋ฅผ ์ข ๋ ํธ๋ฆฌํ๊ฒ ๋ฐ๊ณ ์ถ์๋ค.
- ํฌํธํฌ์๋ฉ๋ ๋์์ ์งํํ๊ณ ์ถ์๋ค.
๊ทธ๋์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์คํจํ๋ 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 ๋ฅผ ์๋ํ๊ณ ์ฑ๊ณตํ๋ค.
์์ธํ ๋ด์ฉ์ ๋ค์ ๊ธ๋ก ์ฒจ๋ถํ๊ฒ ๋ค.
๐ย Related articles
์ด์๋ช | ๋งํฌ |
---|---|
ํ์์ Traefik์ ์ฅ์ ์ด ๋ฌด์์ผ๊น์? | https://svrforum.com/svr/311870 |
Put Wildcard Certificates and SSL on EVERYTHING | https://technotim.live/posts/traefik-portainer-ssl/ |
node.js argon2 crash Docker container | https://techoverflow.net/2023/04/27/how-to-fix-nodejs-argon2-crash/ |
Prisma Migrate: Deploy Migration with Docker | https://notiz.dev/blog/prisma-migrate-deploy-with-docker |
Arm-AMD CPU ๋ก ์ธํ exec format error ์๋ฌ | https://kimjingo.tistory.com/221 |