Docker 시작하기 #04 - Dockerfile로 빌드하고 배포하기

Seok·2020년 12월 6일
1

Docker

목록 보기
4/7
post-thumbnail

실습 환경

  • AWS EC2(Ubuntu 16.04)

목표

image


NGINX 설치하기

이 부분은 예전 포스팅에서 설명한 내용지만 다시 적어보았다.

$ sudo apt-get install nginx
$ sudo service nginx start
  • NGINX를 설치하고 실행시킨다.
$ sudo rm /etc/nginx/sites-available/default
$ sudo vim /etc/nginx/sites-available/default
  • /etc/nginx/sites-available/default파일을 열고 아래의 내용을 입력해준다.
	# /etc/nginx/sites-available/default 
	server {
	 listen 80 default_server;
	 server_name _;
	
	 # node api reverse proxy
	location / {
	 proxy_pass http://127.0.0.1:3000/;
	 }
}
  • 80번 포트로의 외부 요청을 내부의 3000번으로 보내게 한다.
$ sudo systemctl restart nginx
  • NGINX의 설정 변경 후 재부팅해서 적용시켜 준다.

image

  • 인스턴스의 public DNS주소를 치면 위와 같은 화면이 나올것이다.

위와 같은 화면이 나오지 않는다면 인스턴스의 보안그룹에서 80번포트가 허용되어있는지 확인하자.


Node.js 프로젝트 생성하기

nodejs, npm, express-generator 설치는 생략.

image

express nodejs-app
cd nodejs-app
npm install
npm start
  • express로 프로젝트를 생성하고 실행했다.

image

  • 인스턴스의 public DNS주소를 치면 위와 같은 화면이 나올것이다.
  • 이전에 NGINX 설정으로 포트포워딩을 해놓았기 때문에 80번으로 들어오는 요청이 3000번 포트로 향하게 해놓았기때문이다.

다음으로 방금만든 nodejs-app을 포함하는 Docker image 를 빌드 하는 과정이다. Dockerfile 을 이용한 이미지 빌드에 앞서 이미지에 포함시키지 않을 내용을 제외해 주자. .dockerignor파일을 생성,작성하여 할 수 있다.

작업은 프로젝트의 루트디렉토리(예시의 nodejs-app) 에서 진행한다.

.dockerignore 생성하기

  • .gitignore와 같은 역할을 한다.
$vim node_modules/

node_modules/

  • 위 내용을 작성해 준다.
  • node_modules/ 디렉터리의 파일들이 도커 파일에 포함되지 않도록 한다.

Dockerfile 작성하기

Dockerfile 작성도 마찬가지로 프로젝트의 루트디렉토리에서 진행한다.

vim Dockerfile

FROM node:12
LABEL Hyunseok CHOI hschoi1104@gmail.com
RUN mkdir -p /app
WORKDIR /app
ADD . /app
RUN npm install
ENV NODE_ENV development
EXPOSE 3000
CMD ["npm", "start"]

  • Dockerfile에 전용 도메인 언어로 내용을 작성한다. 위 내용 중 FORM LABEL과 같은 키워드들을 인스트럭션 이라고 한다.

Instruction

사용된 인스트럭션들을 하나씩 살펴보자.

FROM node:12

  • 베이스 이미지를 정의한다. 이 예시에서는 node.js 12 버전을 베이스 이미지로 사용한다.

LABEL Hyunseok CHOI hschoi1104@gmail.com

  • 이미지를 만든 사람의 정보를 입력한다. Maintainer 라는 인스트럭션과 같은 역할이지만 더 이상 사용되지 않는다고 한다.(deprecated)

RUN mkdir -p /app

  • 패키지 설치나 shell command 등의 작업을 docker image에 실행시킬 때 사용한다.
  • 여기서는 /app 폴더를 docker image 내부에 생성한다.

WORKDIR /app

  • working directory를 지정한다.

ADD . /app

  • 파일이나 디렉토리를 호스트 에서 docker image 내부로 목사한다.

RUN npm install

  • npm install 명령을 도커 내부에서 실행시킨다.

ENV NODE_ENV development

  • 환경변수를 설정한다.

EXPOSE 3000

  • Docker container 외부에 노출할 포트를 지정할 때 사용한다.
  • 예제에서의 프로젝트는 3000번을 사용하므로 3000번을 열어준다.

CMD ["npm", "start"]

  • docker container가 시작될때 명령을 지정한다.
  • CMD는 컨테이너가 시작될때 명령을 수행하고 RUN은 이미지를 빌드할때 수행하는 명령이다.

이미지 빌드하기

image

$ docker build -t hschoi1104/nodejs-app:first .
  • docker build -t 사용자명/이미지명[:태그명] dockerfile경로 형식이다.
  • 시간이 조금 소요된다.

image
빌드중...

image

빌드완료

  • docker images 명령을 통해 빌드된 이미지를 확인할 수 있다.

빌드한 이미지로 컨테이너 실행

image

$ docker run -d -p 3000:3000 hschoi1104/nodejs-app:first
$ docker ps
  • docker run -d -p {포워딩포트}:{이미지포트} 사용자명/이미지명:태그명 형태이다.

image

  • 인스턴스의 public DNS주소를 치면 위와 같은 화면이 나올것이다.

실행중인 컨테이너 로그확인

image

  • 바로 위에서 public DNS주소로 접속했던 로그가 남아있다. 새로고침 하면 로그가 계속 찍히는 것을 알 수 있다.
profile
🦉🦉🦉🦉🦉

0개의 댓글