개발 워크 플로에서 Docker를 사용하면 생산성에 긍정적 인 영향을 미칩니다. 일반적인 "내 컴퓨터에서 작동 함"유형의 버그를 제거하고 다른 컴퓨터에서 설정하려면 실행 중인 Docker 데몬 만 있으면 됩니다.
구현을 시작하기 전에 Docker를 빠르게 살펴 보겠습니다.
https://dev.to/klamserdev/dockerize-your-development-environment-for-nodejs-8cc
Docker 란 무엇입니까?
Docker는 컨테이너, 소프트웨어 패키지를 실행할 수 있는 플랫폼입니다. 이러한 컨테이너를 실행하기 위해 Docker는 OS 수준 가상화를 사용합니다. 컨테이너를 가상 머신의 경량 버전으로 생각할 수 있습니다.
Docker 플랫폼에서 실행하는 모든 컨테이너는 서로 격리됩니다. 예를 들어 Docker가 실행되는 호스트와 호스트에서 실행 중인 하나의 컨테이너는 명시 적으로 지시하는 경우를 제외하고는 동일한 파일 시스템을 공유하지 않습니다.
컨테이너를 시작하려면 Docker 이미지가 필요합니다. 이 이미지는 컨테이너의 청사진입니다. Docker-Hub에서 이미 사전 정의 된 이미지를 가져 오거나 소위 Dockerfile을 작성하여 고유 한 이미지를 구성 할 수 있습니다.
이것은 Docker에 대한 간략한 개요 일 뿐입니다. 여기에서 시작하는 것이 좋습니다.
개발 워크 플로를 고정하는 이유는 무엇입니까?
소개에서 이미 개발 환경에서 Docker를 사용하는 이점 중 하나에 대해 언급했습니다. 이것은 전형적인 "내 컴퓨터에서 작동합니다"문제를 제거한다는 사실입니다. 다른 이점은 다음과 같습니다.
시작하기
프로젝트를 배치 할 새 폴더를 만드는 것으로 시작하고 다음과 같이 Dockerfile을 만듭니다.
$ mkdir node-docker && cd node-docker
$ touch Dockerfile
Dockerfile
Express 애플리케이션에 사용할 컨테이너는 Dockerfile에서 구성됩니다. 이를 위해 우리는 생명을 부여해야 합니다.
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
ENV PORT 5000
RUN npm cache clear --force && npm install
ENTRYPOINT ["npm", "start"]
FROM은 Docker에게 docker 허브에서 node (version : latest)라는 이미지를 가져 오도록 지시합니다.
WORKDIR은 향후 모든 명령이 실행될 디렉토리를 설정합니다.
COPY는 정확히 말한대로 수행하며 package.json 및 package-lock.json을 가져와 WORKDIR에 복사합니다.
ENV는 이름이 PORT이고 값이 5000 인 컨테이너 내부의 환경 변수를 설정합니다.
RUN은 우리가 전달하는 명령을 실행합니다.이 경우 npm 캐시를 지운 다음 package.json에서 모든 종속성을 설치합니다.
ENTRYPOINT는 Docker 컨테이너가 시작될 때 여기에 삽입 한 명령을 실행합니다.
Simple Express App
이제 Dockerfile을 사용할 준비가 되었으므로 컨테이너 내에서 실행할 수 있는 간단한 익스프레스 애플리케이션이 필요합니다. 이를 위해 다음과 같은 두 개의 새 파일을 만듭니다.
$ touch server.js package.json
package.json은 두 가지 종속성, 첫 번째 Express 및 두 번째 nodemon을 가져옵니다.
{
"name": "node-docker",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "nodemon server.js"
},
"author": "Jakob Klamser",
"license": "MIT",
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.4"
}
}
익스프레스 애플리케이션은 메인 페이지를 쳤을 때 간단한 HTML을 반환합니다. 따라서 server.js는 다음과 같아야 합니다.
const express = require('express');
const app = express();
const PORT = process.env.PORT || 5000;
app.get('/', (req, res) => {
res.send(`
<h1>Express + Docker</h1>
<span>This projects runs inside a Docker container</span>
`);
});
app.listen(PORT, () => {
console.log(`Listening on port ${PORT}!`);
});
.dockerignore
Express 컨테이너와 함께 MongoDB 컨테이너를 설정하기 전에 실행 중인 컨테이너에서 일부 파일을 제외하려고 합니다. .dockerignore 파일의 구문은 .gitignore 파일의 구문과 동일합니다.
# Git
.git
.gitignore
# Docker
Dockerfile
docker-compose.yml
# NPM dependencies
node_modules
docker-compose.yml
마지막으로 docker-compose.yml을 정의하고 싶습니다. 이 파일에는 두 개의 다른 컨테이너에서 동시에 Express 애플리케이션과 MongoDB를 실행하는 데 필요한 모든 정보가 포함됩니다. 계속해서 파일을 만들어 보겠습니다.
$ touch docker-compose.yml
이제 다음과 같이 구성합니다.
version: '3'
services:
api:
build: .
ports:
- "5000:5000"
depends_on:
- mongo
volumes:
- "./:/usr/src/app"
- "reserved:/usr/src/app/node_modules"
mongo:
image: "mongo"
ports:
- "27017:27017"
volumes:
reserved:
version : 먼저 사용할 docker-compose의 버전을 정의합니다. 버전 3과 2 사이에는 많은 차이가 있으므로 버전을 선택할 때 주의하세요!
services : Express API (api)와 MongoDB (mongo)를 정의하는 섹션입니다.
build & image : 빌드는 Docker에 Dockerfile에서 이미지를 빌드 하도록 지시합니다. 우리의 경우 현재 디렉토리에서 Dockerfile을 사용하기를 원합니다. 그것이 우리가. 이것은 현재 디렉토리를 정의하기 때문에 매개 변수로. image는 Docker에게 Docker 허브에서 이미 존재하는 이미지를 가져 오도록 지시합니다.
ports & volumes : 포트 이름에서 알 수 있듯이 여기서 포트를 정의합니다. 콜론은 매핑 연산자입니다. 컨테이너의 포트 5000을 호스트 시스템 (이 경우 로컬 머신)의 포트 5000에 매핑하여 컨테이너 외부의 애플리케이션에 액세스 할 수 있도록 합니다. MongoDB의 포트 매핑도 마찬가지입니다. 볼륨은 비슷한 작업을 하지만 이번에는 볼륨을 사용합니다. 코드를 작성하는 로컬 디렉터리를 컨테이너의 WORKDIR에 매핑합니다. 이렇게 하면 소스 코드의 내용을 변경하면 컨테이너가 즉시 반응합니다.
reserved : 로컬 node_modules 폴더 (존재하는 경우)가 컨테이너 내부의 node_modules 폴더를 재정의 하지 않는 특수 볼륨입니다.
다음 명령을 실행하면 Docker는 Dockerfile에서 이미지를 생성 한 다음 두 컨테이너 (api 및 mongo)를 모두 실행합니다.
$ docker-compose up
컨테이너를 중지하려면 다음 명령을 사용하십시오.
$ docker-compose down
결론
이것은 쉽게 확장 할 수 있는 간단한 Docker 개발 환경 설정입니다. 데이터베이스를 변경하거나 프런트 엔드를 렌더링 하기 위해 Nginx를 추가하려면 계속해서 docker-compose.yml에 새 서비스를 추가하거나 기존 서비스를 변경하십시오.
원하는 경우 .NET Core, Java 또는 GoLang 애플리케이션을 Dockerize 할 수도 있습니다. 아래의 댓글 섹션에서 Docker에 대한 귀하의 경험에 대해 알려주십시오. 듣고 싶습니다!
이에 대한 코드는 평소처럼 내 GitHub에 있습니다.
등록된 댓글이 없습니다.