Sobre este aplicativo de nó
Este aplicativo contém um package.json, server.js e um arquivo .gitignore, que são simples o suficiente para serem feitos com facilidade.
.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 exprest = requer ('express'), app = express (), redis = requer ('redis'), redisstore = requer ('connect-redis') (expresso), server = requer ('http'). createServer (app); app.configure (function () {App.use (expresso.cookeParSer ('Keyboard; Redisstore ({host: process.env.redis_host || 'localhost', porta: process.env.redis_port || 6379, db: process.env.redis_db || 0}), cookie: {expires: false, maxage: 30 * 60 * 60 * 60 * 1000}}} res.json ({status: "ok"});}); var porta = process.env.http_port || 3000; server.Listen (porta); console.log ('escuta na porta' + porta);O Server.js puxa todas as dependências e inicia um aplicativo específico. Este aplicativo específico está configurado para armazenar informações de sessão no Redis e expõe um terminal de solicitação que responderá a uma mensagem de status JSON. Tudo isso é uma coisa muito padrão.
Uma coisa a observar é que as informações de conexão do Redis podem ser reescritas usando variáveis de ambiente - isso desempenhará um papel na migração posterior do desenvolvimento do ambiente de desenvolvimento para o ambiente de produção.
Arquivo Docker
Para as necessidades de desenvolvimento, teremos o Redis e o Node no mesmo contêiner. Para fazer isso, usaremos um Dockerfile para configurar este contêiner.
Dockerfile
De Dockerfile / Ubuntumaintainer Abhinav Ajgaonkar <[email protected]># Instale Redisrun / apt -get -y -y install python redis -server# install noderun / cd / opt && / wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz &&/tar -s/opt/nó/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz# Definir o diretório de trabalho
Vamos entender um por um,
De Dockerfile/Ubuntu
Desta vez, o Docker é instruído a usar a imagem Dockerfile/Ubuntu fornecida pela Docker Inc. como a imagem de referência a ser construída.
CORRER /
Apt -get -y -qq install python redis -server
A imagem de benchmark não contém nada - então precisamos usar o APT -Get para obter tudo o que o aplicativo precisa executar. Esta frase instalará o Python e o Redis-Server. O servidor Redis é necessário porque armazenaremos as informações da sessão nele, e a necessidade do Python é que ele pode ser incorporado na extensão C exigida pelo módulo Redis Node através do NPM.
Run /cd /opt && /wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && /tar node mv-v0.10.28-linux-x64 nó &&/cd/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz
Isso downloads e extrai o binário NodeJS de 64 bits.
WorkDir /SRC
Esta frase dirá ao Docker que, uma vez iniciado o contêiner, ele deve fazer CD /SRC uma vez antes de executar as coisas especificadas pela propriedade CMT.
Cmd ["/bin/bash"]
Como um passo final, execute /bin /bash.
Construir e executar recipientes
Agora que o arquivo do Docker está escrito, vamos construir uma imagem do Docker.
Docker Build -t Sqldump/Docker -Dev: 0.1.
Depois que a imagem é construída, podemos executar um contêiner usando a seguinte declaração:
Docker Run -i -t - -rm / -p 3000: 3000 / -v `pwd`: / src / sqldump / docker -dev: 0.1
Vamos dar uma olhada no que está acontecendo no comando Docker Run.
-I Iniciar o contêiner no modo interativo (em comparação com -d está no modo separado). Isso significa que, uma vez que a sessão interativa termine, o contêiner sairá.
-t atribuirá um pseudo-tty.
-RM removerá o contêiner e seu sistema de arquivos ao sair.
-P 3000: 3000 encaminhará a porta 3000 no host para a porta 3000 no contêiner.
-v `pwd`:/src
Esta frase montará o diretório de trabalho atual para /SRC no host (por exemplo, nosso arquivo de projeto). Penduramos o diretório atual como um volume em vez de usar o comando Add no Dockerfile, para que quaisquer modificações que façam no editor de texto possam ser vistas imediatamente no contêiner.
SQLDUMP/DOCKER-DEV: 0.1 é o nome e a versão da imagem do Docker a ser executada. É o mesmo que o nome e a versão usamos para criar a imagem do Docker.
Como o Dockerfile especifica o CMD ["/bin/Bash"], assim que o contêiner for iniciado, entraremos em login em um ambiente de shell bash. Se o comando do Docker Run for executado com sucesso, parecerá o seguinte:
Iniciar o desenvolvimento
Agora, o contêiner está em execução, antes de começarmos a escrever código, precisaremos resolver algumas coisas padrão e não relacionadas ao Docker. Primeiro, precisamos usar a seguinte declaração para iniciar o servidor Redis no contêiner:
Serviço Redis-Server Start
Em seguida, instale as dependências do projeto e Nodemon. Nodemon observa alterações no arquivo do projeto e reinicia o servidor a tempo.
npm installnpm install -g nodemon
Por fim, inicie o servidor com o seguinte comando:
Nodemon Server.js
Agora, se você navegar para http: // localhost: 3000 em seu navegador, você verá algo assim:
Vamos adicionar outro terminal como o Server.js para simular o processo de desenvolvimento:
app.get ('/hello/: name', function (req, res) {res.json ({hello: req.params.name});});Você verá que o Nodemon detectou as alterações que você fez e reiniciou o servidor:
E agora, se você navegar no seu navegador para http: // localhost: 3000/hello/World, você verá a seguinte resposta:
Ambiente de produção
Os contêineres no estado atual estão longe de serem liberados como produtos. Os dados no Redis não serão mais persistentes ao reiniciar entre contêineres. Por exemplo, se você reiniciar o contêiner, todos os dados da sessão serão eliminados. O mesmo acontecerá quando você destruir o contêiner e abrir um novo contêiner, o que obviamente não é o que você deseja. Vou falar sobre esse problema no conteúdo produtor da segunda parte.