você está aqui: Home  → Arquivo de Mensagens

Git2Docker - Gerenciando Dockers utilizando apenas um cliente GIT

Colaboração: Rodrigo Alvares

Data de Publicação: 23 de abril de 2015

Projeto: https://github.com/cooltrick/git2docker.io

Git2Docker Servidor

Procedimento realizando utilizando Opensuse 13.2, lembrando que os binarios funcionam em qualquer distribuição linux 64bits.

Instalando os componentes:

  zypper install docker 
  systemctl enable docker 
  systemctl start docker 
  systemctl enable sshd 
  systemctl start sshd 

Obs: Desabilite o Firewall.

Procedimento de instalação do Git2Docker

  curl https://raw.githubusercontent.com/cooltrick/git2docker.io/master/install.sh | sh 

Criando um usuário para utilizar o git2docker.io

  useradd -m user 
  gpasswd -a user docker 
  passwd user 

O servidor git2docker utiliza chaves para autenticação sem senha.

Usando o git2docker Maquina Cliente:

Gerando e Adicionando a chave de autenticação:

mkdir ~/.git2docker ssh-keygen -t dsa cp -rf ~/.ssh/id_rsa* ~/.git2docker/ cat ~/.git2docker/id_rsa.pub | ssh user@192.168.100.56 git2docker

Baixando e instalando o CLI.

  curl https://github.com/cooltrick/git2docker.io/raw/master/git2docker-client/linux/git2docker 
  chmod +x git2docker 
  
  cat >  ~/.git2docker/git2docker.conf << EOF 
  user=user 
  host=192.168.100.56 
  EOF 

Exemplo de Deploy e Administração:

Fazendo um deploy simples utilizando o mode de detecção de código Heroku style.

  git clone https://github.com/heroku/node-js-sample 
  cd node-js-sample 
  git init 

Crie um arquivo chamado git2docker.conf:

O arquivo git2docker.conf é o arquivo que contem as opções de deploy da aplicação irei explicar mais detalhadamente.

  echo state=build > git2docker.conf 
  
  git add --all 
  git commit -m "build" 
  git remote add git2docker user@192.168.100.56:node-js-sample 
  
  git push git2docker master 
  
  @linux:/tmp/node-js-sample> git push git2docker master 
  Counting objects: 391, done. 
  Delta compression using up to 4 threads. 
  Compressing objects: 100% (316/316), done. 
  Writing objects: 100% (391/391), 214.55 KiB | 0 bytes/s, done. 
  Total 391 (delta 46), reused 387 (delta 45) 
  remote: =======> Working - node-js-sample 
  remote:  
  -----> Using u1000 to run an application 
  -----> Node.js app detected 
         
  -----> Reading application state 
        package.json... 
        build directory... 
        cache directory... 
        environment variables... 
         
        Node engine:         0.12.x 
        Npm engine:          unspecified 
        Start mechanism:     npm start 
        node_modules source: npm-shrinkwrap.json 
        node_modules cached: false 
         
        NPM_CONFIG_PRODUCTION=true 
        NODE_MODULES_CACHE=true 
         
  -----> Installing binaries 
        Resolving node version 0.12.x via semver.io... 
        Downloading and installing node 0.12.2... 
        Using default npm version: 2.7.4 
         
  -----> Building dependencies 
        Installing node modules 
        express@4.12.3 node_modules/express 
       ---> merge-descriptors@1.0.0 
       ---> utils-merge@1.0.0 
       ---> cookie-signature@1.0.6 
       ---> methods@1.1.1 
       ---> fresh@0.2.4 
       ---> escape-html@1.0.1 
       ---> cookie@0.1.2 
       ---> range-parser@1.0.2 
       ---> content-type@1.0.1 
       ---> finalhandler@0.3.4 
       ---> vary@1.0.0 
       ---> parseurl@1.3.0 
       ---> serve-static@1.9.2 
       ---> content-disposition@0.5.0 
       ---> path-to-regexp@0.1.3 
       ---> depd@1.0.1 
       ---> qs@2.4.1 
       ---> etag@1.5.1 (crc@3.2.1) 
       ---> on-finished@2.2.0 (ee-first@1.1.0) 
       ---> debug@2.1.3 (ms@0.7.0) 
       ---> proxy-addr@1.0.7 (forwarded@0.1.0, ipaddr.js@0.1.9) 
       ---> send@0.12.2 (destroy@1.0.3, ms@0.7.0, mime@1.3.4) 
       ---> accepts@1.2.5 (negotiator@0.5.1, mime-types@2.0.10) 
       ---> type-is@1.6.1 (media-typer@0.3.0, mime-types@2.0.10) 
         
  -----> Checking startup method 
        No Procfile; Adding 'web: npm start' to new Procfile 
         
  -----> Finalizing build 
        Creating runtime environment 
        Exporting binary paths 
        Cleaning npm artifacts 
        Cleaning previous cache 
        Caching results for future builds 
         
  -----> Build succeeded! 
         
        node-js-sample@0.2.0 /tmp/build 
        &#9492;&#9472;&#9472; express@4.12.3 
         
  -----> Discovering process types 
        Procfile declares types -> web 
  remote: node-js-sample Started 
  remote: 49153  
  To demo@localhost:node-js-sample 
  * [new branch]      master -> master 
  
  @linux:/tmp/node-js-sample> curl http://192.168.100.56:49153/ 
  Hello World! 

Caso queira fazer um deploy de um Dockerfile, siga o exemplo:

  mkdir apache-demo 
  cd apache-demo 
  
  echo "FROM httpd:2.4" > Dockerfile 
  echo "EXPOSE 80" >> Dockerfile 

Crie um arquivo chamado git2docker.conf:

