이전에 Docker가 무엇이고 왜 사용해야할지 다뤄보았으니 이번에는 프로젝트를 생성하고 Docker로 배포해보고자 한다.
프로젝트를 배포하기 위해서는 준비물로 Docker Desktop을 설치하고 Docker hub에 회원가입할 필요가 있는데 링크는 다음과 같다.
https://www.docker.com/products/docker-desktop/
Docker Desktop: The #1 Containerization Tool for Developers | Docker
Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.
www.docker.com
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
도커 허브에 회원가입 및 로그인을 성공했다면 Docker의 이미지를 저장시킬 repository를 미리 만들어두자
필자의 경우엔 dockerstudy라는 이름으로 만들어두었다.

이제 Docker Desktop을 깔고 Docker hub에 로그인까지 완료했으니 모든 준비가 끝났으니 프로젝트를 생성해 보겠다.
이번에는 간단한 실습을 목표로 하기 때문에 필자는 복잡한 코드를 사용하지 않고 app.listen(PORT, '0.0.0.0', ...)을 통해 외부 접속을 전부 허용하여 다음과 같이 간단한 코드를 사용했다.
app.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000; // 포트 환경 변수 또는 기본값 3000 사용
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server is running on port ${PORT}`);
});
이제 Docker의 설정을 하기 위해 Docker 설정 파일을 작성해야하는데 파일명은 Dockerfile로 하고 파일의 위치는 실행하고자 하는 파일과 같은 경로에 있어야 한다. 경로가 잘못되거나 오타 및 대소문자가 잘못되면 실행되지 않으니 조심하자.
Dockerfile
FROM node:latest
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
- FROM node:latest: 이미지를 공식 Node.js Docker 이미지를 기반으로 하는 설정이며 latest 태그를 사용하여 최신 버전의 Node.js를 사용한다고 표시하기 위해 사용한다.
- COPY package.json .: 먼저 package.json 파일을 컨테이너 내부로 복사하여 npm 패키지들의 목록을 가져온다.
- RUN npm install: npm install 명령어를 사용하여 package.json에 명시된 모든 종속 항목을 설치한다.
- COPY . .: 현재 디렉토리의 모든 파일을 컨테이너 내부로 복사하여 컨테이너로 가져온다.
- EXPOSE 3000: 컨테이너 내부의 포트 3000을 호스트 시스템으로 노출하고 Docker 컨테이너가 실행될 때 컨테이너 내부에서 실행 중인 애플리케이션에 대한 외부 트래픽을 허용하시킨다.
- CMD ["node", "app.js"]: 컨테이너가 시작될 때 실행되는 기본 명령어를 정의할때 사용한다. 위와 같은 경우에는 node를 사용하여 app.js 파일을 실행하기 위해 사용한다.
이제 위와 같이 설정이 끝났으면 프로젝트를 도커의 이미지화 시킬 필요가 있다. Docker Desctop을 실행 한 뒤 VisualStudio와 같은 코드 편집기의 터미널에서 명령어를 입력해야 한다. 명령어는 다음과 같다.
docker build -t imagename:tag .
ex) docker build -t myapp:latest .
. 은 현재 디렉토리를 빌드 컨텍스트로 사용한다는 것을 의미하기 때문에 .까지 전부 붙여줘야 하니 주의하자
위와 같은 과정을 거쳤다면 DockerDesktop에 다음과 같이 이미지가 표시 될 것이다.

이제 만들어진 이미지를 Dockerhub에 푸시 할 필요가 있다.
다음과 같은 명령어를 코드편집기의 터미널에 입력해 주자.
docker push username/repositoryname:tag
ex) docker push cjxisia62/dockerstudy:latest
위의 과정을 수행 했을 때 아래와 같이 도커허브에서 이미지를 확인이 가능하다면 푸시에 성공한 것이다.

이제 push한 이미지를 Ec2를 통해 배포할 생각인데 이전에 Ec2인스턴스 생성 및 쉘을 통한 접속방법을 다룬적이 있기 때문에 설명은 생략하겠다. 만약 궁금한점이 있다면 이전에 작성한 Node.js Ec2 배포해보기 글을 참고해주길 바란다.
쉘을 통해 클라우드에 접근에 성공했다면 ubuntu를 기준으로 다음과 같은 명령어를 사용하여 클라우드 환경을 업데이트 시켜주고 Docker를 설치시키자.
sudo apt update
sudo apt install -y docker.io
이제 docker가 설치가 완료되었다면 도커허브에 업로드 시켰던 이미지를 pull할 필요가 있는데 명령어는 다음과 같다.
docker pull username/repository:tag
ex) docker pull cjxisia62/dockerstudy:latest
이제 가져온 이미지를 다음과 같은 명령어로 실행시키고 실행이 제대로 작동하는지 확인하면 모든 과정이 끝난다.
docker run -d -p hostport:containerport username/repositoryname:tag
docker ps


+ ) 만약 모든 과정을 거쳤고 docker ps를 통해 컨테이너가 실행되는 것 까지 확인이 됐는데 퍼블릭 주소로 접속을 시도하려 했을 때 접속이 되지 않는다면 보안그룹에 인바운드 규칙을 추가하지 않아서 생길 가능성이 크다.
자신의 인스턴스에 맞는 보안그룹에 찾아 들어가고 인바운드를 추가하는 과정을 통해서 포트의 접근을 허용시켜 주자.


'클라우드' 카테고리의 다른 글
| Docker와 Mysql연동 및 Ec2 배포 #下 (0) | 2024.04.28 |
|---|---|
| Docker와 Mysql연동 및 Ec2 배포 #上 (1) | 2024.04.28 |
| Docker 배포해보기 #上 Docker란 무엇인가? (0) | 2024.03.11 |
| Node 백그라운드 실행 및 종료 (0) | 2024.03.08 |
| Node.js Ec2 배포해보기#下 클라우드 설정 및 배포 (0) | 2024.02.20 |