Docker

[Docker] 도커에 Server 올려서 실행하기

sian han 2023. 1. 2. 11:41

https://feelfreetothink.tistory.com/173

 

[React & Typescript 프로젝트] Happy-Christmas !

▶ 소개 크리스마스 편지를 ('나' 한정) 주고 받을 수 있는 웹사이트 ▶ 요구사항 이름을 입력해 등록된 메세지가 있는지 확인할 수 있다. 비밀번호를 입력해 본인에게 등록된 메세지를 확인할

feelfreetothink.tistory.com

 

크리스마스때 진행했던 토이프로젝트는 BackEnd / FrontEnd 두개의 폴더로 구성되어있다.

그 중 BackEnd 폴더를 Docker 에 올려서 실행시켜보려고 한다.

 

서버는 AWS RDS 인스턴스와 연결해 두었다.

 

 

▶ 루트경로에 Dockerfile 생성

  - BackEnd 폴더만 docker 에 올릴예정이라서 BackEnd 루트경로에 Dockerfile 을 생성했다. (첫글자는 대문자로)

FROM node:16 //기반 이미지
WORKDIR /usr/src/app //작업을 수행할 디렉토리 정의

COPY package*.json ./  //package.json 파일과 package-lock.json 파일을 복사
RUN npm install //위에서 복사한 파일을 이용해 이미지에 필요한 npm 패키지 설치

COPY . . //현재 작업 디렉토리의 모든 파일을 이미지에 복사

EXPOSE 4000 //이미지가 실행될 때 외부로 열어줄 포트를 지정

CMD ["npm", "run", "dev"] //이미지가 실행될 때 실행할 명령을 지정. 여기서는 npm run dev 명령을 실행함

 

 

▶ 루트경로에 .dockerignore 파일 생성

  - .dockerignore 파일은 Docker 이미지를 빌드할 때 고려하지 않아야 할 파일과 디렉토리를 지정하는 파일이다.

node_modules
npm-debug.log

 

 

 이미지 빌드

docker build . -t {username}/{이미지이름}

 

 

▶ 빌드된 이미지 확인

docker images

(docker desktop > images 에서도 확인 가능)

 

 

 

▶ 컨테이너 생성 / 실행

docker run -d -p 4000:4000 --name proj seohyunhan/happy-christmas

 

docker run : Docker 컨테이너 실행 명령어

-d : 컨테이너를 백그라운드에서 'detached' 모드로 실행하는 것. 컨테이너가 실행된 이후에도 콘솔을 유지할 수 있다.

-p : 컨테이너에서 사용하는 포트를 HOST 포트로 연결하는 것. 컨테이너의 4000 포트를 HOST 4000포트로 연결하고있다. 이렇게 하면localhost:4000 으로 접근할 수  있게 된다. 

 

이 명령어를 통해 컨테이너가 실행되면서 실행되는 컨테이너 안의 server 는 localhost:4000으로 접근할 수 있다. 

 

에러 : Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:49160 -> 0.0.0.0:0: listen tcp 0.0.0.0:49160: bind: address already in use

Docker desktop 에서 컨테이너를 실행시키면 status 가 running 이었다가 바로 exit 으로 변경됨. 이후 위와 같은 에러 메세지 발생

 

해결 : 컨테이너를 생성하고 실행하면서 Dockerfile 에 심어놓은 명령어(npm run dev)가 입력되기 때문에 포트 충돌 에러 발생. 기존에 로컬에서 돌아가던 4000번 포트 접속을 해제해줬음.

 

 

에러 : denied: requested access to the resource is denied

 

해결 : 이미지의 username 과 dockerhub 에 가입된 ID 가 일치하지 않아서 생긴 오류. 등록된 이미지를 삭제하고, 양식에 맞춰 이미지를 재생성해줌

docker build . -t {이미지이름} //기존 이미지 생성할땐 이미지 이름만 적었었음 => 에러
docker build . -t {username}/{이미지이름} //새로운 이미지 생성 => 해결

 

 

 

여기까지만 해주면 docker 에 올려놓은 서버와 잘 작동하는 것을 확인할 수 있다. 

나는 처음에 EC2 에 도커에 연결된 server 를 올려놓는 것이 목적이었기 때문에 아래 절차를 추가로 진행했었다.

 


▶ Docker hub login

ec2 에 ssh 접속후

docker login

username 이랑 비밀번호 입력하라고 뜨는데, docker hub 에 push 를 하기 위해선 기존 비밀번호가 아니라 Access Token 을 발급받아서 입력해야한다. 

에러 : 비밀번호 입력해도 로그인은 되는데 위 사진과 같이 push 가 안됨

해결 : Access Token 으로 로그인

 

Access Token 은 Docker hub > Account settings > Security에서 발급가능하다

 

 

 

 

▶ Docker hub image push

✗ docker push seohyunhan/christmas-letter

 

Docker hub > Repositories 에서 push 된 image 확인 가능

 

 

 

이렇게 하면 EC2 인스턴스에 올릴 준비 끝이다 !

 

 

 

 

 

 

 

참고 자료

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/

 

Node.js 웹 앱의 도커라이징 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org