Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hands-on de Docker

Hands-on de Docker

apresentado no crud-abc em 17/12/2016

Erick Müller

December 17, 2016
Tweet

More Decks by Erick Müller

Other Decks in Programming

Transcript

  1. 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.
  2. 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.
  3. Começo. VM: Máquina virtual. Docker: imagens e containers. Ou: Docker

    não é VM. Docker não é VM. Docker não é VM.
  4. 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.
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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”
  10. Criando uma imagem o que precisamos entender antes de criar

    uma imagem: • UnionFS • docker commit • Dockerfile • docker build
  11. 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
  12. 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.
  13. 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
  14. 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/
  15. 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
  16. 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
  17. 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.
  18. 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
  19. 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
  20. 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 <pre><?php $con = new mysqli("db", "crud", "senhacrud", "dbcrud"); print_r($con); ?> </pre>
  21. 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
  22. 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.