Node.js - Docker API 패키징

Temporary·2024년 7월 14일
0

Nods.js

목록 보기
10/39

.dockerignore

03-10-rest-api-with-email 폴더를 복사 붙여넣기해 04-02-docker-with-express로 이름을 변경해서 docker를 알아보자.

그리고, backend 폴더로 이동하여 폴더 안에 Dockerfile을 만들어준다.

# 컴퓨터 만드는 설명서

# 1. 운영체제 설치(node 14버전과 npm과 yarn이 모두 설치되어있는 리눅스)
FROM node:14

# 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기
COPY . /myfolder/
WORKDIR /myfolder/

# 3. 도커안에서 index.js 실행시키기
CMD yarn start:dev

FROM node:14 node가 설치되어 있는 리눅스 컴퓨터를 한대 만들고,

COPY . /myfolder/ 모든 소스 코드를 복사해 도커 컴퓨터에 넣어주고.

WORKDIR /myfolder/ 명령어를 실행할 작업 폴더 위치를 정해준다.

CMD yarn strat:dev 실행 명령어를 입력하여 서버를 실행한다.


🚨 여기에는 문제가 하나 있다.

현재의 폴더에는 node_modules 폴더가 존재하지 않다. 설령 모듈들이 설치되어 있다고 해도 이는 문제가 된다.

로컬에서는 각자의 컴퓨터 환경에서 설치된 node_modules 폴더로 모듈을 관리했다면,

가상 컴퓨터에서는 서로 다른 환경에 간섭 받지 않도록 모듈들을 설치를 해줘야 한다.

모든 소스 코드들이 복사 된 후, 모듈을 설치하는 명령어를 추가하여 로컬의 환경에 간섭받지 않도록 dockerfile 을 작성해 준다.

RUN yarn install 명령어를 dockerfile 에 추가하여 모듈을 설치하는 것이다.

# 컴퓨터 만드는 설명서

# 1. 운영체제 설치(node 14버전과 npm과 yarn이 모두 설치되어있는 리눅스)
FROM node:14

# 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기
COPY . /myfolder/
WORKDIR /myfolder/
RUN yarn install

# 3. 도커안에서 index.js 실행시키기
CMD yarn start:dev

혹시나 기존에 있는 node_modules 폴더가 도커내부로 복사되는 것을 방지하기 위해 무시하라고 알려주는 설정을 해줘야 한다.

.dockerignore 파일을 새로 만들고 아래와 같이 적는다.

node_modules

이제 도커에서는 node_modules 폴더를 무시하여, COPY . /myfolder/ 명령어로 모든 소스코드를 복사해 올 시, node_modules 폴더가 복사 되지 않는다.

터미널에서 해당 폴더 04-02-docker-with-expressbackend 폴더로 이동해 도커를 빌드해준다.

docker build . 명령어를 입력해서 빌드할 수 있다.

이미지가 잘 만들어졌는지 확인해보자

docker images 를 입력하여 IMAGE ID 에서 확인이 가능하다.

두 개의 이미지 중에서 방금 전에 만들어진 이미지의 아이디를 복사한다.

docker run 이미지ID 를 입력해, 도커를 실행해준다.

도커 내부 접속

도커를 실행했으면, 생성한 도커 안으로 들어가 보자.

현재 도커가 실행중인 터미널은 그대로 두고, 창문 모양의 버튼을 눌러 새로운 터미널을 띄워준다.

새롭게 생긴 터미널에서 해당 폴더(04-02-docker-with-expressbackend) 위치를 확인해 준다.

docker ps 명령어를 입력해, 현재 프로세스를 확인해본다.

방금 실행한 도커(컨테이너)가 실행 중임을 확인할 수 있다. STATUS를 보면 Up으로 되어있다.

그렇다면 이제 이 컨테이너에 내부에 들어가보자

docker exec -it 컨테이너_아이디 /bin/bash 명령어를 입력하면, 화면이 bash 쉘로 바뀌게 된다.

쉽게 얘기하면 도커에서 돌아가고 있는 가상 컴퓨터의 터미널로 들어온 것이다.

가상 컴퓨터의 터미널에 왔으니 현재 소스코드가 잘 복사가 되어있는지 확인해보자

pwd 명령어로 현재 폴더 위치를 확인할 수 있으며, ls 명령어를 통해 모든 소스코드들이 잘 복사되어 왔는지 확인 할 수 있다.

아래 사진을 보면 로컬의 파일들이 잘 복사되어있는 것을 볼 수 있다.

터미널은 exit 명령어를 통해 종료할 수 있다.

이제 분리했던 터미널을 닫아주고, 도커로 띄운 서버의 API가 잘 작동하는지 postman으로 확인해보자

'/boards'GET 요청을 한다.

‼️  요청을 해보면 실행이 안되는 것을 확인할 수 있습니다.

포트 포워딩

현재 실행이 안되는 이유는 포트에 있다.

지금까지 yarn start:dev 명령어로 express 서버를 3000번 포트에서 실행하고

localhost:3000에 접속하면 문제가 없었지만,

Docker 환경에서는 내 컴퓨터 안에 도커라는 프로그램이 있고, 그 안에서 express 서버가 실행중이다.

즉, 가상 컴퓨터 안에서는 3000번 포트로 잘 접속되지만, 내 컴퓨터에서는 3000번에 아무 것도 존재하지 않아 요청 시 존재하지 않는 포트로 접속을 요청하기에 실행이 안되는 것이다.

따라서, 가상 컴퓨터의 3000번과 내 컴퓨터의 포트를 연결해주는 작업이 추가적으로 필요하고,
이를 포트 포워딩이라고 한다.

일단, 실행되고 있는 컨테이너를 멈춰준다.

새로운 터미널을 열고 04-02-docker-with-expressbackend 폴더로 이동해준다.

docker ps 명령어를 입력해서 컨테이너 아이디를 복사한다.

복사한 컨테이너 아이디를 이용해서 docker stop 컨테이너_아이디 명령어를 실행한다.

이제 도커를 다시 실행하는데, 내 컴퓨터의 8000번 포트와 도커 컴퓨터의 3000번 포트를 연결해준다.

docker images 명령어로 이미지 아이디를 확인해주고

다음으로는 내 컴퓨터의 8000번 포트를 도커 컴퓨터 3000번 포트로 연결해달라는 명령어를 추가하여

docker run -p 8000:3000 이미지_아이디 명령어를 입력한다.

다시 postman으로 요청을 보내서 확인해보자.

내 컴퓨터의 8000번 포트로 연결을 했기 때문에 3000이 아니라,

http://localhost:8000/boards 으로 GET 요청을 보낸다.

요청된 결과값이 잘 들어오는 것을 확인해준다.

새로운 터미널에서 docker stop 컨테이너_아이디 으로 컨테이너를 종료하는 것으로 마무리한다.

profile
Temporary Acoount

0개의 댓글