Introdução ao Docker até a criação de ambientes imutáveis com docker-compose.
---
Docker introduction until immutable environments with docker-compose. Language: PT-BR
3. Wallison Marra
- Em 2006 iniciei meu caminho pelo mundo da web.
- DevOps Engineer na Hotmart.
- Entusiasta da tecnologia.
- Games, família e uma boa cerveja.
5. Preload
Hoje vivenciamos o uso do Docker graças a 2 peças fundamentais:
- LXC (Um conjunto de ferramentas do linux)
- DotCloud (Uma empresa)
6. LXC
LinuX Container
É um conjunto de ferramentas, bibliotecas, templates e controladores de
linguagem que nos permite criar e controlar sistemas ou aplicações em container.
7. LXC
Okay, but what is container?
Linux Container é considerado algo entre o chroot e uma máquina virtual
propriamente dita, e neste meio é onde conseguimos criar "ambientes virtuais"
(containers) sem a necessidade de um novo kernel.
linuxcontainers.org/lxc
8. E a DotCloud?
DotCloud é uma empresa que possuía vários projetos open source em LXC, e o
Docker era um destes projetos.
9. DotCloud
Docker se tornou tão popular que a empresa DotCloud decidiu mudar o nome da
empresa para Docker.
10. Docker
Docker vem dominando o mercado de conteinerização desde seu surgimento, e
hoje possui várias comunidades além de vários eventos pelo mundo.
https://www.docker.com/community/events
11. Docker
- Hoje é utilizado por desenvolvedores para criação de ambiente imutáveis
evitando a frase "Na minha máquina funciona!".
- Utilizado por DevOps para gerenciamento de aplicações de ponta-a-ponta
isolando processos, adquirindo performance computacional.
22. O que foi feito?
$ docker run hello-world
- docker
- run (utilizando para criar e executar um container)
- hello-world (imagem a ser utilizada para a criação do container)
25. O que foi feito?
$ docker run -ti ubuntu bash
- docker (executável)
- run (utilizando para criar e executar um container)
- -ti (-t abre terminal no container e -i mantém o terminal interativo)
- ubuntu (imagem utilizada para criar o container)
- bash (comando a ser executado pelo container - bash mantém o terminal
aberto)
26. $ docker run -i ubuntu bash
$ docker run -t ubuntu bash
Testing...
37. O que ocorreu?
$ docker run -ti -p 8080:80 ubuntu:16.04 bash
- docker (deamon docker)
- run (utilizando para criar e executar um container)
- -ti (-t abre terminal no container e -i mantém o terminal interativo)
- -p 8080:80 (Expõe porta do container baseado em uma porta do host)
- 8080 (porta do host)
- 80 (porta do container)
- ubuntu:16.04 (Imagem utilizada para criar o container)
- bash (comando a ser executado quando o container for iniciado)
Interagindo com containers
39. Com a tela do terminal aberto pressione a tecla control e aperte p + q.
$ docker ps
$ docker attach bed7185d03bb (ID do container)
Interagindo com containers
40. Crie o arquivo index.html
- Conteúdo: <h1>Hello Docker</h1>
$ docker pull nginx:alpine
Interagindo com containers
41. $ docker run --name web-server
-p 8080:80
-v `pwd`:/usr/share/nginx/html
-d nginx:alpine
Interagindo com containers
43. $ docker run --name web-server -p 8080:80
-v `pwd`:/usr/share/nginx/html: -d nginx:alpine
- docker (daemon)
- --name webserver (concede um nome para o container)
- -v `pwd`:/usr/share/nginx/html (baseado em um diretório do host, cria um
volume no container)
- -d (executa o container em background e informa seu ID)
- nginx:alpine (nome da imagem utilizada para criar o container)
O que ocorreu?
45. Imagens de Containers
Para cada serviço a ser utilizado, e para cada versão de uma aplicação,
possuímos uma imagem.
jenkins-2.58 jenkins-2.57
jenkins-2.56 jenkins-2.46.2
46. Dockerfile
Arquivo utilizado para criar imagens para containers em Docker. Local onde
iremos informar o que nosso container deve possuir, além de:
- Instalar pacotes e bibliotecas.
- Criar variáveis de ambiente.
- Expor portas.
- Copiar arquivos.
- Configurar comando base do container.
- Etc...
47. Gerando uma imagem
Crie um arquivo chamado Dockerfile na mesma pasta do arquivo index.html que
criamos anteriormente.
$ docker build -t web-app:1.0 .
$ docker run -d -p 8080:80 web-app:1.0
54. Publicando imagens
$ docker tag web-app:1.0 repo_name/web-app:1.0
- docker
- tag (adiciona tag a uma imagem)
- web-app:1.0 (nome da imagem a ser adicionado uma tag)
- repo_name/web-app:1.0 (nome da tag a ser adicionada)
61. Ambientes imutáveis
São ambientes que não sofrem alterações, mesmo quando executados em outros
computadores.
- Configurações idênticas.
- Ambiente portável
- Deploy em minutos, e até em segundos.
63. Ambientes imutáveis
Com estes ambientes ganhamos segurança, e agilidade no processo de
desenvolvimento de aplicações.
- Segurança: ambientes idênticos.
- A frase: "Na minha máquina funciona", deixa de existir.
- Ambiente de desenvolvimento = produção
- Agilidade: automatização de processos.
67. $ docker run -d
-v `pwd`:/usr/share/nginx/html
-p 8080:80 frontapp
- -v `pwd`:/usr/share/nginx/html
(cria um volume no container com o conteúdo da pasta
/Users/marra/Projects/in-moment-docker-frontend do host dentro de
/usr/share/nginx/html no container)
Ambientes imutáveis
68. Caso tenha problemas com a interface do frontend, execute o comando abaixo:
$ docker exec container_id npm install
Ambientes imutáveis
72. $ docker run -d
-v `pwd`:/usr/src/app
-p 3000:3000 backapp sh -c 'npm install && npm start'
- sh -c 'npm install && npm start' (sh -c executa um comando shell dentro do
container)
E por que não "...backapp npm install && npm start"?
Ambientes imutáveis
79. Preparando nosso ambiente:
$ cd in-moment-docker-backend && git checkout master
$ cd in-moment-docker-frontend && git checkout master
$ docker rm -f $(docker ps -aq) - (remove todos os containers ativos e inativos)
Ambientes imutáveis
80. $ docker run -d --name dbapp -p 3306:3306 wmarra/in-moment-dbapp
$ cd in-moment-docker-backend
$ docker run -i --name backapp_dbapp
--link dbapp:mysql -d -p 3000:3000
-v `pwd`:/usr/src/app
backapp sh -c 'npm install && npm start'
Ambientes imutáveis
81. Quando os containers estão linkados eles se conectam em um rede própria, e se
comunicam pelos seus nomes.
--link dbapp:mysql (dbapp é o nome do container e o outro mysql é o apelido do
container a ser visível quando for linkado)
Ambientes imutáveis
Network
BACKAPP DBAPP
Mysql
87. Docker compose é utilizado para orquestrar container de maneira simples.
Com ele conseguimos fazer todos os passos mostrados anteriormente, facilitando
e muito nossa vida.
Ambientes imutáveis
88. $ docker rm -f $(docker ps -aq)
- docker
- rm -f (rm remove um container, -f força a remoção)
- $(docker ps -aq) (ps lista os containers, -a lista all containers e -q retorna o
id de all containers)
$ docker rmi -f $(docker images)
- docker
- rmi -f (força a remoção de todas as imagens)
- $(docker images) (lista todas imagens disponíveis)
Ambientes imutáveis
91. O que fizemos?
- version (versão do docker-compose a ser utilizado)
- services (declaração dos serviço - containers).
- container_name (nome do container)
- image (imagem a ser utilizada para criar o container)
- ports (mapeamento de portas)
- links (quais containers serão linkados entre si)
- depends_on (dependência de container)
- command (comando a ser executado pelo container)
Ambientes imutáveis
93. O que fizemos?
$ docker-compose up --build
- docker-compose (docker-compose command)
- up (cria todo o ambiente configurado do docker-compose.yml)
- --build (builda ou rebuild as imagens do docker-compose.yml)
Ambientes imutáveis