O arquivo git2docker.conf e o arquivo que contem as opções de deploy da aplicação irei explicar mais detalhadamente.

  echo state=dockerfile > git2docker.conf 
  
  git add --all 
  git commit -m "build" 
  git remote add git2docker user@192.168.100.56:apache-demo 
  
  git push git2docker master 
  
  @linux:/tmp/apache-demo> git push git2docker master 
  Counting objects: 4, done. 
  Delta compression using up to 4 threads. 
  Compressing objects: 100% (2/2), done. 
  Writing objects: 100% (4/4), 303 bytes | 0 bytes/s, done. 
  Total 4 (delta 0), reused 0 (delta 0) 
  remote: =======> Working - apache-demo 
  remote:  
  remote: Sending build context to Docker daemon 3.072 kB 
  remote: Sending build context to Docker daemon  
  remote: Step 0 : FROM httpd:2.4 
  remote:  ---> 4ea677a2d898 
  remote: Step 1 : EXPOSE 80 
  remote:  ---> Running in 2fe3a7300cdf 
  remote:  ---> 11d40bb1d4fe 
  remote: Removing intermediate container 2fe3a7300cdf 
  remote: Successfully built 11d40bb1d4fe 
  remote: apache-demo Started 
  remote: 49154  
  To demo@localhost:apache-demo 
  * [new branch]      master -> master 
  
  
  @linux:/tmp/node-js-sample> curl http://192.168.100.56:49154/ 
  < html>< body>< h1>It works!</h1></body></html> 

Para parar ou remover a aplicação basta mudar a opção state no arquivo git2docker.conf

Removendo a aplicação:

  echo state=remove > git2docker.conf 

Parar a aplicação:

  echo state=stop > git2docker.conf 

Iniciar a aplicação echo state=start > git2docker.conf

Depois de editar o arquivo basta executar as operações básicas GIT

  git add --all 
  git commit -m "build" 
  git push git2docker master 

Ou utilizar o client como nos exemplos abaixo:

  ./git2docker -ps 
  | apache-demo                    is Up | 
  
  ./git2docker -stop --name=apache-demo 
  | apache-demo                   Stoped | 
  
  ./git2docker -start --name=apache-demo 
  | apache-demo                  Started | 
  
  ./git2docker -logs --name=apache-demo 
  172.17.0.3 - - [16/Apr/2015:15:08:45 +0000] "GET / HTTP/1.1" 200 22698 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:08:46 +0000] "GET / HTTP/1.1" 200 22700 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:13:31 +0000] "GET / HTTP/1.1" 200 22702 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:13:32 +0000] "GET / HTTP/1.1" 200 22698 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:13:32 +0000] "GET / HTTP/1.1" 200 22702 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:13:32 +0000] "GET / HTTP/1.1" 200 22698 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  172.17.0.3 - - [16/Apr/2015:15:13:33 +0000] "GET / HTTP/1.1" 200 22697 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" 
  
  ./git2docker -remove --name=apache-demo 
  Please type yes or no and then press enter: yes 
  | apache-demo                  Deleted | 

Opções do git2docker.conf

git2docker.conf :

state options:

build Detecta e compila o codigo enviado via GIT.
build:logs Detecta e compila o codigo enviado via GIT e mostra os logs
delete or remove Remove a aplicacao
stop Para a aplicação
start Inicia a aplicação
start:logs Inicia a aplicação mostrando os logs
logs Mostra os logs da aplicacao
dockerfile or Dockerfile Força o git2docker a utilizar o dockerfile enviado via GIT

ex: state=build

domain Option:

ex: domain=app.linux.site

pre-exec Option:

Opção utilizada quando a preciso executar um comando antes de inciar a aplicação!

ex: pre-exec=bundle exec rake db:create db:migrate db:seed

git Option:

Caso tenha sua aplicacao armazenada em um git externo basta utilizar a flag git como no exemplo abiaxo:

ex: git=https://github.com/heroku/node-js-sample

Exemplo : git2docker.conf

  state=build 
  domain=app.domain.lnx 
  pre-exec=bundle exec rake db:create db:migrate db:seed 

Utilizando um nginx proxy para efetuar o deploy da aplicação utilizando a opção domain.

Configure seu servidor DNS ou /etc/hosts para prover a resolucao de nomes dos dominios utilizados, no nosso exemplo irei utilizar o dominio .git2docker.

No arquivo git2docker.conf e possível setar qual dominio a aplicacao ira utilizar, caso essa opção não seja informada a aplicacao sera disponibilizada com o nome similar a esse: appname.username

Nginx proxy:

Criando um servico systemd:

  cd /etc/systemd/system 
  vi nginx-proxy.service 
  
  [Unit] 
  Description=nginx-proxy 
  After=docker.service 
  Requires=docker.service 
  
  [Service] 
  TimeoutStartSec=0 
  ExecStartPre=-/usr/bin/docker kill nginx-proxy 
  ExecStartPre=-/usr/bin/docker rm nginx-proxy  
  ExecStartPre=/usr/bin/docker pull jwilder/nginx-proxy   
  ExecStart=/usr/bin/docker run  restart=always -d --name=nginx-proxy -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy 
  
  [Install] 
  WantedBy=multi-user.target 

Habilitando e iniciando o serviço:

  systemctl enable /etc/systemd/system/nginx-proxy.service 
  systemctl start nginx-proxy.service 

Faça algum deploy editando o arquivo git2docker.conf de cada aplicacao e adicione a opção domain.

Ex:

  state=build 
  domain=apache-demo.git2docker 

Caso não tenha um servidor DNS configurado, você pode testar editando o arquivo /etc/hosts.

Ex:

  192.168.100.56	apache-demo.git2docker 
  192.168.100.56	nodejs.git2docker 
  . 
  . 
  .


Veja a relação completa dos artigos de Rodrigo Alvares