Orquestrando ambientes com
Docker e Kubernetes
Otávio Calaça Xavier
Rhuan Karlus Silva
1
- Professor Universitário na UFG e IFG.
- Mestre e Doutorando em Ciência da Computação - Inteligência Artificial.
- Mais de 15 anos de experiência em desenvolvimento de software.
- Pai de gêmeos.
- Engenheiro de Software na Mudano.
- Graduando em Engenharia da Computação pela UFG.
- Desenvolvedor de software desde 2012 especializado em Java e DevOps.
2
Docker
3
Entrega de Software (delivery)
4
Desafios na Gestão de Ambientes
● O desenvolvedor não tem acesso ao ambiente de Produção
(nem as suas configurações).
● Desenvolvedor não tem acesso a configuração do Jenkins,
não conhece os parâmetros de construção.
5
Desafios na Gestão de Ambientes
Erros não podem ser simulados por causa das configurações do
ambiente/aplicação.
○ Variáveis de ambiente
○ Fuso horário da máquina
○ Servidor de deploy (Tomcat/JBoss)
6
7
Vagrant, LXC e Docker
8
Vagrant
9
“Vagrant é uma ferramenta
para construir e gerenciar
ambientes de máquinas
virtuais em um único fluxo
de trabalho.”
https://www.vagrantup.com/intro/index.html
LXC
10
“LXC é uma interface para controle das
features do Linux kernel. Através de
uma API poderosa e ferramentas
simples, ele permite usuários Linux
gerenciarem o sistemas ou containers
de aplicações.”
https://linuxcontainers.org/lxc/introduction/
O que é um Container?
11
O que é um Container?
12
“Uma unidade padronizada
de Software.”
https://www.docker.com/resources/what-container
O que é um Container?
13
Então, o que é o Docker?
14
O que é o Docker?
15
“Docker é uma ferramenta feita para facilitar a construção,
deploy e execução de aplicações utilizando containers.”
https://opensource.com/resources/what-docker
O ciclo de vida do Container
16
Criando um Container
17
Containers não são criados, containers são a execução de uma
imagem!
Criando um Container
18
Containers não são criados, containers são a execução de uma
imagem!
O que é uma Imagem?
19
“Uma imagem Docker é um
arquivo composto por várias
camadas (layers) utilizadas
para executar instruções em
um Docker Container.”
https://searchitoperations.techtarget.com/definition/Docker-
image
Criando um Dockerfile para executar um app
● https://github.com/rhuankarlus/d
evfest_2019
● NodeJS
● MongoDB
● /Dockerfile
20
Construindo a nossa imagem
a partir do Dockerfile
docker build -t meu-app:latest .
21
Executando a nossa imagem a partir da imagem criada
- docker run -it --name=database mongo
- docker run -it --link=database -e NODE_ENV=docker -e SERVER_PORT=3000 -e
MONGO_DB_URL=mongodb://database/devfest -p 3000:3000 --name=app-local
meu-app
22
Executando a nossa imagem a partir da imagem criada
- docker run -it --name=database mongo
- docker run -it --link=database -e NODE_ENV=docker -e SERVER_PORT=3000 -e
MONGO_DB_URL=mongodb://database/devfest -p 3000:3000 --name=app-local
meu-app
- Quem tem acesso às configurações de execução é o ambiente e não a aplicação
23
Dockerhub e Registries
24
O que é um Registry?
25
Um Docker Registry é um armazenador e sistema de distribuição
para imagens Docker. A mesma imagem pode ter várias versões e
ser identificada por várias tags.
https://www.aquasec.com/wiki/display/containers/Docker+Registries+101
Subindo um Registry
docker run 
-d 
-p 5000:5000 
--restart always 
--name devfest-
reg 
registry
26
Subindo a imagem da nossa aplicação no Registry
● docker tag meu-app localhost:5000/meu-app-local
27
Subindo a imagem da nossa aplicação no Registry
● docker tag meu-app localhost:5000/meu-app-local
● docker push localhost:5000/meu-app-local
28
Subindo Baixando a imagem da nossa aplicação no Registry
● docker tag meu-app localhost:5000/meu-app-local
● docker push localhost:5000/meu-app-local
● docker rmi localhost:5000/meu-app-local
● docker pull localhost:5000/meu-app-local
29
Interface WEB para o Docker Registry
Neste momento temos várias
opções no mundo Docker. Escolhemos
o Portainer por ser uma interface
amigável e ter mais stars que seus
concorrentes no Github.
https://github.com/portainer/portainer
30
Subindo o Portainer
31
Guess what!
Subindo o Portainer
32
Guess what!
● docker volume create portainer_data
● docker run -d 
-p 9000:9000 -p 8000:8000 
--name portainer 
--restart always 
-v /var/run/docker.sock:/var/run/docker.sock 
-v portainer_data:/data 
portainer/portainer
O que é o Dockerhub
Docker Hub é um serviço disponibilizado pelo Docker para encontrar e compartilhar
imagens com seu time. Ele disponibiliza as seguintes features principais:
● Repositórios
● Times e Organizações
● Imagens oficiais
● Builds
● Webhooks
33
Subindo nossa aplicação no Dockerhub
34
Rodando nossa aplicação a partir do Dockerhub
35
docker run <namespace>/<imagem>
Rodando nossa aplicação a partir do Dockerhub
36
docker run rhuankarlus/devfest_2019
docker-compose
37
O que é o docker-compose
38
● Ferramenta para definir e rodar aplicações multi-container.
● Utiliza um arquivo YAML para configurar os serviços da aplicação.
● Com um único comando, todos os serviços/containers são inicializados.
https://docs.docker.com/compose/
Configurando nossa aplicação
para utilizar o Compose
Definiremos dois serviços: o banco de
dados e a aplicação. Depois linkamos
um ao outro e definimos as variáveis
passadas para dentro do container que
roda a aplicação.
39
Executando nossa aplicação com docker-compose
docker-compose up
40
Kubernetes
41
O que é o Kubernetes?
“Kubernetes é uma plataforma portável, extensível e open-source para
gerenciar cargas de trabalho e serviços em containers, que facilita a automação
e configuração declarativa”.
42
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
Principais Conceitos do Kubernetes
43
● Nodes
● Pods
● Controllers
○ Replica Sets
○ Deployments
● Services
● Storage
Kubernetes - Ferramentas
44
● kubectl - ferramenta de linha de comando usada como cliente de um
servidor Kubernetes.
● minikube - o servidor mais simples que você pode instalar para
aprendizado.
https://kubernetes.io/docs/setup/
Kubernetes - Nodes
45
● Node é um nó, ou seja, uma
máquina, no cluster do
Kubernetes.
● kubectl get nodes
Kubernetes - Pods
46
● Pod é a menor unidade em
um cluster Kubernetes que
você pode criar ou implantar.
● kubectl get pods
● kubectl describe pod
<pod-name>
Kubernetes - Pods
47
● O kubectl trabalha com
abordagem declarativa (arquivo
yaml) ou imperativa (através de
comandos).
● kubectl run database --
image=mongo --port=27017
Kubernetes - Service
48
● Service é uma abstração que
define um conjunto lógico de Pods
e uma política pela qual o acesso a
eles é garantido.
● kubectl get service
● kubectl describe service
<service-name>
Kubernetes - Service
49
● O kubectl trabalha com abordagem
declarativa (arquivo yaml) ou
imperativa (através de comandos).
● kubectl expose pod
devfest2019 --port=300 --
name devfest2019-service
Kubernetes - ReplicaSet
50
● ReplicaSet é um recurso
para manter um conjunto
estável de replicas de um
determinado Pod.
Kubernetes - Deployments
51
● Um Deployment provê
atualizações declarativas
para Pods e ReplicaSets.
Obrigado por ter vindo!
52
● https://mundodocker.com.br -> Tudo que você precisa para aprender Docker
● https://kubernetes.io/docs/concepts/-> Documentação oficial do Kubernetes

