Executando o Docker no AWS OpsWorks
Este artigo mostrará como criar uma camada personalizada para o Docker, que permite definir com precisão o ambiente de tempo de execução e fazer o deploy do código da aplicação.
O AWS OpsWorks permite o deploy e gerenciamento de aplicações de todas as formas e tamanhos. Camadas OpsWorks possibilitam a criação de blueprints para instâncias EC2 para instalar e configurar o software que o usuário deseja. Este artigo mostrará como criar uma camada personalizada para o Docker. Para uma visão geral do Docker, acesse este link. O Docker permite definir com precisão o ambiente de tempo de execução para uma aplicação e fazer o deploy do código da aplicação e seu tempo de execução como um container do Docker. Você pode usar containers do Docker para suportar novas linguagens como Go ou para incorporar workflows de teste e desenvolvimento de forma integrada com o AWS OpsWorks.
A camada Docker usa receitas do chef para instalá-lo e fazer o deploy de containers para as instâncias EC2 em execução nessa camada. Basta fornecer um Dockerfile e o OpsWorks irá executar as receitas automaticamente para compilar e executar o container. Uma pilha pode ter várias camadas Docker e podemos fazer o deploy de vários containers Docker para cada camada. Podemos ampliar ou alterar as receitas de exemplo do chef para usar o Docker da maneira que funcione melhor para nossos usuários. Se não estiver familiarizado com as receitas do Chef, consulte o Cookbooks 101 para uma introdução a respeito.
Passo 1: criar as receitasPrimeiro crie um repositório para armazenar as receitas do Chef. O OpsWorks suporta Git e Subversion, ou você pode armazenar um pacote de arquivos no Amazon S3. A estrutura de um repositório de cookbook é descrito na documentação do OpsWorks.
A fórmula docker::install instala o software Docker necessário sobre as instâncias:
A fórmula docker::docker-deploy faz o deploy dos containers do Docker (especificado por um Dockerfile):
Em seguida, crie um repositório para armazenar seu Dockerfile. Abaixo, um Dockerfile de exemplo:
Passo 2: criar uma pilha OpsWorksAgora você está pronto para usar essas receitas com o OpsWorks. Abra o console do OpsWorks:
- Selecione Add a Stack para criar uma pilha OpsWorks;
- Dê a ela um nome e selecione Advanced;
- Defina Use custom Chef Cookbooks para Yes;
- Defina o Repository type para Git;
- Configure o Repository URL para o repositório onde você armazenou as receitas criadas na etapa anterior;
- Clique no botão Add Stack na parte inferior da página para criar a pilha.
- Selecione Add Layer;
- Escolha Custom Layer, defina o nome para “Docker”, abrevie para “docker” e clique em Add Layer;
- Clique em Recipes para editar a camada e role a página até a seção Custom Chef recipes. Você observará que há vários headings — Setup, Configure, Deploy, Undeploy e Shutdown — que correspondem a eventos do ciclo de vida do OpsWorks. O OpsWorks desencadeia esses eventos nos pontos chave do ciclo de vida da instância, que executa as fórmulas associadas;
- Entre com docker::install na setup box e clique + para adicioná-lo à lista;
- Entre com docker::docker-deploy na caixa de deploy e clique + para adicioná-lo à lista;
- Clique no botão Save na parte inferior para salvar a configuração atualizada.
A página Layer deve agora mostrar a camada Docker. No entanto, a camada apenas controla como configurar as instâncias. Agora precisamos adicionar algumas instâncias à camada. Clique em Instances no painel de navegação e, em Docker layer, clique em + Instance. Para este passo a passo, basta aceitar as configurações padrão e clicar em Add Instance para adicionar a instância à camada. Clique em start na coluna da linha Actions para iniciar a instância. O OpsWorks irá, então, iniciar uma nova instância EC2 e executar as fórmulas de Setup para configurar o Docker. O status da instância mudará para online quando estiver tudo pronto.
Passo 5: adicionar um aplicativo & deployUma vez iniciadas as instâncias:
- No painel de navegação, clique em Apps e, na página Apps, clique em Add an app;
- Na página App, forneça-lhe um nome;
- Defina o tipo de aplicativo para other;
- Especifique o tipo de repositório do aplicativo;
- Especifique o URL do repositório do aplicativo. Aqui é onde reside o seu Dockerfile e é geralmente um repositório separado do repositório cookbook especificado no passo 2.
- Defina as seguintes variáveis de ambiente:
» container_port – Defina esta variável para a porta especificada pelo parâmetro EXPOSE no Dockerfile.
» service_port – Defina esta variável para a porta que o container explorará na instância para o mundo exterior. Nota: certifique-se que seus grupos de segurança permitam tráfego de entrada para a porta especificada em service_port.
» layer – Defina esta variável para o nome abreviado da camada que deseja que o container faça o deploy (do passo 3). Isso permite ter múltiplas camadas docker com diferentes aplicativos passando por deploy, como o front-end de um app web e um back-end.» Para o nosso exemplo, defina container_port=80, service_port=80 e layer=docker. Também podemos definir variáveis de ambiente adicionais que são automaticamente passadas para o container Docker, por exemplo, um endpoint de banco de dados com o qual o aplicativo se conecta.
- Mantenha os valores padrão para as definições restantes e clique em Add App.
- Para instalar o código no servidor, é preciso fazer o deploy da aplicação. Levará algum tempo até que as instâncias passem pelo boot completo. Uma vez que surjam como “online” na visualização de instâncias, navegue até Apps e clique em deploy na coluna Actions. Se criar várias camadas docker, note que embora a implementação seja padrão a todas as instâncias na pilha, os containers só serão implementados na camada especificada na variável de ambiente layer.
- Uma vez que a implementação esteja completa, você poderá ver seu app clicando no endereço IP público do servidor. Você pode atualizar seu Dockerfile e refazer o deploy a qualquer momento.
As fórmulas escritas para este artigo passam variáveis de ambiente dentro do container Docker quando ele é iniciado. Se você precisa atualizar a configuração enquanto o aplicativo é executado, como uma senha de banco de dados, soluções como etcd podem criar atributos dinâmicos. Um servidor etcd pode ser executado em cada instância e ser populado por atributos da instância OpsWorks. Você pode atualizar atributos do OpsWorks (logo, os valores armazenados na etcd também), a qualquer momento. E esses valores ficam imediatamente disponíveis para aplicativos rodando em containers Docker. Um artigo futuro abordará como criar fórmulas para instalar o etcd e passar atributos OpsWorks, incluindo variáveis de ambiente de aplicação para os containers do Docker.
ResumoEstas instruções demonstraram como usar o OpsWorks AWS e o Docker para fazer o deploy de aplicativos, representado por Dockerfiles. Também é possível usar camadas Docker com outros recursos OpsWorks, incluindo o escalonamento de instância automática e integração com o Elastic Load Balancing e o Amazon RDS.
***
Artigo escrito por Chris Barclay.
Este artigo faz parte do AWSHUB, rede de profissionais AWS gerenciado pelo iMasters.












