Slide 1

Slide 1 text

Docker Hands-on Erick Müller 17.12.2016 CRUD-ABC Twitter | Telegram: @ehriq

Slide 2

Slide 2 text

Não é possível pra cobrir tudo o que o Docker oferece em apenas 2~3 horas. Mas é possível entender como funciona, e sair do conhecimento zero (ou quase zero). Antes, um aviso.

Slide 3

Slide 3 text

Minha experiência em Docker é em linux. Eu nunca usei o Docker no Windows. Eu nunca usei o Docker no Mac. Outro aviso. Mas a promessa é que o Docker rode do mesmo jeito em todos os SOs. Logo, qualquer problema, podemos ver juntos.

Slide 4

Slide 4 text

https://goo.gl/2YuUQz http://dockr.ly/2gpE6ax Cinco cursos de docker, completos. De graça. Com certificados. Para aprender mais:

Slide 5

Slide 5 text

Começo. Ou: Docker não é VM. Docker não é VM. Docker não é VM.

Slide 6

Slide 6 text

Começo. VM: Máquina virtual. Docker: imagens e containers. Ou: Docker não é VM. Docker não é VM. Docker não é VM.

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

VM: Máquina virtual. Tem um computador completo rodando dentro do meu computador.

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Containers: Tem um processo rodando um programa dentro do meu computador.

Slide 11

Slide 11 text

isolamento da aplicação em relação ao resto da estrutura do Sistema Operacional; imutabilidade da aplicação / configuração / ”ponto de aplicação” - images! independência da aplicação em relação à configuração do sistema operacional Host.

Slide 12

Slide 12 text

myapp.exe myapp.exe Configuração inicial (base image) Configuração da aplicação/ambiente (build) DOCKER IMAGE

Slide 13

Slide 13 text

myapp.exe DOCKER IMAGE myapp.exe CONTAINER RODANDO Execução (docker run)

Slide 14

Slide 14 text

IMAGEM modelo; origem CONTAINER imagem em execução; processo

Slide 15

Slide 15 text

EXEMPLO OBRIGATÓRIO EM TODOS OS TUTORIAS DE TODAS AS FERRAMENTAS EXISTENTES

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

O que estes comandos fizeram? docker pull copiou uma base image de um repositório docker pull ubuntu docker pull php:7-apache docker pull langdon/fedora-mssqlserver

Slide 19

Slide 19 text

O que estes comandos fizeram? docker run executou essa imagem docker run (...) ubuntu docker run -d (...) postgres:latest docker run -it (...) minha_imagem modo desconectado modo interativo com terminal alocado

Slide 20

Slide 20 text

mysql:latest postgres:latest langdon/fedora-mssqlserver ubuntu:trusty ubuntu:latest centos:latest fedora:latest Imagens interessantes: base images só com o SO bancos de dados

Slide 21

Slide 21 text

alpine:latest nginx:latest jenkins:latest php:7.1-apache ou php:7.1-fpm python:3 ruby:latest microsoft/dotnet Imagens interessantes: linguagens/frameworks outras utilidades

Slide 22

Slide 22 text

Exemplo como rodar um servidor mysql sem precisar instalar na máquina? o que vamos aprender nesse exercício: 1. como baixar uma imagem 2. como rodar essa imagem (2.1 – como aprender a usar a documentação das imagens) 3. volumes 4. exposição de portas

Slide 23

Slide 23 text

Exemplo como rodar um servidor mysql sem precisar instalar na máquina? docker run -d --name meu-mysql -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=crudabc -e MYSQL_DATABASE=db_crudabc -e MYSQL_USER=usercrud -e MYSQL_PASSWORD=senhabemdificil mysql:latest docker run -it --rm mysql mysql -h172.17.0.2 -uusercrud -psenhabemdificil docker inspect meu-mysql

Slide 24

Slide 24 text

docker run -e NOME_VARIAVEL=abc define “abc” como valor da variável de ambiente NOME_VARIAVEL -p 1234:876 mapeia a porta local 1234 para a porta 876 no container -P expõe todas as portas -v /meu/dir/local:/path/no/container mapeia /meu/dir/local no caminho /path/no/container alguns parâmetros do “run”

Slide 25

Slide 25 text

