MEAN 스택 애플리케이션 컨테이너화를위한 Docker Compose



Docker Compose는 여러 컨테이너를 정의하고 실행하여 Docker에서 복잡한 애플리케이션을 실행하기위한 도구입니다 (예 : MEAN 애플리케이션 컨테이너화).

Docker에 대한 이전 블로그에서 Docker 이미지, Docker 컨테이너 및 그에 대한 필요성에 대해 읽었을 것입니다. 읽어 보지 않으 셨다면 읽어 주시기 바랍니다. , Docker Compose에 대한이 블로그를 계속하기 전에.

Docker와 함께 제공되는 가능성을 탐색 한 후 더 많은 것을 배우는 것은 확실히 매우 흥미 롭습니다. 그렇지 않나요? 적어도 나는 도전에 빠졌을 때였습니다.





Docker Compose 소개

단일 서비스 응용 프로그램을 컨테이너화하는 것은 매우 쉬웠습니다. 하지만 여러 서비스를 별도의 컨테이너에 컨테이너화해야했을 때 장애가 발생했습니다. 내 요구 사항은 MEAN 스택 애플리케이션을 컨테이너화하고 호스팅하는 것이 었습니다.

네, 당신은 그것을 올바르게 읽었습니다. 풀 스택 애플리케이션. 처음에는 불가능하다고 생각했습니다. 그러나 Docker Compose에 대해들은 후 모든 문제가 해결 될 것이라는 것을 알았습니다.



Docker Compose를 사용하여 MEAN 스택 애플리케이션의 각 스택에 대해 별도의 컨테이너를 만들고 호스팅 할 수 있습니다. MEAN은 MongoDB Express Angular 및 NodeJ의 약어입니다. 이 블로그에서 보여줄 데모도 같은 주제입니다.

Docker Compose를 사용하면 이러한 각 기술을 동일한 호스트의 개별 컨테이너에 호스팅하고 서로 통신 할 수 있습니다. 각 컨테이너는 다른 컨테이너와 통신하기위한 포트를 노출합니다.

이러한 컨테이너의 통신 및 가동 시간은 Docker Compose에 의해 유지됩니다.



그렇다면이 전체 인프라를 어떻게 설정해야하는지 물어볼 수 있습니다. 그럼 좀 더 자세한 설명을 드리겠습니다.

Dockerfile

dockerfile을 작성하여 단일 애플리케이션 컨테이너를 회전하는 방법과 유사하게 각 단일 컨테이너 애플리케이션을 빌드하기 위해 별도의 dockerfile을 작성해야합니다. 또한 실제 작업을 수행 할 Docker Compose File도 작성해야합니다. Docker Compose File은 서로 다른 dockerfile을 실행하여 서로 다른 컨테이너를 만들고 서로 상호 작용할 수 있도록합니다.

우리의 경우 MongoDB, ExpressJS, Angular 및 NodeJS로 구성된 풀 스택 애플리케이션이 있습니다. MongoDB는 백엔드 데이터베이스를 처리하고 NodeJS와 ExpressJS는 서버 측 렌더링을, Angular는 프론트 엔드를 담당합니다.

MEAN Stack 앱-Docker Compose-Edureka

세 가지 구성 요소가 있으므로 각 구성 요소에 대해 컨테이너를 회전해야합니다. 다음과 같은 방법으로 컨테이너를 회전해야합니다.

  1. 컨테이너 1 – 각도
  2. 컨테이너 2 – NodeJS 및 ExpressJS
  3. 컨테이너 3 – MongoDB

Docker 컨테이너 생성

평균 애플리케이션을 도킹하는 첫 번째 단계로 Angular의 컨테이너에서 시작하여 각 구성 요소를 빌드하기위한 dockerfile을 작성해 보겠습니다. 이 dockerfile은 'package.json'파일과 함께 프로젝트 디렉토리 내에 있어야합니다. 'package.json'에는 각도 애플리케이션을 빌드하기 위해 'NPM'에서 사용해야하는 종속성 버전에 대한 세부 정보가 포함되어 있습니다.

1. 프런트 엔드 용 Dockerfile

노드에서 : 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 4200 CMD [ 'npm', 'start']

항상 그렇듯이 첫 번째 명령은 기본 이미지를 가져 오는 것이며 기본 'node : 6'이미지를 가져옵니다.

다음 두 명령은 Angular 코드를 저장하기 위해 Docker 컨테이너 내부에 새 디렉토리 '/ usr / src / app'을 만들고이를 컨테이너 내부의 작업 디렉터리로 만드는 것입니다.

그런 다음 프로젝트 디렉토리에서 컨테이너 내부로‘package.json’파일을 복사합니다.

그런 다음 npm 캐시를 정리하는 'npm cache clean'명령을 실행합니다.

