EC2를 이용한 Docker 배포

노누리·2022년 4월 7일
12

간단하게 Docker 이미지를 만드는 것과 EC2를 통해 배포하는 법을 알아보려고 한다. 이후에 Docker가 무엇인지 구체적으로 정리하여 포스팅할 것이다.!

이용할 환경

  • AWS EC2
  • Docker
  • Nodejs

우선 Docker를 이용하여 배포하기 위해서는 다음과 같은 단계가 필요하다.
1. Dockerfile 생성
2. 이미지 받아오기
3. 컨테이너 실행

Dockerfile은 이미지를 생성하기 위한 스크립트이다. 그리고 생성한 이미지를 통해 컨테이너에서 실행하면 Docker 배포 완료!

이때 이미지라는 것은 컨테이너 실행에 필요한 파일과 설정값들을 가지고 있는 것이다. 파일이 node인지, 어떤 포트에서 실행할건지 등 컨테이너에게 알려주기 위한 설정값들이 들어있다.

하지만 이러한 방법을 쓰면 localhost에서만 접근이 가능하기때문에 EC2를 이용하여 배포를 한다.

Docker 설치

본인은 Macbook Air (M1)을 사용하기 때문에 Mac 기준으로 설명할 것이다.
Docker를 사용하려면 당연하게도 먼저 Docker를 설치해야한다. 터미널을 열고 homebrew를 이용하여 설치해준다.

brew install --cask docker

시간이 조금 걸림!

위와 같은 화면이 나오면 설치 성공!

설치가 완료되면 application도 함께 설치된 것을 볼 수 있다.

Dockerfile

vsCode에서 Dockerfile을 만들면 확장프로그램을 설치하라고 뜬다. Docker 확장프로그램을 설치하고 나면 편하게 이미지 생성이 가능하다.

FROM node:12-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "npm", "start" ]
EXPOSE 3000

프로젝트가 있는 폴더에 Dockerfile을 생성해준다.

FROM : 이미지를 생성할 때 사용할 기반 이미지
alpine은 cloud 환경을 고려한 가벼운 linux 이미지이다.

WORKDIR : 작업 디렉토리를 지정하는 것. 없으면 새로 생성한다.
COPY : build 명령 중간에 호스트의 파일 또는 폴더를 가져와 이미지에 가져오는 것이다.
RUN : image가 올라갔을 때 실행되는 명령어
CMD : 컨테이너를 생성 및 실행 시에 실행하는 명령어
EXPOSE : 생성된 이미지에서 열어줄 포트


test.py
const express = require('express');
const fs = require('fs');

const app = express();

app.get('/', (req, res, next) => {
  res.send('Docker test 입니다.');
});

app.listen(3000, () => {
  console.log('run');
});

테스트할 js 파일을 생성한다.

이미지 생성하기

vsCode 확장 프로그램으로 Build image를 눌러도 되지만 Macbook M1을 사용하는 사람들은 linux/arm64로 만들어지기 때문에 터미널로 --platform linux/amd64를 추가해줘야 한다.

docker build --platform linux/amd64 -t [생성할 이미지 이름]:[tag 이름 (없으면 latest)] .

꼭 마지막에 .를 붙여줘야한다. (현재 폴더를 가리키는 것이기 때문)

컨테이너 실행

docker run -d -p [호스트 포트]:[컨테이너 포트] [이미지 이름]

이렇게 위 단계를 차례대로 실행하면 localhost로 접속이 가능할 것이다. 외부에서도 접속을 해야하기 때문에 EC2를 이용하여 배포를 진행하겠다.

아래부터는 EC2 인스턴스와 ssh 접속 설정이 모두 완료된 전제하에 이루어진다.
이후에 포스팅 할 예정

Docker Hub 가입

Docker Hub는 생성한 이미지를 클라우드에 올려두는 것이다. hub에 올려둔 이미지를 EC2 서버에서 가져와서 그 이미지를 이용하여 컨테이너를 run하고 배포하는 것이다.
(이렇게만 보면 간단한데 시간이 꽤 걸렸다.)

그러기 위해서는 Docker Hub의 계정이 필요하기 때문에 회원가입을 해야한다.
Docker Hub 홈페이지

EC2와 Docker

EC2 서버에 접속한다. (ssh 이용)

sudo docker ps

실행되고 있는 컨테이너의 리스트를 보여준다.

sudo docker images

현재 EC2의 서버에 있는 이미지 리스트를 보여준다.

위의 단계를 모두 거쳤다면 Docker 이미지가 생성되어있기 때문에 Docker Hub에 이미지를 push하고 EC2 서버에 pull 해야한다.

이미지를 Docker Hub에 push

docker push [생성한 이미지 이름]:[tag]

명령어 외에도 vsCode 확장 프로그램 이용하여 push 할 수 있다.

Docker Hub에 이미지가 올라온 것을 확인한 후, EC2 서버에 접속하여 이미지를 pull 한다.

sudo docker pull [hub ID]:[image 이름]

sudo docker images를 이용하면 생성된 이미지 리스트와 이미지의 이름을 볼 수 있으니 해당 명령어로 확인해보자.

pull 했으니 컨테이너만 실행하면 끝이다!

sudo docker run -d -p [호스트 포트]:[컨테이너 포트] [image 이름]

본인은 sudo docker run -d -p 3000:3000 [이미지 이름]을 사용하여 브라우저에서도 3000번 포트로 접속하고 컨테이너도 3000번 포트로 실행하였다.

이 경우 EC2 보안 그룹에서도 HTTP 부분의 포트를 3000번 포트로 설정해야 접속가능하다!

혹시나 EC2 설정도 완료하고 컨테이너 실행까지 완료했는데도 퍼블릭 IP로 접속이 되지 않는다면 보안그룹을 다시 설정하고 인스턴스를 재시작하면 접속이 가능해지니까 인스턴스를 재시작해보자!

그걸 모르고 접속이 안돼서 몇 시간동안 끙끙거리고 있었다..

오류 해결 방법 추가
Docker가 제대로 종료되지 않은 경우에 run 명령어를 실행하면 이미 포트번호가 할당되어있다는 오류가 뜬다. 그럴땐 아래와 같은 명령어를 이용하여 컨테이너를 삭제했다가 다시 실행해보자.

sudo docker rm -f [컨테이너 번호]

💡 요약
1. 프로젝트를 완성한다.
2. Dockerfile을 생성한다.
3. Docker 이미지를 빌드한다.
4. Docker Hub에 이미지를 push 한다.
5. EC2 서버에서 해당 이미지를 pull 한다.
6. EC2 서버에서 컨테이너를 실행한다.

세세하게 적으려고 6단계나 적었지만 간단하게 말하면
Docker 이미지를 만들고 push한 뒤 이미지를 pull 하여 컨테이너를 실행하면 된다.

이후에 해야할 일

  • 데이터베이스 연결하기
  • Docker-compose 알아보기

Docker, EC2에 대해서 추후 포스팅하기!


참고 https://wooono.tistory.com/123

profile
백엔드 개발자입니다.

0개의 댓글