Skip to content

Instantly share code, notes, and snippets.

@tsfreitas
Last active February 28, 2020 16:26
Show Gist options
  • Save tsfreitas/4ae2eb5eb721f27b4fd0 to your computer and use it in GitHub Desktop.
Save tsfreitas/4ae2eb5eb721f27b4fd0 to your computer and use it in GitHub Desktop.
Passo a passo de criação de ambiente docker

Guia de estudo de implantação do docker para ambiente de homologação

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

Tecnologias

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

Preparação da infra

Instalando máquinas 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

Configuração do domínio registry nas máquinas docker

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

Instalação do registry

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

Instalação shipyard

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

Configurando cluster swarm

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

Ambiente final

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

Teste de registry e criação de imagem no swarm

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

Nodes de aplicativos

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 

Aplicativo de teste

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.

Configuração de plugin

<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

Com a imagem criada é possível rodar o container

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

Subindo a imagem para o registro

mvn clean package docker:build docker:push

Fim

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment