domingo, 22 de novembro de 2015

Docker compose - sua infra em um build

Hoje, resolvi escrever um pouco de como montar uma infraestrutura pra ambiente de desenvolvimento com docker. Por muito tempo, venho criado meu ambiente de desenvolvimento usando o vagrant.

O vagrant é uma ferramenta perfeita para quem precisa constantemente criar diversos ambientes de desenvolvimento, porém, pode se tornar complicado o gerencimento, manter atualizado e em alguns casos, pode até se tornar uma porrada de consumo de sua máquina local. Bom, tendo esse problema em mente, existe o "docker", uma camada de isolamento de kernel  (Após uma breve troca de ideias com o Marcus, a melhor definição para o docker, seria: o kernel é compartilhado entre os containeres e isola as libs utilizado para cada app.  (lembre-se bem parecido com virtualização mas NÃO é virtualização).

Junto ao docker engine, tem o "docker-compose", ferramenta que facilita na criação de suites de ambientes, criando links entre as apps docker. Um dos problemas que me atentei, por ser programador python, foi de nas alterações dos arquivos, o uso de docker (com uso de builds, imagens e container como se fosse um deploy), em que essas alterações não se refletiam imediatamente no container, para isso, usei um parametro 'extends' do volume onde minha app está. Minha estrutura ficou da seguinte forma:

Criei três arquivos:

Dockerfile - Contendo o build e instalação das dependências de meu projeto django  
docker-compose.yml - Criando uma imagem de um banco postgres (totalmente volátil - vale ressaltar -)
common-services.yml - Arquivo que irá extender o volume para que as alterações feitas em seu ambiente sejam imediatamente refletidas em seu container Abaixo, exemplo dos arquivos:
#Dockerfile
       

FROM ubuntu:14.04
MAINTAINER Rondineli Gomes 

RUN locale-gen --no-purge pt_BR
RUN locale-gen --no-purge pt_BR.UTF-8
RUN sudo rm -f /etc/apt/sources.list.d/proposed.list
RUN apt-get update -q && apt-get upgrade -yq
RUN apt-get install -yq --fix-missing build-essential python-dev python-pip ruby git wget locales vim mercurial libmysqlclient-dev libpq-dev
RUN apt-get clean
RUN gem install --no-ri --no-rdoc foreman

ADD . /app/

WORKDIR /app

RUN pip install --process-dependency-links --allow-all-external -r /app/requirements.txt
RUN pip install newrelic
ADD newrelic.ini /app/newrelic.ini

ADD . /app
ADD Procfile /app/Procfile

ENV NEW_RELIC_CONFIG_FILE newrelic.ini
ENV PORT 8000
ENV PROCESS_TYPE web

EXPOSE 8000

USER nobody

       
 


Após a criação do arquivo, builde sua imagem, com os seguintes comandos:
       
rondineli@rondineli-pc:/opt/docker_build_project$ sudo docker build -t containers/docker_build_project .
       
 


Feito isso, será rodado todos os inclusos no arquivo Dockerfile. Depois disso, irei ilustrar um exemplo de uma app, subindo uma aplicação django com postgres, para isso, edite o arquivo docker-compose.yml.
       
db:
  image: postgres
  ports:
    - 5432:5432
web:
  build: .
  command: newrelic-admin run-program foreman start -p 8000 web
  volumes:
    - '.:/app'
  ports:
    - "8000:8000"
  extends:
    file: common-services.yml
    service: webapp

  links:
    - db
       
 

Crie o arquivo:  common-services.yml.
       
webapp:
  volumes:
    - "/data"
       
 



Execute, então os seguinte comando:
       
rondineli@rondineli-pc:/opt/docker_build_project$ sudo docker-compose build

       
 



Obs: Caso retorne erro: docker-compose: command not found, rode: $curl -L https://github.com/docker/compose/releases/download/1.5.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose depois chmod +x /usr/local/bin/docker-compose então, volte a executar o comando acima.

Em seu projeto (no meu caso, utilizei para exemplo o framework django - python - ), inclui os seguintes acessos no meu settings.py do projeto (para que meu projeto, pudesse enxergar a base que criamos).
       
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
        'PASSWORD': 'rpostgres'
    }
}
       
 


Após rodar o build, execute o comando up para iniciar os containers com os links, para isso, será executado os comandos apresentados no arquivo "docker-compose.yml".
rondineli@rondineli-pc:/opt/docker_build_project$ docker-compose up -d
       
 


Após estes comandos, poderá verificar que dois containers estarão up, com o comando: docker ps -a, que terá uma saida exatamente igual á:
root@rondineli:/opt/docker_build_project# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
312d6ea07c7b        docker_build_project_web        "newrelic-admin run-   8 hours ago         Up 8 hours          0.0.0.0:8000->8000/tcp   f2badmin_web_1     
96b8dc2b8a98        postgres            "/docker-entrypoint.   8 hours ago         Up 8 hours          0.0.0.0:5432->5432/tcp   docker_build_project_db_1  

 Para executar o migration ou demais comando nos container, utilize o seguinte comando:


root@rondineli:/opt/docker_build_project#docker-compose run web python manage.py migrate

Para acessar o bash do container, utilize o comando abaixo:


root@rondineli:/opt/docker_build_project#docker-compose run web /bash 


É isso, espero que isso, possa ajudar alguém :D

Nenhum comentário:

Postar um comentário