Post

데브코스 TIL - 백엔드 컨테이너 만들기

백엔드 컨테이너 만들기

Docker 구성

  • 베이스 이미지: node 18v
  • 백엔드 응용을 설치하고 실행할 위치 선정 /var/app
  • 컨테이너 빌드
    • ${PROJECT_ROOT}/backend/package*.json을 이용하여 프로덕션 의존성 설치
    • RUN npm ci --omit=dev
    • 타입스크립트 소스 빌드 결과를 복사
  • 기본 환경변수 설정 (컨테이너가 응용을 실행할 환경에 맞추는 것이 좋음)
    • 백엔드가 요청 수신할 포트
    • DB: host,port,database,user,password
    • CORS_ALLOWED_ORIGIN

실습

1. Dockerfile 작성

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
# Node.js 기본 이미지 사용
FROM node:18

# 컨테이너 내에서 작업 디렉토리 설정
WORKDIR /var/app

COPY package.json package-lock.json ./

# node-pre-gyp를 전역으로 설치
RUN npm install -g node-pre-gyp

# 종속성 설치, 개발 종속성 제외
RUN npm ci --omit=dev

# 빌드 디렉토리 복사
COPY ./build/ ./build/

ENV PORT=3031 \
    CORS_ALLOWED_ORIGIN="http://localhost:3000" \
    HOST="localhost" \
    USER="prgms" \
    DATABASE="prgms_notes" \
    DATABASE_PASSWORD="prgms" \
    MARIA_DB_PORT="30036" \
    TOKEN_PRIVATE_KEY="prg_note"

EXPOSE 3031

HEALTHCHECK CMD curl --fail http://localhost:3031/healthcheck || exit 1

# 컨테이너 시작 시 실행할 기본 명령 지정
ENTRYPOINT [ "node","." ]

2. 컨테이너 빌드 테스트

1
docker build -t prgms-test .
  • 결과
1
2
3
4
5
C:\Users\user\Desktop\스프린트4\prgms-notes\backend>docker build -t prgms-test .
[+] Building 41.6s (12/12) FINISHED                                                                                  docker:default
...
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview

3. 테스트 절차 재사용을 위한 Makefile 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 테스트 절차 재사용을 위한 Makefile

ARCH = amd64

# 도커 허브
IMG_TAG="hyeem66/prgms-test:latest"


all: cat ./Makefile

node:
	npm ci
	npm run build

test:
	npm test

# 도커 이미지 만드는 단계
image: Dockerfile node
	docker build --platform=linux/${ARCH} --tag ${IMG_TAG} .

push:
 	docker push ${IMG_TAG}

4. 테스트용 데이터베이스 구성

root 폴더에 docker-compose.yaml파일 생성
ㅁservices와 networks는 동일한 라인에 위치해야함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  db:
    image: mariadb:11.2.2
    environment:
      - MARIADB_ROOT_PASSWORD=root
    # 로컬 컴퓨터 콘솔에서 접근하는 경우 - localhost:3032
    # docker compose에 의하여 같은 네트워크에서 실행하는 컨테이너에서 접근 - db:3306
    ports:
      - '3032:3306'
    networks:
      - notes
    # host:mysql경로 (volume 공유)
    volumes:
      - './db:/var/lib/mysql'

networks:
  notes: {}

5. 데이터베이스 초기화

DB_HOST가 localhost이기 때문에 --protocol -tcp옵션을 사용하여 mysql 명령어를 실행시켜야 함

1
docker compose up -d
  • 데이터베이스 초기화
1
mysql --protocol tcp ‒P 3032 ‒u root ‒p < init-user.sql
1
mysql --protocol tcp ‒P 3032 ‒u root ‒p <  init-db.sql
  • 데이터 베이스 상태 확인
1
2
3
4
5
6
7
8
mysql --protocol tcp –P 3032 –u prgms -p

Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 11.2.2-MariaDB-1:11.2.2+maria~ubu2204 mariadb.org binary distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.
1
2
3
4
5
docker compose down

[+] Running 2/2
 ✔ Container prgms-notes-db-1  Removed
 ✔ Network prgms-notes_notes   Removed

6. 백엔드 컨테이너도 실행 환경 만들기

root 폴더의 docker-compose.yaml파일에 코드 추가

1
2
3
4
5
6
7
8
9
10
services:
  backend:
    image: "hyeem66/prgms-test:latest"
    environment:
      DB_HOST: db
      DB_PORT: 3306
    ports:
      - 3031:3031
    networks:
      - notes

7. 테스트를 위한 벡엔드 실행

1
2
3
4
5
docker compose up -d

[+] Running 2/2
 ✔ Container prgms-notes-backend-1 Started
 ✔ Container prgms-notes-db-1       Running

healthcheck 완료 기다리기

  • 다음 명령어를 사용해서 확인
1
docker ps

docker ps

This post is licensed under CC BY 4.0 by the author.