Criar um ambiente de homologação compartilhado no qual os devs podem criar instâncias de seus ambientes, sem a necessidade de pedidos de servidores para a infra.
Criarei 4 máquinas docker. Default: guardará os containers de infraestrutura como o registry, shipyard, swarm Node1 e Node2: Máquinas que guardarão os containers de aplicações local: emulando meu desenvolvimento local, criarei containers aqui usando o Dockerfile e subirei para registro.
A infraestrutura deverá deixar simples a criação, inicialização e destruição de containers. Deve gerenciar o tempo de vida dos containers e rodar rotinas de limpeza e manutenção do cluster
- Configurar docker-machines
- Configurar registry
- Configurar shipyard
- Configurar swarm cluster
- Criar uma app e criar um container com Dockerfile
- Subir uma app no ambiente de homolog com o shipyard
- Validar projetos PaaS para docker
- Estudar sobre Flyn vs Deis
Docker registry:
- Repositório de armazenamento de imagens docker
Docker swarm:
- Gerenciador de cluster docker (gerencia várias maquinas docker para se tornar um cluster)
Shipyard
- UI para controle do cluster docker
O docker registry precisa de um certificado https, porém para o teste podemos desligar essa validação. Para isso a máquina docker deve ser criada com uma configuração especial
docker-machine create --driver virtualbox --engine-insecure-registry docker-registry.com:5000 default
docker-machine create --driver virtualbox --engine-insecure-registry docker-registry.com:5000 node1
docker-machine create --driver virtualbox --engine-insecure-registry docker-registry.com:5000 node2
docker-machine create --driver virtualbox --engine-insecure-registry docker-registry.com:5000 local
o push de imagens para o registro dever ser feito com o padrão docker push docker-registry:500/, mas para que a máquina docker reconheça esse domínio é necessário adicioná-lo no /etc/hosts dela
docker-machine ssh local sudo echo "<IP da máquina default> docker-registry.com" >> /etc/hosts
Dentro da máquina docker 'default' configurar o registry. Como pretendo medir o tamanho do espaço gasto por imagens das apps criei um volume apontando para meu diretorio /workspace_docker/registry
docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/registry2:/var/lib/registry registry:2
Tive que instalar o registry 1 que está sendo deprecado
docker run -d -p 5000:5000 -v `pwd`/registry:/tmp/registry-dev --name registry registry
Dentro da máquina 'default' Instalar conforme essas instruções Lembrando que o ip do pedido é o ip da máquina docker 'default'
Durante a instalação do shipyard-controller um novo link deve ser feito. Com o container do registry Então adicione ao comando run o parâmetro '--link registry:docker-registry'
O projeto shipyard ainda não utiliza o registry 2 ... isso pode ser um problema
Preciso instalar os agentes do swarm em cada máquina docker que pertencerá ao cluster. São 3 containers no total em cada máquina.
Ao final da instalação vou parar o container shipyard-swarm-agent dentro da máquina 'default'pois não quero que seja feito deploys de aplicação nessa máquina
eval $(docker-machine env node1)
docker run -ti -d -p 2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy:latest
docker run -ti -d --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:3375 etcd://$(docker-machine ip default):4001
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --advertise=$(docker-machine ip $(docker-machine active)):2375 etcd://$(docker-machine ip default):4001
eval $(docker-machine env node2)
docker run -ti -d -p 2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy:latest
docker run -ti -d --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:3375 etcd://$(docker-machine ip default):4001
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --advertise=$(docker-machine ip $(docker-machine active)):2375 etcd://$(docker-machine ip default):4001
eval $(docker-machine env default)
docker stop shipyard-swarm-agent
Ao final, criei dois containers de registro, mantive a versão 2 para testes com outros gerenciadores. os outros containers são necessários para manter o shipyard funcionando. Ao final dos testes pretendo desligar o swarm-agent da máquina 'default' para gerenciarmos apenas as máquinas de aplicação
eval $(docker-machine env default); docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d19c835c6434 registry:2 "/bin/registry /etc/d" 17 minutes ago Up 17 minutes 0.0.0.0:5001->5000/tcp registry2
e99922bde6f0 registry "docker-registry" 25 minutes ago Up 25 minutes 0.0.0.0:5000->5000/tcp registry
79a0ad2c2fb9 swarm:latest "/swarm manage --host" About an hour ago Up About an hour 2375/tcp shipyard-swarm-manager
25869fbe0513 shipyard/shipyard:latest "/bin/controller serv" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp shipyard-controller
c8b79a2891be shipyard/docker-proxy:latest "/usr/local/bin/run" 9 hours ago Up 9 hours 0.0.0.0:2375->2375/tcp shipyard-proxy
96e9b3f8e772 microbox/etcd "/bin/etcd -name disc" 9 hours ago Up 9 hours 0.0.0.0:4001->4001/tcp, 0.0.0.0:7001->7001/tcp shipyard-discovery
534e111abbec rethinkdb "rethinkdb --bind all" 9 hours ago Up 9 hours 8080/tcp, 28015/tcp, 29015/tcp shipyard-rethinkdb
eval $(docker-machine env node1); docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb735c2bf572 shipyard/docker-proxy:latest "/usr/local/bin/run" About an hour ago Up About an hour 0.0.0.0:2375->2375/tcp shipyard-proxy
94789e84bce6 swarm:latest "/swarm join --advert" About an hour ago Up About an hour 2375/tcp shipyard-swarm-agent
d9bae40e80e3 swarm:latest "/swarm manage --host" About an hour ago Up About an hour 2375/tcp shipyard-swarm-manager
eval $(docker-machine env node2); docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80096b4e4632 swarm:latest "/swarm join --advert" 23 minutes ago Up 23 minutes 2375/tcp shipyard-swarm-agent
b0d0750fc255 swarm:latest "/swarm manage --host" 24 minutes ago Up 24 minutes 2375/tcp shipyard-swarm-manager
e61679116fad shipyard/docker-proxy:latest "/usr/local/bin/run" 24 minutes ago Up 24 minutes 0.0.0.0:2375->2375/tcp shipyard-proxy
Mudei para a máquina docker 'local'e baixei uma imagem do alpine, criei uma nova tag com meu nome e a inseri no registry
eval $(docker-machine local)
docker pull alpine
docker tag alpine docker-registry:5000/thiago
docker push docker-registry:5000/thiago
Com a infraestrutura pronta, mudei para a máquina local para continuar os teste
eval $(docker-machine env local)
docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.100:2376 v1.10.2
local * virtualbox Running tcp://192.168.99.103:2376 v1.10.2
node1 - virtualbox Running tcp://192.168.99.101:2376 v1.10.2
node2 - virtualbox Running tcp://192.168.99.102:2376 v1.10.2
Criei um app de teste que mostra a hora de um país. (https://github.com/tsfreitas/time-api)
Esse aplicativo cria uma imagem docker utilizando um plugin do maven do spotify.
<build>
<finalName>timeApi</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>docker-registry.com:5000/${project.artifactId}</imageName>
<dockerDirectory>docker</dockerDirectory>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
para a criação da imagem docker usamos esses goals no maven
mvn clean package docker:build
docker run -d -P time-api
o argumento -P atribui a porta 8080 da imagem para uma porta randomica no servidor. Caso queira uma porta específica
docker run -p 9091:8080 time-api
mvn clean package docker:build docker:push
Fim