>  기사  >  웹 프론트엔드  >  Docker_node.js를 기반으로 NodeJS 애플리케이션 개발

Docker_node.js를 기반으로 NodeJS 애플리케이션 개발

WBOY
WBOY원래의
2016-05-16 16:40:491258검색

이 Node 앱 정보

이 애플리케이션에는 package.json, server.js 및 .gitignore 파일이 포함되어 있어 손쉽게 사용할 수 있습니다.

.gitignore

node_modules/*

package.json

{
 "name": "docker-dev",
 "version": "0.1.0",
 "description": "Docker Dev",
 "dependencies": {
  "connect-redis": "~1.4.5",
  "express": "~3.3.3",
  "hiredis": "~0.1.15",
  "redis": "~0.8.4"
 }
}

server.js

var express = require('express'),
 app = express(),
 redis = require('redis'),
 RedisStore = require('connect-redis')(express),
 server = require('http').createServer(app);

app.configure(function() {
 app.use(express.cookieParser('keyboard-cat'));
 app.use(express.session({
  store: new RedisStore({
   host: process.env.REDIS_HOST || 'localhost',
   port: process.env.REDIS_PORT || 6379,
   db: process.env.REDIS_DB || 0
  }),
  cookie: {
   expires: false,
   maxAge: 30 * 24 * 60 * 60 * 1000
  }
 }));
});

app.get('/', function(req, res) {
 res.json({
 status: "ok"
 });
});

var port = process.env.HTTP_PORT || 3000;
server.listen(port);
console.log('Listening on port ' + port);

server.js는 모든 종속성을 가져오고 특정 애플리케이션을 시작합니다. 이 특정 애플리케이션은 Redis에 세션 정보를 저장하고 메시지 응답으로 JSON 상태를 반환하는 요청 엔드포인트를 노출하도록 구성됩니다.

한 가지 주의할 점은 환경 변수를 사용하여 Redis에 대한 연결 정보를 재정의할 수 있다는 것입니다. 이는 나중에 개발 환경 개발에서 프로덕션 환경 프로덕션으로 마이그레이션할 때 유용합니다.

도커 파일

개발 요구 사항을 위해 Redis와 Node가 동일한 컨테이너에서 실행되도록 할 것입니다. 이를 위해 Dockerfile을 사용하여 이 컨테이너를 구성합니다.

도커파일

FROM dockerfile/ubuntu

MAINTAINER Abhinav Ajgaonkar <abhinav316@gmail.com>

# Install Redis
RUN  \
 apt-get -y -qq install python redis-server

# Install Node
RUN  \
 cd /opt && \
 wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && \
 tar -xzf node-v0.10.28-linux-x64.tar.gz && \
 mv node-v0.10.28-linux-x64 node && \
 cd /usr/local/bin && \
 ln -s /opt/node/bin/* . && \
 rm -f /opt/node-v0.10.28-linux-x64.tar.gz

# Set the working directory
WORKDIR  /src

CMD ["/bin/bash"]

한줄씩 이해해보자

dockerfile/ubuntu에서
이번에는 Docker Inc.에서 제공하는 dockerfile/ubuntu 이미지를 빌드용 기본 이미지로 사용하라고 docker에 지시합니다.


apt-get -y -qq python redis-server 설치
기본 이미지에는 아무것도 포함되어 있지 않으므로 애플리케이션을 실행하는 데 필요한 모든 것을 얻으려면 apt-get을 사용해야 합니다. 그러면 Python과 redis-server가 설치됩니다. Redis 서버는 저장된 세션 정보를 저장하기 때문에 필요합니다. 그리고 Python의 필요성은 Redis 노드 모듈로 구축할 수 있는 npm에 필요한 C 확장입니다.

RUN \
 cd /opt && \
 wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && \
 tar -xzf node-v0.10.28-linux-x64.tar.gz && \
 mv node-v0.10.28-linux-x64 node && \
 cd /usr/local/bin && \
 ln -s /opt/node/bin/* . && \
 rm -f /opt/node-v0.10.28-linux-x64.tar.gz

이렇게 하면 64비트 NodeJS 바이너리가 다운로드되고 추출됩니다.

WORKDIR /src

이 문장은 컨테이너가 시작된 후 CMD 속성에 지정된 작업을 실행하기 전에 cd /src를 수행하라고 docker에 지시합니다.

CMD ["/bin/bash"]

마지막 단계로 /bin/bash를 실행하세요.

컨테이너 빌드 및 실행

이제 docker 파일이 작성되었으니 Docker 이미지를 빌드해 보겠습니다.

docker build -t sqldump/docker-dev:0.1 .

이미지가 빌드되면 다음 명령문을 사용하여 컨테이너를 실행할 수 있습니다.

docker run -i -t --rm \
      -p 3000:3000 \
      -v `pwd`:/src \
      sqldump/docker-dev:0.1

docker run 명령에서 어떤 일이 일어나는지 살펴보겠습니다.

-i는 대화형 모드에서 컨테이너를 시작합니다(분리 모드에서는 -d와 비교). 즉, 대화형 세션이 끝나면 컨테이너가 종료됩니다.

-t는 의사 tty를 할당합니다.

--rm은 종료 시 컨테이너와 해당 파일 시스템을 제거합니다.

-p 3000:3000은 호스트의 포트 3000을 컨테이너의 포트 3000으로 전달합니다.

-v `pwd`:/src
이 문장은 현재 작업 디렉터리를 호스트의 컨테이너(예: 프로젝트 파일)에 있는 /src에 탑재합니다. Dockerfile에서 ADD 명령을 사용하는 대신 현재 디렉터리를 볼륨으로 탑재하므로 모든 변경 사항이 적용됩니다. 텍스트 편집기에서는 컨테이너에 즉시 표시됩니다.

sqldump/docker-dev:0.1은 실행할 Docker 이미지의 이름 및 버전입니다. 이는 Docker 이미지를 빌드하는 데 사용한 이름 및 버전과 동일합니다.

Dockerfile에 CMD ["/bin/bash"]가 지정되어 있으므로 컨테이너가 시작되자마자 bash 쉘 환경에 로그인하게 됩니다. docker run 명령이 성공적으로 실행되면 다음과 같습니다. :

개발 시작

이제 컨테이너가 실행되었으므로 코드 작성을 시작하기 전에 먼저 다음 명령문을 사용하여 컨테이너에서 Redis 서버를 시작합니다.

service redis-server start

그런 다음 프로젝트 종속성을 설치하면 Nodemon이 프로젝트 파일의 변경 사항을 관찰하고 적절한 경우 서버를 다시 시작합니다.

npm install
npm install -g nodemon

마지막으로 다음 명령을 사용하여 서버를 시작합니다.

nodemon server.js

이제 브라우저에서 http://localhost:3000으로 이동하면 다음과 같은 내용이 표시됩니다.

개발 프로세스를 시뮬레이션하기 위해 Server.js에 또 다른 엔드포인트를 추가해 보겠습니다.

app.get('/hello/:name', function(req, res) {
 res.json({
  hello: req.params.name
 });
});

nodemon이 변경 사항을 감지하고 서버를 다시 시작한 것을 볼 수 있습니다.

이제 브라우저에서 http://localhost:3000/hello/world로 이동하면 다음 응답을 볼 수 있습니다.

제작환경

컨테이너의 현재 상태는 제품으로 출시되지 않습니다. 예를 들어 컨테이너를 다시 시작하면 Redis의 데이터가 더 이상 지속되지 않습니다. 컨테이너를 파괴하고 새 컨테이너를 시작하면 이런 일이 발생합니다. 이는 분명히 원하는 바가 아닙니다. 이 문제에 대해서는 상품화 콘텐츠 2부에서 다루겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.