Docker 101 e Ambientes imutáveis
WorkshopQual o nosso propósito com o workshop?
- Docker 101?- Ambientes imutáveis?
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.
Docker 101
PreloadHoje vivenciamos o uso do Docker graças a 2 peças fundamentais:
- LXC (Um conjunto de ferramentas do linux)- DotCloud (Uma empresa)
LXCLinuX Container
É um conjunto de ferramentas, bibliotecas, templates e controladores de linguagem que nos permite criar e controlar sistemas ou aplicações em container.
LXCOkay, 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
E a DotCloud?DotCloud é uma empresa que possuía vários projetos open source em LXC, e o Docker era um destes projetos.
DotCloudDocker se tornou tão popular que a empresa DotCloud decidiu mudar o nome da empresa para Docker.
DockerDocker 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
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.
Docker vs Virtual Machine
E os containers?
ContainersSão os pequenos "blocos" utilizados para executar tarefas específicas e não mais que isso.
Redis
MySQLPHP
Nginx
HOST
The fluxo
Docker 101Hello World!
Container Exemplo
Container Exemplo
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)
Terminal
Como acessar o terminal?
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)
$ docker run -i ubuntu bash
$ docker run -t ubuntu bash
Testing...
Listando imagens$ docker images
Listando containers$ docker ps
Listando containers$ docker ps -a (all)
Hands On!
$ docker run -ti -p 8080:80 ubuntu:16.04 bash
Interagindo com containers
Interagindo com containers$ apt-get install nano
$ apt-get update
Interagindo com containers
Interagindo com containers$ apt-get install nginx
$ service nginx start
Interagindo com containers
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
Interagindo com containersMas meu terminal tem que ficar aberto pra sempre?
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
Crie o arquivo index.html
- Conteúdo: <h1>Hello Docker</h1>
$ docker pull nginx:alpine
Interagindo com containers
$ docker run --name web-server \-p 8080:80 \-v `pwd`:/usr/share/nginx/html \-d nginx:alpine
Interagindo com containers
Interagindo com containers
$ 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?
Docker 101Imagens de Containers
Imagens de ContainersPara 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
DockerfileArquivo 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...
Gerando uma imagemCrie 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
Gerando uma imagem
Gerando uma imagemEdite o arquivo index.html e insira a linha <h2>V2</h2>.
$ docker build -t web-app:2.0 .
$ docker run -d -p 8080:80 web-app:2.0
Gerando uma imagem$ docker images
E pra onde mando minhas imagens?
Repositório de imagenshub.docker.com (ou store.docker.com)
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)
$ docker images
Publicando imagens
$ docker push wmarra/web-app:1.0
Publicando imagens
$ docker login
$ docker push wmarra/web-app:1.0
Publicando imagens
hub.docker.com
Docker 101 done!
DockerAmbientes Imutáveis
Ambientes imutáveisSã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.
Ambientes imutáveis
Redis
MySQLPHP
Nginx
PC01
Redis
MySQLPHP
Nginx
PC02
Ambientes imutáveisCom 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.
Ambientes imutáveisStarting…
$ git clone [email protected]:wmarra/in-moment-docker-frontend.git
$ git checkout develop
$ git clone [email protected]:wmarra/in-moment-docker-backend.git
$ git checkout develop
$ cd in-moment-docker-frontend/
Ambientes imutáveis
$ docker build -t frontapp .
Ambientes imutáveis
$ 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
Caso tenha problemas com a interface do frontend, execute o comando abaixo:
$ docker exec container_id npm install
Ambientes imutáveis
Ambientes imutáveis
$ cd in-moment-docker-backend/
Ambientes imutáveis
$ docker build -t backapp .
Ambientes imutáveis
$ 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
Ambientes imutáveis
Ambientes imutáveisFront-end, back-end…. e o banco de dados?
Calma, estamos quase lá…
$ docker run -d -p 3306:3306 --name dbapp wmarra/in-moment-dbapp
Ambientes imutáveis
Pronto, temos nossos 3 containers =]
Ambientes imutáveis
FRONTAPP BACKAPP DBAPP
Mas não se comunicam ainda =[
Ambientes imutáveis
DockerAmbientes Imutáveis
Linkando Containers
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
$ 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
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
Ambientes imutáveis
Ambientes imutáveis
Ambientes imutáveisPara completar, vamos iniciar nosso frontend:
$ cd in-moment-docker-frontend/
$ git checkout master
$ docker run -d -p 8080:80 -v `pwd`:/usr/share/nginx/html frontapp
Ambientes imutáveis
Ambientes imutáveisE como orquestrar um ambiente com docker?
- Docker Compose
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
$ 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
$ cd in-moment-docker-backend/
$ mv docker-compose.yml ../
Ambientes imutáveis
Ambientes imutáveis
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
$ docker-compose up --build
…
Ambientes imutáveis
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
$ docker-compose ps
Ambientes imutáveis
Ambientes imutáveis
Ambientes imutáveis
E assim garantimos nossos ambientes imutáveis!
Ambientes imutáveis
Vlws!
Dúvidas?
www.docker.com
hub.docker.com
https://www.youtube.com/user/linuxtipscanal
Referências