일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PETERICA
- kotlin querydsl
- aws
- CKA
- Linux
- Java
- IntelliJ
- APM
- 공부
- AWS EKS
- Kubernetes
- kotlin
- 기록으로 실력을 쌓자
- Pinpoint
- kotlin spring
- 오블완
- 정보처리기사실기 기출문제
- MySQL
- Elasticsearch
- 티스토리챌린지
- kotlin coroutine
- minikube
- Spring
- 정보처리기사 실기
- CloudWatch
- mysql 튜닝
- 코틀린 코루틴의 정석
- 정보처리기사 실기 기출문제
- AI
- CKA 기출문제
- Today
- Total
피터의 개발이야기
[docker] Docker에서 node.js 서버 실행방법(docker run, dockerfile, docker-compose) 본문
[docker] Docker에서 node.js 서버 실행방법(docker run, dockerfile, docker-compose)
기록하는 백앤드개발자 2024. 2. 22. 00:01ㅁ 들어가며
ㅇ 테스트를 위해 샘플 API를 node.js로 띄워야 한다.
ㅇ 서버를 실행하는 방법을 3가지로 정리하였다.
- docker run : docker run 명령어를 통해 생성
- dockerfile : 기본 이미지에 install까지 마친 이미지를 생성하여 docker run을 수행
- docker-compose: 베이스 이미지에서 install과 run 명령어를 정의하고 up down으로 리소스 관리 효율적
ㅇ 서버 소스를 다운받고 가장 기본적인 docker run을 이용하는 방법에 대해서 알아보자.
ㅁ 서버 소스 다운로드
# git 소스다운로드
$ git clone https://github.com/peterica/flutter_tutorial.git
# 소스 폴더로 이동
$ cd ./flutter_tutorial/calendar_scheduler_server
ㅁ docker run
# docker 컨테이너 실행
$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node:19-alpine
5baa3c65e42cab9b429b3269f9bf480a4bfac0b0f7803e80feeb1624984de57e <== 컨테이너 아이디 출력됨
# 기동확인
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5baa3c65e42c node:19-alpine "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp node_test
# 컨테이너 접속
$ docker exec -it node_test sh
# work dir 이동
$ cd home/node/
# npm 설치
$ npm install
up to date, audited 739 packages in 5s
82 packages are looking for funding
run `npm fund` for details
26 vulnerabilities (12 moderate, 8 high, 6 critical)
To address issues that do not require attention, run:
npm audit fix
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
npm notice
npm notice New major version of npm available! 9.6.3 -> 10.4.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.4.0
npm notice Run npm install -g npm@10.4.0 to update!
npm notice
# npm 기동
$ npm run start:dev
> server@0.0.1 start:dev
> nest start --watch
[2:52:13 AM] Starting compilation in watch mode...
[2:52:19 AM] Found 0 errors. Watching for file changes.
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [NestFactory] Starting Nest application...
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [InstanceLoader] AppModule dependencies initialized +27ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [InstanceLoader] ScheduleModule dependencies initialized +0ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RoutesResolver] AppController {/}: +205ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RouterExplorer] Mapped {/, GET} route +3ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RoutesResolver] ScheduleController {/schedule}: +0ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RouterExplorer] Mapped {/schedule, GET} route +1ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RouterExplorer] Mapped {/schedule, POST} route +1ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [RouterExplorer] Mapped {/schedule, DELETE} route +1ms
[Nest] 57 - 02/22/2024, 2:52:21 AM LOG [NestApplication] Nest application successfully started +2ms
ㅇ 위의 과정은 표면적으로 기동하는 과정을 보기 위해서 개별적으로 실행한 것이다.
# docker 삭제
$ docker rm node_test
node_test
# docker 실행
$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node:19-alpine
1d83287d6d342fbdef8ef96589ebcefa08d702b9d9b4e15a1fd834f6a19d7d79
# docker 백그라운드 설치 및 노드 서버 기동
$ docker exec -it -d node_test \
sh -c "cd /home/node && npm install && npm run start:dev"
# docker 로그 확인
$ docker logs node_test
Welcome to Node.js v19.9.0.
Type ".help" for more information.
# 접속 테스트
$ curl localhost:3000
Hello World!%
ㅇ 소결
docker run은 명령어를 정확히 알아야 하지만, 할 때마다 헷갈리고 트러뷸 슈팅이 필요하다. 그래서 재사용 시 명령어를 따로 기록해 둬야할 필요가 있다. 리소스를 제거 후 다시 사용할 때는 install 소요시간이 매번 필요하다.
Dockerfile을 이용해 install된 상태에서 docker run 시 시작 커멘드까지 정의해 보자.
ㅁ Dockerfile 작성
# 베이스 이미지
FROM node:19-alpine
# 컨테이너 워딩 디렉토리
WORKDIR /home/node
# install을 위한 패키지 정보 복사
COPY package*.json ./
# 도커 서버가 실행할 커멘드 추가
RUN npm install --silent
# 실행 파일들 복사
COPY . .
# 컨테이너 구동 시 node 기동문
CMD [ "npm", "run", "start:dev" ]
# host 연동 port 지정
EXPOSE 3000
ㅁ Docker 이미지 빌드
# docker 이미지 빌드
$ docker build -t node_test .
[+] Building 38.9s (10/10) FINISHED docker:desktop-linux
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 509B 0.0s
=> [internal] load metadata for docker.io/library/node:19-alpine 0.0s
=> CACHED [1/5] FROM docker.io/library/node:19-alpine 0.0s
=> [internal] load build context 6.4s
=> => transferring context: 239.54MB 6.4s
=> [2/5] WORKDIR /home/node 0.0s
=> [3/5] COPY package*.json ./ 0.6s
=> [4/5] RUN npm install --silent 23.1s
=> [5/5] COPY . . 5.1s
=> exporting to image 3.6s
=> => exporting layers 3.6s
=> => writing image sha256:d5f4d2db21432701dfec5014febab9c070f14911b31c46dee14f79dc76abbcf9 0.0s
=> => naming to docker.io/library/node_test 0.0s
View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/bcnc1xcro7yg3fjgyienpls47
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview
ㅁ Docker 실행
$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node_test
a5a9522da206b801ed956ba857e96fedee3c450af0b6b020b27ab7b01b44c167
$ 접속 테스트
$ curl localhost:3000
Hello World!%
ㅇ 소결
이미지를 미리 만들어 install 시간을 줄일 수 있었다. 하지만 어찌 되었든 run 명령어가 필요하다.
명령어를 쓸 필요 없이 docker-compose에 다 정의하여 단순하게 up down으로 리소스를 관리해 보자.
ㅁ docker-compose 작성
# docker-compose 확인
$ cat docker-compose.yml
version: "1.0"
services:
dev:
container_name: node_test
image: node:19-alpine
command:
- /bin/sh
- -c
- |
cd /home/node
npm install --silent
npm run start:dev
ports:
- "3000:3000"
volumes:
- ./:/home/node
ㅁ docker-compose up 실행
$ docker-compose up
[+] Running 1/0
✔ Container node_test Created 0.0s
Attaching to node_test
node_test |
node_test | > server@0.0.1 start:dev
node_test | > nest start --watch
node_test |
node_test |
[2:35:21 AM] Starting compilation in watch mode...
node_test |
node_test | [2:35:27 AM] Found 0 errors. Watching for file changes.
node_test |
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [NestFactory] Starting Nest application...
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [InstanceLoader] AppModule dependencies initialized +30ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [InstanceLoader] ScheduleModule dependencies initialized +0ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RoutesResolver] AppController {/}: +214ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RouterExplorer] Mapped {/, GET} route +3ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RoutesResolver] ScheduleController {/schedule}: +0ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RouterExplorer] Mapped {/schedule, GET} route +2ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RouterExplorer] Mapped {/schedule, POST} route +1ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [RouterExplorer] Mapped {/schedule, DELETE} route +1ms
node_test | [Nest] 41 - 02/22/2024, 2:35:29 AM LOG [NestApplication] Nest application successfully started +3ms
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 1/1
✔ Container node_test Stopped 10.1s
node_test exited with code 0
canceled
ㅇ docker-compose 실행 시
- 로그 바로 확인 가능하다.
- 프로세스를 종료하면 docker컨테이너도 종료한다.
ㅁ docker-compose up 백그라운드 실행 및 종료
# 백그라운드 실행
$ docker-compose up -d
[+] Running 2/2
✔ Network calendar_scheduler_server_default Created 0.0s
✔ Container node_test Started
# 서버기동 테스트
$ curl localhost:3000
Hello World!%
# 실행 종료
$ docker-compose down
[+] Running 2/2
✔ Container node_test Removed 10.1s
✔ Network calendar_scheduler_server_default Removed
ㅇ 종료 시 container도 함께 제거되어서 리소스 정리가 따로 필요하지 않다.
ㅁ 함께 보면 좋은 사이트
ㅇ [flutter] 일정 관리 앱 - 서버와 연동하기
ㄴ 이 글을 쓰다가 지금의 글을 작성하게 됨.
'DevOps > Docker' 카테고리의 다른 글
[docker] 애플 실리콘 M1에서 도커 컨테이너 실행 시 no specific platform 오류 해결 (1) | 2024.03.17 |
---|---|
[Docker] 맥북M1에 도커 컨테이너 colima설치 (0) | 2024.03.17 |
[docker] docker compose 여러 명령 실행 (0) | 2024.02.21 |
[Docker] Dokémon, Docker 웹관리 페이지, WEB GUI for Docker (2) | 2023.12.27 |
Docker 파일복사 | 폴더복사 (로컬 - 컨테이너) (2) | 2023.12.07 |