Orquestrando ambientes com docker e kubernetes

  • 1.
    Orquestrando ambientes com Dockere Kubernetes Otávio Calaça Xavier Rhuan Karlus Silva 1
  • 2.
    - Professor Universitáriona UFG e IFG. - Mestre e Doutorando em Ciência da Computação - Inteligência Artificial. - Mais de 15 anos de experiência em desenvolvimento de software. - Pai de gêmeos. - Engenheiro de Software na Mudano. - Graduando em Engenharia da Computação pela UFG. - Desenvolvedor de software desde 2012 especializado em Java e DevOps. 2
  • 3.
  • 4.
    Entrega de Software(delivery) 4
  • 5.
    Desafios na Gestãode Ambientes ● O desenvolvedor não tem acesso ao ambiente de Produção (nem as suas configurações). ● Desenvolvedor não tem acesso a configuração do Jenkins, não conhece os parâmetros de construção. 5
  • 6.
    Desafios na Gestãode Ambientes Erros não podem ser simulados por causa das configurações do ambiente/aplicação. ○ Variáveis de ambiente ○ Fuso horário da máquina ○ Servidor de deploy (Tomcat/JBoss) 6
  • 7.
  • 8.
  • 9.
    Vagrant 9 “Vagrant é umaferramenta para construir e gerenciar ambientes de máquinas virtuais em um único fluxo de trabalho.” https://www.vagrantup.com/intro/index.html
  • 10.
    LXC 10 “LXC é umainterface para controle das features do Linux kernel. Através de uma API poderosa e ferramentas simples, ele permite usuários Linux gerenciarem o sistemas ou containers de aplicações.” https://linuxcontainers.org/lxc/introduction/
  • 11.
    O que éum Container? 11
  • 12.
    O que éum Container? 12 “Uma unidade padronizada de Software.” https://www.docker.com/resources/what-container
  • 13.
    O que éum Container? 13
  • 14.
    Então, o queé o Docker? 14
  • 15.
    O que éo Docker? 15 “Docker é uma ferramenta feita para facilitar a construção, deploy e execução de aplicações utilizando containers.” https://opensource.com/resources/what-docker
  • 16.
    O ciclo devida do Container 16
  • 17.
    Criando um Container 17 Containersnão são criados, containers são a execução de uma imagem!
  • 18.
    Criando um Container 18 Containersnão são criados, containers são a execução de uma imagem!
  • 19.
    O que éuma Imagem? 19 “Uma imagem Docker é um arquivo composto por várias camadas (layers) utilizadas para executar instruções em um Docker Container.” https://searchitoperations.techtarget.com/definition/Docker- image
  • 20.
    Criando um Dockerfilepara executar um app ● https://github.com/rhuankarlus/d evfest_2019 ● NodeJS ● MongoDB ● /Dockerfile 20
  • 21.
    Construindo a nossaimagem a partir do Dockerfile docker build -t meu-app:latest . 21
  • 22.
    Executando a nossaimagem a partir da imagem criada - docker run -it --name=database mongo - docker run -it --link=database -e NODE_ENV=docker -e SERVER_PORT=3000 -e MONGO_DB_URL=mongodb://database/devfest -p 3000:3000 --name=app-local meu-app 22
  • 23.
    Executando a nossaimagem a partir da imagem criada - docker run -it --name=database mongo - docker run -it --link=database -e NODE_ENV=docker -e SERVER_PORT=3000 -e MONGO_DB_URL=mongodb://database/devfest -p 3000:3000 --name=app-local meu-app - Quem tem acesso às configurações de execução é o ambiente e não a aplicação 23
  • 24.
  • 25.
    O que éum Registry? 25 Um Docker Registry é um armazenador e sistema de distribuição para imagens Docker. A mesma imagem pode ter várias versões e ser identificada por várias tags. https://www.aquasec.com/wiki/display/containers/Docker+Registries+101
  • 26.
    Subindo um Registry dockerrun -d -p 5000:5000 --restart always --name devfest- reg registry 26
  • 27.
    Subindo a imagemda nossa aplicação no Registry ● docker tag meu-app localhost:5000/meu-app-local 27
  • 28.
    Subindo a imagemda nossa aplicação no Registry ● docker tag meu-app localhost:5000/meu-app-local ● docker push localhost:5000/meu-app-local 28
  • 29.
    Subindo Baixando aimagem da nossa aplicação no Registry ● docker tag meu-app localhost:5000/meu-app-local ● docker push localhost:5000/meu-app-local ● docker rmi localhost:5000/meu-app-local ● docker pull localhost:5000/meu-app-local 29
  • 30.
    Interface WEB parao Docker Registry Neste momento temos várias opções no mundo Docker. Escolhemos o Portainer por ser uma interface amigável e ter mais stars que seus concorrentes no Github. https://github.com/portainer/portainer 30
  • 31.
  • 32.
    Subindo o Portainer 32 Guesswhat! ● docker volume create portainer_data ● docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
  • 33.
    O que éo Dockerhub Docker Hub é um serviço disponibilizado pelo Docker para encontrar e compartilhar imagens com seu time. Ele disponibiliza as seguintes features principais: ● Repositórios ● Times e Organizações ● Imagens oficiais ● Builds ● Webhooks 33
  • 34.
  • 35.
    Rodando nossa aplicaçãoa partir do Dockerhub 35 docker run <namespace>/<imagem>
  • 36.
    Rodando nossa aplicaçãoa partir do Dockerhub 36 docker run rhuankarlus/devfest_2019
  • 37.
  • 38.
    O que éo docker-compose 38 ● Ferramenta para definir e rodar aplicações multi-container. ● Utiliza um arquivo YAML para configurar os serviços da aplicação. ● Com um único comando, todos os serviços/containers são inicializados. https://docs.docker.com/compose/
  • 39.
    Configurando nossa aplicação parautilizar o Compose Definiremos dois serviços: o banco de dados e a aplicação. Depois linkamos um ao outro e definimos as variáveis passadas para dentro do container que roda a aplicação. 39
  • 40.
    Executando nossa aplicaçãocom docker-compose docker-compose up 40
  • 41.
  • 42.
    O que éo Kubernetes? “Kubernetes é uma plataforma portável, extensível e open-source para gerenciar cargas de trabalho e serviços em containers, que facilita a automação e configuração declarativa”. 42 https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
  • 43.
    Principais Conceitos doKubernetes 43 ● Nodes ● Pods ● Controllers ○ Replica Sets ○ Deployments ● Services ● Storage
  • 44.
    Kubernetes - Ferramentas 44 ●kubectl - ferramenta de linha de comando usada como cliente de um servidor Kubernetes. ● minikube - o servidor mais simples que você pode instalar para aprendizado. https://kubernetes.io/docs/setup/
  • 45.
    Kubernetes - Nodes 45 ●Node é um nó, ou seja, uma máquina, no cluster do Kubernetes. ● kubectl get nodes
  • 46.
    Kubernetes - Pods 46 ●Pod é a menor unidade em um cluster Kubernetes que você pode criar ou implantar. ● kubectl get pods ● kubectl describe pod <pod-name>
  • 47.
    Kubernetes - Pods 47 ●O kubectl trabalha com abordagem declarativa (arquivo yaml) ou imperativa (através de comandos). ● kubectl run database -- image=mongo --port=27017
  • 48.
    Kubernetes - Service 48 ●Service é uma abstração que define um conjunto lógico de Pods e uma política pela qual o acesso a eles é garantido. ● kubectl get service ● kubectl describe service <service-name>
  • 49.
    Kubernetes - Service 49 ●O kubectl trabalha com abordagem declarativa (arquivo yaml) ou imperativa (através de comandos). ● kubectl expose pod devfest2019 --port=300 -- name devfest2019-service
  • 50.
    Kubernetes - ReplicaSet 50 ●ReplicaSet é um recurso para manter um conjunto estável de replicas de um determinado Pod.
  • 51.
    Kubernetes - Deployments 51 ●Um Deployment provê atualizações declarativas para Pods e ReplicaSets.
  • 52.
    Obrigado por tervindo! 52 ● https://mundodocker.com.br -> Tudo que você precisa para aprender Docker ● https://kubernetes.io/docs/concepts/-> Documentação oficial do Kubernetes