그런 다음 Angular 앱 호스팅에 필요한 상용구 다운로드를 시작하는 'npm install'명령을 실행합니다. 'package.json'에 지정된 종속성 버전을 기반으로 보일러 플레이트 다운로드를 시작합니다.

다음 'RUN'명령 실행은 프로젝트 디렉토리에있는 모든 코드, 폴더를 컨테이너 내부로 복사하는 것입니다.

위의 명령은 웹 UI를 통해 프런트 엔드 클라이언트에 액세스하는 사용자가 만든 요청을 보내기 위해 백 엔드 서버와 통신하기 위해 포트 번호 4200을 노출하도록 컨테이너에 요청합니다.

마지막 명령은‘npm’을 시작하는‘RUN’명령입니다. Angular 앱을 빌드하기위한 코드 실행이 시작됩니다.

이제 Angular 앱이 준비되었지만 백엔드 서버 및 데이터베이스에 대한 종속성으로 인해 제대로 호스팅되지 않습니다. 이제 더 나아가 백엔드 서버를 컨테이너화하기위한 dockerfile을 작성해 보겠습니다.

피보나치 함수 C ++

2. 백엔드 용 Dockerfile

이 dockerfile조차도 프로젝트 디렉토리에 있습니다. 이 디렉토리에는 Express 서버의 종속성 및 NodeJS의 기타 요구 사항을 정의하기위한‘package.json’파일도 포함됩니다. 그러나 가장 중요한 것은 백엔드 서버를 지원하는 프로젝트 코드가 포함되어 있다는 것입니다.

노드에서 : 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 3000 CMD [ 'npm', 'start']

보시다시피 두 dockerfile 사이에는 많은 유사점이 있습니다. 기본 이미지 레이어로 동일한 'node : 6'을 사용하고 컨테이너 내부에 새 디렉터리를 만들고 작업 디렉터리로 만들고 'npm install'명령을 실행합니다. 그러나 유일한 차이점은 통신을 위해 노출 된 포트 번호입니다. 이 경우 포트 번호 3000이 정의됩니다. 여기에서 서버가 호스팅되고 클라이언트의 요청을 찾습니다.

3. 데이터베이스

제목에 'dockerfile For Database'를 언급하지 않은 이유가 궁금 할 것입니다. 그 이유는 실제로 사용자 정의가 필요하지 않기 때문입니다. 데이터를 저장하기 위해 바로 'MongoDB'기본 이미지를 가져 와서 액세스 할 수있는 포트 번호를 노출 할 수 있습니다.

이제 당신의 마음에 대한 질문은 내가 그것을 어디에서 할 것인가? Docker Compose File에서 할 수 있습니다.

Docker 작성 파일

Docker Compose File은 Docker 애플리케이션을 설정하기위한 서비스, 네트워크 및 볼륨에 대한 세부 정보가 포함 된 YAML 파일입니다.

아래 명령을 실행하여 Docker Engine의 버전을 찾으십시오.

도커 -v

명령을 실행하면 호스트에서 실행중인 버전이 반환됩니다. 호스트의 Docker Engine 버전에 따라 적절한 버전의 Docker Compose를 다운로드하십시오. 다운로드 할 적절한 버전을 찾을 수 있습니다. Docker의 공식 문서 .

Docker Engine 버전 17.05.0-ce를 실행하고 있으므로 Docker Compose 버전 3을 사용했습니다.

Docker Compose 설치

Compose를 다운로드하려면 아래 명령 세트를 실행하십시오.

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o / usr / local / bin / docker- sudo chmod + x / usr / local / bin / docker-compose 작성

명령의 버전 번호는 실행중인 Docker Engine 버전에 따라 변경됩니다.

아래는 Docker Compose File의 일부인 명령입니다.

version : '3.0'# docker-compose version 지정 # 실행할 서비스 / 컨테이너 정의 services : angular : # 첫 번째 서비스 빌드의 이름 : angular-app # Dockerfile 포트의 디렉토리 지정 :- '4200 : 4200' # 포트 매핑을 지정합니다. express : # 두 번째 서비스 빌드의 이름 : express-server # Dockerfile 포트의 디렉터리를 지정합니다.- '3000 : 3000'# 포트 매핑 링크를 지정합니다.-데이터베이스 #이 서비스를 데이터베이스 서비스 데이터베이스에 연결합니다. # 세 번째 서비스 이미지 이름 : mongo # 포트에서 컨테이너를 빌드 할 이미지 지정 :- '27017 : 27017'# 포트 포워딩 지정

위 파일의 명령이 이해가되지 않는다고 확신합니다. 자, 그 문제를 해결합시다.

