Quantas vezes você precisou configurar ambientes de servidor para implantar seu aplicativo (por exemplo, um site)? Certamente mais frequentemente do que eu gostaria.
Na melhor das hipóteses, você tinha um script que fazia tudo isso automaticamente. Na pior das hipóteses, poderia ser assim:
- instalar o banco de dados D versão xxx
- instale o servidor da web N versão xx, etc.
O gerenciamento ambiental configurado dessa maneira torna-se muito intensivo em recursos ao longo do tempo. Qualquer alteração menor na configuração significa pelo menos:
- que todo desenvolvedor deve estar ciente dessas mudanças
- todas essas alterações devem ser adicionadas com segurança ao ambiente de produção
É difícil rastrear essas alterações e gerenciá-las sem ferramentas especiais. De qualquer forma, há problemas com a configuração das dependências do ambiente. Quanto mais avanços no desenvolvimento, mais difícil se torna encontrar e corrigir esses problemas.
Acima, descrevi o que é chamado de bloqueio de fornecedor. Para o desenvolvimento de aplicativos, em particular do tipo servidor, esse fenômeno se torna um grande problema. Neste artigo, consideraremos uma das soluções possíveis -
Docker . Você aprenderá como criar, implantar e executar um aplicativo baseado nele.
/ Isenção de responsabilidade: / Esta não é uma revisão do Docker. No final deste artigo, há uma lista de literatura útil que descreve como trabalhar melhor com o Docker. Este é o primeiro ponto de entrada para desenvolvedores que planejam implantar aplicativos node.js. usando contêineres do Docker.
Durante o desenvolvimento de
um dos meus projetos , me deparei com uma falta de artigos detalhados, o que deu origem a um número considerável de bicicletas. Este post está um pouco atrasado, tentando corrigir a falta de informações sobre o tópico.
O que é e com o que ele come?
Em palavras simples, o Docker é uma abstração de contêineres LXC. Isso significa que os processos iniciados com o Docker verão apenas eles e seus descendentes. Esses processos são chamados de contêineres Docker.
Para poder criar algum tipo de abstração com base nesses contêineres, existe uma imagem no Docker (/ docker image /). Com base na imagem do Docker, você pode configurar e criar contêineres.
Existem milhares de imagens prontas do Docker com bancos de dados pré-instalados, servidores da Web e outros elementos importantes. Outra vantagem do Docker é que é uma ferramenta muito econômica para o consumo de memória, pois utiliza apenas os recursos necessários.
Aproxime-se
Nós não iremos insistir na
instalação por muito tempo. O processo nos últimos lançamentos foi simplificado para alguns cliques / equipes.
Neste artigo, analisaremos a implantação de um aplicativo Docker usando o exemplo de um aplicativo Node.js. do lado do servidor. Aqui está o código fonte primitivo:
// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); });
Temos pelo menos duas maneiras de empacotar um aplicativo em um contêiner do Docker:
- crie e execute um contêiner a partir de uma imagem existente usando a ferramenta de interface da linha de comandos;
- crie sua própria imagem com base na amostra final.
O segundo método é usado com mais frequência.
Para começar, faça o download da imagem oficial do node.js.
docker pull node
O comando pull do docker baixa uma imagem do Docker. Depois disso, você pode executar o comando docker run. Isso criará e executará o contêiner com base na imagem baixada.
docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js
Este comando inicia o arquivo index.js, mapeia 3000 portas para 80 e exibe o ID do contêiner criado. Já está melhor! Mas em uma CLI você não irá longe. Vamos criar um Dockerfile para o nosso servidor.
FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"]
Este Dockerfile descreve a imagem da qual a versão atual é herdada, bem como o diretório no qual os comandos do contêiner e o comando copy file do diretório no qual o conjunto de imagens é iniciado serão iniciados. A última linha indica qual comando será executado no contêiner criado.
Em seguida, precisamos criar uma imagem deste Dockerfile que iremos implantar:
docker build -t username / helloworld-with-docker: 0.1.0 . Este comando cria uma nova imagem, marca-a com
nome de usuário / helloworld-with-docker e cria uma tag 0.1.0.
Nosso contêiner está pronto. Podemos executá-lo com o comando docker run. Assim, resolvemos o problema de bloqueio do fornecedor. O lançamento do aplicativo não depende mais do ambiente. O código é entregue junto com a imagem do Docker. Esses dois critérios nos permitem implantar o aplicativo em qualquer lugar onde possamos executar o Docker.
Implantar
Os primeiros 99% não são tão terríveis quanto os 99% restantes.
Depois de concluir todas as instruções acima, o próprio processo de implantação se torna uma questão de tecnologia e seu ambiente de desenvolvimento. Consideraremos duas opções para implantar o Docker:
- implantação manual da imagem do Docker;
- implantação usando o Travis-CI.
Em cada caso, consideraremos entregar a imagem em um ambiente independente, por exemplo, o servidor intermediário do seu produto.
Implantação manual
Essa opção é boa se você não tiver nenhum ambiente de integração contínua. Primeiro, você precisa carregar a imagem do Docker em um local acessível pelo servidor de temporariedade. No nosso caso, será um DockerHub. Para cada usuário, ele fornece gratuitamente um repositório de imagens privadas e um número ilimitado de repositórios públicos.
Faça login para acessar nosso DockerHub:
docker login -e username@gmail.com -u username -p userpass
Carregamos nossa imagem lá:
docker push username / helloworld-with-docker: 0.1.0.Em seguida, vá para o servidor intermediário (lembro que o Docker já deve estar pré-instalado nele).
Para implantar nosso aplicativo no servidor, precisamos executar apenas um comando:
docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0.
E isso é tudo! Verifique o registro local de imagens. Se você não encontrar o resultado desejado, digite o
nome de usuário / helloworld-with-docker para verificar o registro do DockerHub. Uma imagem com esse nome pode ser encontrada no registro, pois já a carregamos lá. O Docker baixa, cria um contêiner e lança seu aplicativo nele.
Agora, sempre que precisar atualizar a versão do seu aplicativo, você pode enviar por push uma nova tag e simplesmente reiniciar o contêiner no servidor a cada vez.
PS Este método não é recomendado se for possível usar o Travis-CI.
Implantar com Travis-CI
Primeiro, adicione os dados do DockerHub ao Travis-CI. Eles serão armazenados em variáveis de ambiente.
travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password
Em seguida, adicionamos as chaves recebidas ao arquivo .travis.yml. Também adicionaremos um comentário a cada tecla para distinguir entre elas no futuro.
env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS
Em seguida, precisamos fazer login e baixar a imagem:
after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis
Além disso, a entrega de imagens pode ser iniciada no Travis-CI de várias maneiras:
- manualmente;
- via conexão ssh;
- serviços de implantação online (Deploy Bot, deployhq);
- CLI da AWS;
- Kubernates;
- Ferramentas para implantação do Docker.
Sumário
Neste artigo, examinamos a preparação e a implantação do Docker usando um servidor node.js simples como um exemplo de duas maneiras: automática e automatizada usando o Travis-CI. Espero que este artigo tenha beneficiado você.