-
Notifications
You must be signed in to change notification settings - Fork 1
Description
도커와 컨테이너 왜 필요한지 알고 계신가요!!
많은 개발팀들이 개발하는 환경, 언어가 다르기에 이 들은 정상적으로 동작하게 해야 한다.
OS > HW > OS > application에서 HW와 OS를 빼버릴 수는 없을까? => 컨테이너가 이 역할을 해줄 수 있다.
docker engine이 컨테이너를 만들 수가 있으며, 리눅스의 논리적으로 나눌 수 있는 가상화 능력을 가지고 있다.
리눅스 컨트롤 그룹을 사용하면 리소스를 제한할 수 있는 가상화환경을 제공한다. 도커를 윈도우에 올리면 하이퍼바이저를 사용해 리눅스 커널에 올린 것처럼 사용할 수 있지만 리눅스 환경에서 도커를 사용하기를 추천한다. 사실 이 하이퍼바이저를 안하기 위해 도커를 사용하는 것이기 때문
모놀리식 VS 마이크로 서비스
- 모놀리식
- 컴파일 소모 시간이 큼
- 정기 점검 다 같이
- 마이크로 서비스
- 개발 팀 개별적으로 구축할 수 있다.
- 네이버 홈페이지, 네이버 메일, 네이버 블로그, 네이버 쇼핑 다 따로 서로 신경 안 써도 된다.
1.1 도커 소개
- 컨테이너 기술을 지원하는 다양한 프로젝트 중에 하나
- 컨테이너 기술을 이전에도 있었으나 도커로 인해 알려짐
1.2 컨테이너가 해결한다!
- 동일 시스템에서 실행하는 소프트웨어의 컴포넌트가 충돌하거나 다양한 종속성을 가지고 있음
- 컨테이너는 가상머신을 사용해 각 마이크로 서비스를 격리(isolate)하는 기술
- 컨테이너는 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행 가능
- 프로세스의 문제가 발생할 경우 컨테이너 전체를 조정해야 하기 때문에 컨테이너에 하나의 프로세스를 실행하도록 하는 곳이 좋다. (브라우저와 비슷!)
2. 도커 라이프사이클 알아보기
도커 레지스트리에는 사용자가 사용할 수 있도록 데이터베이스를 통해 Image를 제공해주고 있음. 누구나 이미지를 만들어 푸시할 수 있으며 푸시된 이미지는 다른 사람들에게 공유 가능
- Registry : Stores many static images
- Images : Static persisted container image
- Container : Image-instance running an app process
- PUSH를 사용할려면 권한이 있어야 한다.
- PULL을 통해 이미지를 다운 받았다면 현재는 정적인 상태 CREATE를 사용해 Container를 만들어 Start를 통해 메모리에서 동작하게 만들어 준다.
- RUN을 통해 (PULL), CRATE, START를 한꺼번에 실행할 수 있다.
- 이미지를 Container로 실행을 하면 START를 해야하는데 RUN을 하면 CREATE와 START가 같이 실행되기에 계속 Container가 생성되니 주의해야 한다.
# 1. 도커 이미지 다운로드와 삭제
sudo docker pull consol/tomcat-7.0
sudo docker rmi consol/tomcat-7.0
# 2. 톰캣 컨테이너 생성
sudo docker run -d --name tc tomcat
# 3. 실행중인 컨테이너 확인
sudo docker ps
# 4. 모든 컨테이너 확인
sudo docker ps -a
# 5. 컨테이너 중지/삭제
sudo docker stop [컨테이너ID/컨테이너NAME]
우리 프로젝트에 적용시켜 보자!
-
Nest.js 프로젝트 준비
- 프로젝트가 완성되었다고 가정하고, 루트 디렉토리에 있는지 확인합니다.
-
Dockerfile 생성 프로젝트 루트에
Dockerfile을 생성하고 다음 내용을 작성합니다:# 베이스 이미지로 Node.js 사용 FROM node:18-alpine # 작업 디렉토리 설정 WORKDIR /usr/src/app # 패키지 파일 복사 COPY package*.json ./ # 의존성 설치 RUN npm install # 소스 코드 복사 COPY . . # 애플리케이션 빌드 RUN npm run build # 포트 설정 EXPOSE 3000 # 애플리케이션 실행 CMD ["node", "dist/main"]
FROM node:18-alpine: Node.js 18 버전의 Alpine Linux 기반 이미지를 사용합니다. Alpine은 경량화된 Linux 배포판입니다.WORKDIR /usr/src/app: 컨테이너 내부의 작업 디렉토리를 설정합니다.COPY package*.json ./: package.json과 package-lock.json (있다면) 파일을 컨테이너로 복사합니다.RUN npm install: 필요한 의존성을 설치합니다.COPY . .: 현재 디렉토리의 모든 파일을 컨테이너의 작업 디렉토리로 복사합니다.RUN npm run build: NestJS 애플리케이션을 빌드합니다.EXPOSE 3000: 컨테이너가 3000번 포트를 사용할 것임을 명시합니다 (NestJS의 기본 포트).CMD ["node", "dist/main"]: 컨테이너가 시작될 때 실행할 명령어를 지정합니다. 여기서는 빌드된 애플리케이션을 실행합니다.
```
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start:prod"]
```
-
.dockerignore 파일 생성 불필요한 파일이 이미지에 포함되지 않도록
.dockerignore파일을 생성합니다:node_modules npm-debug.log dist -
Docker 이미지 빌드 터미널에서 다음 명령을 실행합니다:
docker build -t my-nestjs-app:latest . -
Docker Hub 계정 생성 및 로그인
-
Docker Hub (https://hub.docker.com/)에서%EC%97%90%EC%84%9C) 계정을 생성합니다.
-
터미널에서 다음 명령으로 로그인합니다:
docker login
-
-
이미지 태그 지정
docker tag my-nestjs-app:latest yourusername/my-nestjs-app:latestDockerfile을 통해 Node.js 베이스 이미지 위에 만든 백엔드 애플리케이션 코드와 필요한 의존성들을 추가하여 새로운 이미지를 만든다.
docker tag를 통해 이미 생성된 이미지에 새로운 태그를 부여 Docker Hub에 푸시하기 위한 새태그를 지정
-
Docker Hub에 이미지 푸시
docker push yourusername/my-nestjs-app:latest -
클라우드 서비스 선택 (예: Azure Container Instances)
- Azure 계정이 없다면 생성합니다.
- Azure CLI를 설치합니다.
-
Azure에 로그인
az login -
리소스 그룹 생성
az group create --name myResourceGroup --location eastus -
컨테이너 인스턴스 생성
az container create --resource-group myResourceGroup --name my-nestjs-container --image yourusername/my-nestjs-app:latest --dns-name-label my-nestjs-app --ports 3000 -
배포 상태 확인
az container show --resource-group myResourceGroup --name my-nestjs-container --query "{FQDN:ipAddress.fqdn,ProvisioningState:provisioningState}" --out table -
애플리케이션 접근
- 브라우저에서
http://my-nestjs-app.eastus.azurecontainer.io:3000으로 접속 (URL은 실제 출력된 FQDN을 사용하세요)
- 브라우저에서
-
(선택사항) 커스텀 도메인 설정
- 도메인 제공업체에서 DNS 설정을 합니다.
- A 레코드를 컨테이너의 IP 주소로 설정합니다.
-
(선택사항) HTTPS 설정
- SSL 인증서를 획득합니다 (예: Let's Encrypt).
- Azure Application Gateway나 다른 로드 밸런서를 사용하여 SSL 종료를 구성합니다.
-
모니터링 설정
- Azure Monitor를 사용하여 로그 및 메트릭을 수집합니다.
az monitor log-analytics workspace create --resource-group myResourceGroup --workspace-name my-nestjs-logs -
스케일링 설정 (선택사항)
- Azure Container Instances는 자동 스케일링을 지원하지 않으므로, 필요하다면 Azure Kubernetes Service(AKS)로 마이그레이션을 고려하세요.
-
보안 강화
- Azure Security Center의 권장 사항을 검토하고 적용합니다.
- 네트워크 보안 그룹(NSG)을 구성하여 트래픽을 제한합니다.
-
지속적인 업데이트 및 관리
- 코드 변경 시 위 과정 (4-7, 11)을 반복합니다.
- CI/CD 파이프라인을 구축하여 이 과정을 자동화할 수 있습니다.
이 과정을 따르면 Nest.js 백엔드가 Docker 컨테이너로 패키징되어 Azure에 배포되고, 인터넷을 통해 누구나 접근할 수 있게 됩니다. 보안, 스케일링, 모니터링 등의 추가적인 설정은 프로젝트의 요구사항에 따라 조정할 수 있습니다.

