이 노드 응용 프로그램에 대해
이 응용 프로그램에는 package.json, server.js 및 .gitignore 파일이 포함되어 있으며 쉽게 수행 할 수있을만큼 간단합니다.
.gitignore
node_modules/*
package.json
{ "name": "docker-dev", "버전": "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 = requess ( 'express'), app = express (), redis = require ( 'redis'), redisstore = require ( 'connect-redis') (express), require = require ( 'http'). createServer (app); aptuc.configure (function () {app.use (express.cookieparser ( 'keyboard'); Appl. redisstore ({host : process.env.redis_host || 'localhost', prace : process : env.redis_port || 6379, db : process.env.redis_db || 0}), 쿠키 : {False, Maxage : 30 * 24 60 * 60 * 1000}); app.get (ret (ret));}; res.json ({status : "ok"});}); var port = process.env.http_port || 3000; server.listen (port); console.log ( '포트 청취' + 포트);Server.js는 모든 종속성을 끌어 내고 특정 응용 프로그램을 시작합니다. 이 특정 응용 프로그램은 세션 정보를 Redis에 저장하도록 설정되었으며 JSON 상태 메시지에 응답 할 요청 끝점을 노출시킵니다. 이것은 모두 매우 표준입니다.
주목할만한 점은 Redis에 대한 연결 정보가 환경 변수를 사용하여 다시 작성할 수 있다는 것입니다. 이는 나중에 개발 환경에서 생산 환경으로 마이그레이션하는 데 역할을합니다.
도커 파일
개발 요구를 위해 동일한 컨테이너에서 Redis 및 Node가 실행됩니다. 이를 위해 Dockerfile을 사용 하여이 컨테이너를 구성합니다.
dockerfile
dockerfile / ubuntumaintainer abhinav ajgaonkar <[email protected]># redisrun / apt -qq 설치 python redis -server# 설치 noderun / cd / opt && / wget. http://nodejs.org/dist/v0.10.10.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 &&/usr/bin/bin/bin/bin/bin/bin/bin &/cd. -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.10.28-linux-x64.tar.gz# 작업 directoryworkdir /srccmd [ " /bin /bash"]
하나씩 이해합시다.
Dockerfile/Ubuntu에서
이번에 Docker는 Docker Inc.에서 제공 한 Dockerfile/Ubuntu 이미지를 빌드 할 벤치 마크 이미지로 사용하라는 지시를받습니다.
달리다 /
apt -get -y -qq 설치 Python redis -server
벤치 마크 이미지에는 전혀 포함하지 않으므로 응용 프로그램이 실행 해야하는 모든 것을 얻으려면 APT -GEG를 사용해야합니다. 이 문장은 Python 및 Redis-Server를 설치합니다. Redis 서버는 세션 정보를 저장하기 때문에 필요하며 Python의 필요성은 NPM을 통해 Redis 노드 모듈에 필요한 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.11.28-linux-x64.tar. MV 노드 -V0.10.28-LINUX-X64 노드 &/cd/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.10.28-linux-x64.tar.gz
이는 64 비트 Nodejs Binary를 다운로드하고 추출합니다.
WorkDir /SRC
이 문장은 Docker에게 컨테이너가 시작되면 CMT 속성에 지정된 물건을 실행하기 전에 CD /SRC를 한 번 수행해야한다고 말합니다.
CMD [ "/bin/bash"]
마지막 단계로, run /bin /bash.
컨테이너를 제작하고 실행하십시오
Docker 파일이 작성되었으므로 Docker 이미지를 작성하겠습니다.
Docker 빌드 -t sqldump/docker -dev : 0.1.
이미지가 만들어지면 다음 문을 사용하여 컨테이너를 실행할 수 있습니다.
Docker Run -i -t ---rm / -p 3000 : 3000 / -v`pwd` : / src / sqldump / docker -dev : 0.1
Docker Run 명령에서 무슨 일이 일어나고 있는지 살펴 보겠습니다.
-컨테이너를 대화식 모드로 시작합니다 (-D와 비교하여 별도의 모드에 비해). 이것은 대화식 세션이 끝나면 컨테이너가 종료 될 것임을 의미합니다.
-t는 pseudo-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 Shell 환경에 로그인합니다. Docker Run 명령이 성공적으로 실행되면 다음과 같습니다.
개발 시작
이제 컨테이너가 실행 중이며 코드를 작성하기 전에 표준적이고 도구가 아닌 관련 사항을 분류해야합니다. 먼저 컨테이너에서 Redis 서버를 시작하려면 다음 문을 사용해야합니다.
서비스 Redis-Server 시작
그런 다음 프로젝트 종속성과 Nodemon을 설치하십시오. Nodemon은 프로젝트 파일의 변경 사항을 관찰하고 제 시간에 서버를 다시 시작합니다.
npm installnpm 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의 데이터가 더 이상 지속되지 않습니다. 예를 들어, 컨테이너를 다시 시작하면 모든 세션 데이터가 삭제됩니다. 컨테이너를 파괴하고 새 컨테이너를 열면 같은 일이 발생합니다. 두 번째 부분의 생산물 내용 에서이 문제에 대해 이야기하겠습니다.