데브코스 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
This post is licensed under CC BY 4.0 by the author.