você está aqui: Home  → Arquivo de Mensagens

Ebook Gratuito: Dá para fazer em Shell?, com o Prof. Julio Neves

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