간단하게 Docker 이미지를 만드는 것과 EC2를 통해 배포하는 법을 알아보려고 한다. 이후에 Docker가 무엇인지 구체적으로 정리하여 포스팅할 것이다.!
이용할 환경
우선 Docker를 이용하여 배포하기 위해서는 다음과 같은 단계가 필요하다.
1. Dockerfile 생성
2. 이미지 받아오기
3. 컨테이너 실행
Dockerfile은 이미지를 생성하기 위한 스크립트이다. 그리고 생성한 이미지를 통해 컨테이너에서 실행하면 Docker 배포 완료!
이때 이미지라는 것은 컨테이너 실행에 필요한 파일과 설정값들을 가지고 있는 것이다. 파일이 node인지, 어떤 포트에서 실행할건지 등 컨테이너에게 알려주기 위한 설정값들이 들어있다.
하지만 이러한 방법을 쓰면 localhost에서만 접근이 가능하기때문에 EC2를 이용하여 배포를 한다.
본인은 Macbook Air (M1)을 사용하기 때문에 Mac 기준으로 설명할 것이다.
Docker를 사용하려면 당연하게도 먼저 Docker를 설치해야한다. 터미널을 열고 homebrew
를 이용하여 설치해준다.
brew install --cask docker
시간이 조금 걸림!
위와 같은 화면이 나오면 설치 성공!
설치가 완료되면 application도 함께 설치된 것을 볼 수 있다.
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 : 생성된 이미지에서 열어줄 포트
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는 생성한 이미지를 클라우드에 올려두는 것이다. hub에 올려둔 이미지를 EC2 서버에서 가져와서 그 이미지를 이용하여 컨테이너를 run
하고 배포하는 것이다.
(이렇게만 보면 간단한데 시간이 꽤 걸렸다.)
그러기 위해서는 Docker Hub의 계정이 필요하기 때문에 회원가입을 해야한다.
Docker Hub 홈페이지
EC2 서버에 접속한다. (ssh 이용)
sudo docker ps
실행되고 있는 컨테이너의 리스트를 보여준다.
sudo docker images
현재 EC2의 서버에 있는 이미지 리스트를 보여준다.
위의 단계를 모두 거쳤다면 Docker 이미지가 생성되어있기 때문에 Docker Hub에 이미지를 push
하고 EC2 서버에 pull
해야한다.
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, EC2에 대해서 추후 포스팅하기!