Criando uma imagem o que precisamos entender antes de criar uma imagem: ● UnionFS ● docker commit ● Dockerfile ● docker build

Slide 26

Slide 26 text

UnionFS Filesystem “empilhado”. Quem conhece o git? É semelhante. Um “pull” puxa todos “layers” de filesystem. E reaproveita os que já existem localmente. base image alterações_0001 alterações_0002 alterações_0003 base filesystem

Slide 27

Slide 27 text

UnionFS

Slide 28

Slide 28 text

Docker Commit docker commit #idcontainer nome_imagem:tag Com um container em execução, as alterações são perdidas ao encerrar a execução. O commit gera uma imagem baseada no estado atual do container selecionado.

Slide 29

Slide 29 text

docker commit #idcontainer nome_imagem:tag Docker Commit (1) docker run -it ubuntu:trusty (2) docker ps (1) apt-get update && apt-get install nginx -y (1) echo “Ola” > teste.txt (2) docker commit 9a4e... nginx_ub:0.1 (1) exit (2) docker images (2) docker run -it nginx_ub:0.1 (2) cat teste.txt

Slide 30

Slide 30 text

Dockerfile + docker build Arquivo com as configurações que definem uma nova imagem. É “compilado” ao rodar o docker build. O resultado da construção é uma imagem executável. Tem vários comandos diferentes, a documentação é bem completa (e complexa). https://docs.docker.com/engine/reference/builder/

Slide 31

Slide 31 text

Dockerfile FROM ubuntu:xenial RUN apt-get update && apt-get install nginx -y COPY index.html /var/www/html/ CMD ["nginx", "-g", "daemon off;"] 1. crie um diretório e dentro dele, um arquivo “index.html”, com o conteúdo que quiser. 2. crie o arquivo “Dockerfile”, com o conteúdo abaixo

Slide 32

Slide 32 text

Dockerfile docker build --tag crudabc/inicial:0.1 . 3. rode o comando “docker build” como abaixo docker run -d -p 8082:80 crudabc/inicial:0.1 4. após terminar, iniciar a imagem com o comando docker run -d -p 8084:80 -v $(pwd):/var/www/html crudabc/inicial:0.1 5. inicie uma nova imagem, mas com o index alterado, mapeando o diretório corrente

Slide 33

Slide 33 text

docker-compose orquestrando vários containers para trabalhar em conjunto. Exemplo 1: minha aplicação precisa de um banco de dados rodando. O banco de dados tem que subir antes. Exemplo 2: tenho vários microserviços, quero ver como eles se comportam em conjunto, no momento de rodar meus testes.

Slide 34

Slide 34 text

docker-compose instalando o docker-compose. No Windows e Mac, já vem instalado com o Docker. No Ubuntu, use os comandos: sudo apt-get install python-setuptools -y sudo easy_install pip sudo pip install docker-compose

Slide 35

Slide 35 text

docker-compose 1. crie o arquivo docker-compose.yml em um novo diretório com o conteúdo abaixo. version: "2" services: db: image: mysql:5.6 volumes: - ./data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: senha1234 MYSQL_DATABASE: dbcrud MYSQL_USER: crud MYSQL_PASSWORD: senhacrud web: build: . volumes: - .:/var/www/html ports: - 8088:80 depends_on: - db docker-compose.yml

Slide 36

Slide 36 text

docker-compose 2. crie o arquivo Dockerfile com o conteúdo abaixo FROM php:7-apache RUN apt-get update && apt-get install -y \ mysql-client libmysqlclient-dev \ && docker-php-ext-install mysqli COPY . /var/www/html 3. crie o arquivo index.php com o conteúdo abaixo


              

Slide 37

Slide 37 text

docker-compose 4. rode o comando para iniciar os containers docker-compose up 5. espere a mágica terminar :) 6. acesse no browser o endereço http://localhost:8088 7. veja que o php conseguiu se conectar ao banco de dados

Slide 38

Slide 38 text

Para aprender mais: https://github.com/veggiemonk/awesome-docker http://bit.ly/2hiRAo0 Playlist da Gophercon Brasil, com algumas talks sobre Docker http://bit.ly/2hiRAo0 Lista awesome com muitos links de Docker.