코드의 첫 번째 줄에서 사용중인 Docker Compose 버전을 정의했습니다. Compose가 오류없이 제대로 작동하도록하려면 매우 중요한 단계입니다. Docker Engine 버전에 따라 Docker Compose 버전을 다운로드해야합니다.

그 후 '서비스'라는 키워드를 사용하여 3 개의 컨테이너를 정의했습니다. 이러한 서비스는 내 스택, 프런트 엔드, 백 엔드 및 데이터베이스의 세 가지 구성 요소를 참조합니다. 따라서이 경우 내 컨테이너의 이름은 내 서비스의 이름 (예 : 'angular', 'express'및 'database')이됩니다.

키워드 'build'는 해당 컨테이너를 회전하기위한 dockerfile이 해당 디렉토리에 있음을 나타내는 데 사용됩니다. 잠깐, 어떻게 헷갈 리나요?

간단 해. 경로는‘build :’뒤에 지정해야합니다. 이 경우 'angular-app'및 'express-server'는 Docker Compose File이있는 디렉터리에서 도달 할 수있는 두 디렉터리에 대한 경로입니다. 데이터베이스 컨테이너의 경우 단순히 dockerfile의 경로 대신 기본 '이미지 : mongo'를 사용한다고 말했습니다.

해시 테이블과 해시 맵의 차이점

각 서비스에 대해 다른 컨테이너 (서비스)에서 요청을 수신 / 전송하는 데 사용할 수있는 포트 번호도 지정했습니다. 앵귤러의 경우 4200, 익스프레스의 경우 3000, 몽고의 경우 27017.

또한 Express 컨테이너에는 데이터베이스 컨테이너에 대한 '링크 :'가있어 서버 측에서 수신 된 모든 데이터가 저장 될 데이터베이스로 전송됨을 나타냅니다.

이제 마지막으로 Compose 설정이 끝났습니다. Docker Compose를 시작하고 3 개의 서비스로 3 개의 컨테이너를 회전하려면 Docker Compose File (YAML 파일)이있는 디렉토리에서 아래의 두 명령을 실행하기 만하면됩니다.

도커 작성 빌드 도커 작성

'docker-compose build'명령은 서비스를 빌드 / 재 구축하는 데 사용되는 반면 'docker-compose up'명령은 컨테이너를 생성 / 시작하는 데 사용됩니다. 어서! 직접 시도해보십시오.

아래는 Docker 이미지가 빌드되고 실행되는 스크린 샷입니다. Angular 이미지가 빌드되고 'angular : latest'라는 이름으로 태그가 지정되는 것을 볼 수 있습니다.

또한 Express 용 이미지는 'express : latest'라는 이름과 태그로 빌드됩니다.

이제 이미지가 빌드되었으므로 이미지를 실행하고 프로세스에서 컨테이너를 회전 해 보겠습니다. 아래는 그 스크린 샷입니다.

아래는 Docker에 의해 세 서비스가 성공적으로 컨테이너화되었음을 의미하는 'webpack : 성공적으로 컴파일 됨'이라는 스크린 샷입니다.

이제 컨테이너가 호스팅되었으므로 해당 포트에서 활성화 된 서비스를 볼 수 있습니다. MEAN 앱의 GUI와 상호 작용하려면 웹 브라우저에 다음 포트 번호를 입력하십시오.

localhost : 4200 – Angular 앱 (프런트 엔드)
localhost : 3000 – Express Server 및 NodeJS (백엔드 / 서버 측)
localhost : 27017 – MongoDB (데이터베이스)

아직 감동 받았나요? Docker가 아직 완료되지 않았기 때문에 기다려주십시오! 'docker-compose scale =’x ''명령을 사용하여 배포 수를 쉽게 확장 / 축소 할 수 있습니다. 즉, 서비스에 대해 그렇게 많은 수의 컨테이너를 만들 수 있습니다. 다음은 특정 서비스를‘5’컨테이너로 확장하는 완전한 명령입니다.

docker-compose scale = 5

이렇게 쉽게 서비스를 확장하고 비용 효율적인 방식으로 패키징하고 컨테이너화하는 것이 Docker를 최고의 배포 도구 중 하나로 만들고 개인적으로 좋아하는 이유입니다.

이 개념에 여전히 의문이 있다면 Docker Compose를 설정하는 방법에 대한 실용적인 실습을 통해 동일한 개념을 설명한 아래 비디오를 시청할 수 있습니다.

Docker Compose | MEAN 스택 애플리케이션 컨테이너화 | DevOps 튜토리얼

이제 Docker에 대해 배웠으므로 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 이 Edureka Docker 인증 교육 과정은 학습자가 Docker를 구현하고 마스터하는 데 필요한 전문 지식을 습득하는 데 도움이됩니다.

질문이 있으십니까? 의견란에 언급 해 주시면 연락 드리겠습니다.