-
간단한 Node.js 앱을 이용한 도커 활용백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 30. 18:16
이론으로만 공부한 도커를 실제로 적용시켜볼 것이다.
물론 아주 간단한 앱을 만들어서 적용해보는 것이다.
강의에서 Node.js를 통해 진행했기 때문에 따라 진행할 것이며 나중에 스프링으로 변환할 것이다.
package.json
{ "name": "nodejs-docker-app", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js" }, "dependencies": { "express": "4.17.1" }, "author": "", "license": "ISC" }
간단하게 express를 이용해서 node.js를 사용할 수 있도록 하는 환경 설정이다.
server.js
const express = require('express'); const PORT = 8080; //APP const app = express(); app.get('/', (req, res) => { res.send("Hello world"); }); app.listen(PORT); console.log("Server is running");
root 페이지로 접근하면 8080 포트를 통해 Hello wolrd를 출력해주는 server.js 코드이다.
DockerFile
FROM node:10 RUN npm install CMD ["node", "server.js"]
일단 저번에 배웠던 것처럼 가장 근본이 되는 FROM, RUN, CMD부터 작성해준다.
FROM node:10은 node라는 이미지를 10 버전으로 가져온다.
RUN npm install은 실행 시 npm을 설치해준다.
CMD ["node", "server.js"]는 노드 웹 서버를 작동시키기 위해서 node + 엔트리 파일 이름을 입력하는 것이다.
이 상태에서 docker build ./를 입력하면 package.json이 없다는 에러가 난다.
이미지 빌드를 할 때 package.json이 없다고 에러가 나는 이유는 npm install을 할 때 어플리케이션에 필요한 종속성을 다운받는데 다운 받을 때 package.json을 보고 명시된 종속성들을 다운받아서 설치한다.
이 때 package.json이 컨테이너 안에 없기 때문에 찾을 수 없다는 에러가 발생한다.
해결 방법 : package.json을 컨테이너 안으로 넣어줘야 한다.
도커 컨테이너의 현재 디렉토리에 복사를 해주는 명령어 - COPY package.json ./
package.json이라는 로컬에 있는 파일을 ./라는 도커 컨테이너의 장소에 복사한다는 뜻이다.
Dockerfile에 COPY 추가
FROM node:10 COPY package.json ./ RUN npm install CMD ["node", "server.js"]
RUN npm install이 진행되기 전에 도커 컨테이너에 package.json을 복사해준다.
그런데도 에러가 나는데 server.js도 컨테이너에 없기 때문이다.
따라서 디렉토리의 모든 파일들을 복사해주도록 COPY ./ ./로 수정했다.
FROM node:10 COPY ./ ./ RUN npm install CMD ["node", "server.js"]
docker build -t chanhee01/nodejs ./로 빌드를 해보고 run을 해보면 아래와 같이 서버가 작동한다는 로그가 뜬다.
하지만 위의 사진처럼 docker run <이미지 이름>으로 run을 하면 localhost:8080을 입력했을 때 에러가 뜬다.
그 이유는 컨테이너에 복사해줬던 것처럼 네트워크도 로컬 네트워크에 있던 것을 컨테이너 내부에 있는 네트워크와 연결시켜줘야 하기 때문이다.
즉, 로컬 네트워크와 컨테이너 네트워크의 port를 매핑시켜줘야 한다는 것이다.
로컬 네트워크와 컨테이너 네트워크 PORT의 매핑
-p 옵션을 통해서 로컬의 5000번 포트를 컨테이너의 8080 포트에 매핑을 시켜주면 된다.
5000번 보트로 접근을 하면 Hello world가 출력된 것을 확인할 수 있다.
Working Directory 명시
WORKDIR의 정의를 먼저 알아보면 이미지 안에서 어플리케이션 소스 코드를 갖고 있을 디렉토리를 생성하는 것이다.
굳이 따로 Working Directory가 있어야 하는 이유가 있다.
workdir를 지정하지 않고 그냥 COPY를 할 때 생기는 문제점이 있는데, 위에서처럼 그냥 COPY를 진행하면 package.json, server.js과 같은 파일들이 루트 디렉토리에 복사된다는 것이다.
단점
- COPY할 파일의 이름이 원래 file system의 이름과 같다면 원래 파일은 없어지며 덮어씌워진다는 이유가 있다.
- 모든 파일이 한 디렉토리에 들어가서 파악하기 힘들다. 너무 정리가 안 되어있다.
Dockerfile
FROM node:10 WORKDIR /usr/src/app COPY ./ ./ RUN npm install CMD ["node", "server.js"]
COPY를 하기 전에 WORKDIR를 선언해주며 /usr/src/app 경로에 지정해줬다.
빌드를 하고 run을 하면서 shell로 들어가보면 디렉토리가 workdir로 이동되었으며 루트 경로에는 파일이 복사되지 않은 것을 확인할 수 있다.
위의 사진과 같은 형태이다.
'백엔드 관련 강의 공부 > 도커와 CI환경' 카테고리의 다른 글
도커 컴포즈(Docker Compose) (0) 2023.12.30 어플리케이션 코드 수정 후 빌드 - Docker Volume (0) 2023.12.30 Dockerfile과 도커 이미지 만들기 (0) 2023.12.29 실행 중인 컨테이너에 명령어 전달 - exec 명령어 (0) 2023.12.29 도커 컨테이너의 생명주기 (0) 2023.12.29