Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
540
Docker DCA
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
Sumário
1 Preparando o ambiente de aprendizado 3
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 VirtualBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 LAB 1 – Instalar e configurar o VirtualBox . . . . . . . . . . . . . . . . . . . 3
1.3.1 Sistema operacional Windows . . . . . . . . . . . . . . . . . . . . . . 4
1.3.2 Sistema operacional Linux . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.3 Sistema operacional Mac OS X . . . . . . . . . . . . . . . . . . . . . 9
1.3.4 Configuração do VirtualBox Extension Pack em Windows/Linux/Mac . 13
1.4 Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6 LAB 2 – Instalar o Ansible e Git . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.6.1 Sistema Operacional Windows . . . . . . . . . . . . . . . . . . . . . . 17
1.6.2 Sistema operacional Linux . . . . . . . . . . . . . . . . . . . . . . . . 29
1.6.3 Sistema operacional Mac OS X . . . . . . . . . . . . . . . . . . . . . 30
1.7 Vagrant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.8 LAB 3 – Instalar o Vagrant . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.8.1 Sistema operacional Windows . . . . . . . . . . . . . . . . . . . . . . 32
1.8.2 Sistema operacional Linux . . . . . . . . . . . . . . . . . . . . . . . . 35
2
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
3 SUMÁRIO
1.8.3 Sistema operacional Mac OS X . . . . . . . . . . . . . . . . . . . . . 36
1.9 Obtendo os arquivos para aprendizado . . . . . . . . . . . . . . . . . . . . . . 40
1.10 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2 Introdução e instalação do Docker 42
2.1 Introdução ao Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.2 Ambiente Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.3 Docker Editions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2 Plataformas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.3 Arquitetura e requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.3.1 Arquitetura Docker Engine . . . . . . . . . . . . . . . . . . . . . . . 45
2.3.2 Arquitetura Docker UCP . . . . . . . . . . . . . . . . . . . . . . . . 45
2.3.3 Requisitos de hardware e software para Docker UCP . . . . . . . . . . 46
2.3.4 Requisitos da distribuição Linux . . . . . . . . . . . . . . . . . . . . . 47
2.4 Docker namespaces e Cgroups . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.4.1 Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.4.2 Cgroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.5 LAB 1.1 – Acessar as máquinas virtuais . . . . . . . . . . . . . . . . . . . . . 48
2.6 LAB 1.2 – Instalação do Docker no Linux . . . . . . . . . . . . . . . . . . . . 49
2.6.1 Instalar o Docker em ambientes Windows Desktop . . . . . . . . . . . 52
2.6.2 Instalar o Docker em ambiente Windows Server . . . . . . . . . . . . . 52
2.6.3 Instalar o Docker em ambientes Mac OS X . . . . . . . . . . . . . . . 52
2.7 LAB 1.3 – Comandos essenciais do Docker . . . . . . . . . . . . . . . . . . . 52
2.8 Gerenciar Logging Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . 55
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
4 SUMÁRIO
2.8.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.8.2 Configurar o driver de log para um container . . . . . . . . . . . 55
2.8.3 Log padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.9 LAB 1.4 – Alterar log padrão no Docker . . . . . . . . . . . . . . . . . . . . 56
2.9.1 Syslog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.9.2 Journald . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.10 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3 Gerenciar imagens no Docker 60
3.1 Introdução à imagens no Docker . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1.2 Camadas em uma Imagem Docker . . . . . . . . . . . . . . . . . 61
3.1.3 Containers e camadas de imagem . . . . . . . . . . . . . . . . . . 62
3.2 Docker Hub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.2.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3 LAB 2.1 – Criar conta no Docker Hub . . . . . . . . . . . . . . . . . . . . . 63
3.3.1 Testar o acesso a sua conta do Docker Hub . . . . . . . . . . . . . . . 66
3.4 LAB 2.2 – Gerenciamento de imagens no Docker . . . . . . . . . . . . . . . . 68
3.4.1 Comandos iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.4.2 Backup e restauração de Imagens . . . . . . . . . . . . . . . . . . . . 69
3.5 Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.5.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.5.2 Instruções do Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6 LAB 2.3 – Criar imagem no Docker com Dockerfile . . . . . . . . . . . . . . . 72
3.6.1 Imagem webserver-wordpress . . . . . . . . . . . . . . . . . . . . . . 73
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
5 SUMÁRIO
3.6.2 Imagem banco-wordpress . . . . . . . . . . . . . . . . . . . . . . . . 74
3.6.3 Executar uma aplicação WordPress com Docker . . . . . . . . . . . . 76
3.7 LAB 2.4 – Enviar imagens ao Docker Hub . . . . . . . . . . . . . . . . . . . 79
3.8 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4 Gerenciar volumes no Docker 81
4.1 Introdução aos volumes Docker . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2 Volumes x Bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.2.1 Vantagens de um volume sobre montagens Bind: . . . . . . . . . . . . 82
4.2.2 Armazenamento compartilhado . . . . . . . . . . . . . . . . . . . . . 83
4.3 Storage drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.4 Avisos e recomendações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.5 LAB 3.1 – Gerenciar volumes no Docker – Parte 1 . . . . . . . . . . . . . . . 85
4.5.1 Mapear volumes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.5.2 Criar volumes com Docker . . . . . . . . . . . . . . . . . . . . . . . . 86
4.5.3 Usar volume de outro container . . . . . . . . . . . . . . . . . . . . . 87
4.5.4 Remover volumes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.6 LAB 3.2 – Gerenciar volumes no Docker – Parte 2 . . . . . . . . . . . . . . . 88
4.6.1 Criar volumes personalizados . . . . . . . . . . . . . . . . . . . . . . 88
4.6.2 Realizar backup de volumes . . . . . . . . . . . . . . . . . . . . . . . 89
4.6.3 Realizar restauração de volumes . . . . . . . . . . . . . . . . . . . . . 89
4.7 Introdução aos pontos de montagem Bind . . . . . . . . . . . . . . . . . . . 90
4.7.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.7.2 Uso de flags: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
6 SUMÁRIO
4.8 LAB 3.3 – Gerenciar Bind Mounts no Docker . . . . . . . . . . . . . . . . . . 91
4.8.1 Executar contêiner usando Bind Mounts . . . . . . . . . . . . . . . . 91
4.8.2 Uso de pontosde montagem somente leitura . . . . . . . . . . . . . . 92
4.8.3 Montagem em um diretório ocupado no contêiner . . . . . . . . . . . 92
4.9 Introdução aos plugins de volume . . . . . . . . . . . . . . . . . . . . . . . . 93
4.9.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.9.2 Plugins de volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.10 LAB 3.4 - Gerenciar volumes utilizando plugins . . . . . . . . . . . . . . . . . 96
4.10.1 Instalação do plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.10.2 Criar um volume utilizando plugin . . . . . . . . . . . . . . . . . . . . 97
4.11 LAB 3.5 – Gerenciar volumes NFS . . . . . . . . . . . . . . . . . . . . . . . 99
4.11.1 Preparando o servidor NFS . . . . . . . . . . . . . . . . . . . . . . . 99
4.11.2 Preparar o cliente NFS . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.11.3 Criar volumes persistentes no servidor web . . . . . . . . . . . . . . . 100
4.12 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5 Gerenciar redes no Docker 103
5.1 Introdução às redes Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.1.2 Modelo de rede de um container . . . . . . . . . . . . . . . . . . . . 104
5.2 Drivers de rede nativos do Docker . . . . . . . . . . . . . . . . . . . . . . . . 104
5.2.1 Descrição dos drivers de rede . . . . . . . . . . . . . . . . . . . . . . 105
5.3 Tipos de rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.3.1 Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.3.2 Bridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
7 SUMÁRIO
5.3.3 Overlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4 Portas, Links e DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4.1 Uso de portas no Docker . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4.2 Uso de links no Docker . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.3 Uso de DNS no Docker . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.5 LAB 4.1 - Gerenciar portas, links e DNS no Docker . . . . . . . . . . . . . . . 107
5.5.1 Gerenciar portas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.5.2 Gerenciar links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.5.3 Gerenciar DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.6 LAB 4.2 – Gerenciar redes host e bridge no Docker . . . . . . . . . . . . . . . 111
5.6.1 Rede bridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.6.2 Rede host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.7 LAB 4.3 – Comandos de gerenciamento de redes no Docker . . . . . . . . . . 113
5.7.1 Utilizar a rede padrão . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.7.2 Criar redes personalizadas . . . . . . . . . . . . . . . . . . . . . . . . 114
5.7.3 Utilizar IP fixo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.7.4 Remover rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.8 Plugins de rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.8.1 Plugins de Rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.9 LAB 4.4 – Instalar plugin de rede no Docker . . . . . . . . . . . . . . . . . . 116
5.9.1 Instalação do plugin de rede Weave Net . . . . . . . . . . . . . . . . . 117
5.10 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6 Gerenciar Docker Registry e Compose 119
6.1 Introdução ao Docker Registry . . . . . . . . . . . . . . . . . . . . . . . . . . 119
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
8 SUMÁRIO
6.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.2 LAB 5.1 – Instalação do Docker Registry . . . . . . . . . . . . . . . . . . . . 120
6.3 LAB 5.2 – Configurar certificados e autenticação básica . . . . . . . . . . . . 121
6.4 LAB 5.3 – Configurar o acesso aos clientes . . . . . . . . . . . . . . . . . . . 123
6.4.1 Configurar clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.4.2 Enviar imagens para o Docker Registry . . . . . . . . . . . . . . . . . 124
7 Orquestrar ambientes com Docker Compose 126
7.1 Introdução ao Docker Compose . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.2 LAB 5.4 – Instalação do Docker Compose . . . . . . . . . . . . . . . . . . . 127
7.3 LAB 5.5 – Docker Compose: comandos essenciais . . . . . . . . . . . . . . . 128
7.4 LAB 5.6 – Docker Compose: gerenciar volumes e redes . . . . . . . . . . . . 129
7.5 LAB 5.7 – Gerenciar Registry com Docker Compose . . . . . . . . . . . . . . 131
7.5.1 Instalação do Docker Compose . . . . . . . . . . . . . . . . . . . . . 131
7.5.2 Instalação do Docker Compose em Mac OS X ou Windows . . . . . . 132
7.5.3 Configuração do arquivo docker-compose.yml . . . . . . . . . . . . . . 132
7.6 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8 Gerenciar Cluster com Docker Swarm 134
8.1 Introdução ao Docker Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.1.2 Funcionamento do Swarm . . . . . . . . . . . . . . . . . . . . . . . . 135
8.1.3 O nó manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
8.1.4 O nó worker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
9 SUMÁRIO
8.2 LAB 6.1 – Criar um cluster com Docker Swarm . . . . . . . . . . . . . . . . . 136
8.3 LAB 6.2 – Gerenciamento de nós no cluster Swarm . . . . . . . . . . . . . . . 138
8.3.1 Listar nós . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
8.3.2 Definir labels (rótulos) . . . . . . . . . . . . . . . . . . . . . . . . . . 139
8.3.3 Inspecionar o nó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
8.3.4 Remover nó do Cluster . . . . . . . . . . . . . . . . . . . . . . . . . 140
8.3.5 Promoção dos nós no Cluster . . . . . . . . . . . . . . . . . . . . . . 141
8.3.6 Reverter promoção de um nó . . . . . . . . . . . . . . . . . . . . . . 143
8.4 Manutenção no cluster Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . 144
8.5 LAB 6.3 – Realizar manutenção no cluster Swarm . . . . . . . . . . . . . . . 144
8.5.1 Pause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
8.5.2 Active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
8.5.3 Drain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
8.5.4 Lock e Unlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
8.6 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9 Gerenciamento de serviços no Docker Swarm 151
9.1 Serviços e tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.1.2 Tarefas e agendamento . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.1.3 Serviços replicados e globais . . . . . . . . . . . . . . . . . . . . . . . 152
9.2 LAB 7.1 – Gerenciar serviço no cluster Swarm . . . . . . . . . . . . . . . . . 153
9.2.1 Criar um serviço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
9.2.2 Atualizar serviço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9.2.3 Escalonar serviço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com10 SUMÁRIO
9.2.4 Rollback de serviço . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
9.2.5 Remover serviço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
9.2.6 Alterar o modo de replicação em um serviço . . . . . . . . . . . . . . 156
9.2.7 Visualizar logs de serviço . . . . . . . . . . . . . . . . . . . . . . . . 157
9.2.8 Limitar recursos computacionais em um serviço . . . . . . . . . . . . . 157
9.3 LAB 7.2 – Utilizar redes overlay no cluster Swarm . . . . . . . . . . . . . . . 158
9.3.1 Criar rede do tipo overlay . . . . . . . . . . . . . . . . . . . . . . . . 158
9.3.2 Criar rede utilizando o plugin Weave Net . . . . . . . . . . . . . . . . 160
9.4 LAB 7.3 – Utilizar rede e volume em serviços . . . . . . . . . . . . . . . . . . 161
9.5 LAB 7.4 – Utilizar secrets em serviços . . . . . . . . . . . . . . . . . . . . . . 165
9.6 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
10 Routing Mesh e balanceamento de carga 168
10.1 Introdução ao Routing Mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
10.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
10.1.2 Routing Mesh: Ingress x Host . . . . . . . . . . . . . . . . . . . . . . 169
10.2 LAB 8.1 – Gerenciar serviços no modo ingress . . . . . . . . . . . . . . . . . 170
10.3 LAB 8.2 – Gerenciar serviços no modo host . . . . . . . . . . . . . . . . . . . 175
10.4 Descoberta de serviços: VIP e DNSRR . . . . . . . . . . . . . . . . . . . . . 178
10.4.1 VIP x DNSRR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
10.5 LAB 8.3 – Descoberta de serviços: VIP e DNSRR . . . . . . . . . . . . . . . 179
10.5.1 VIP Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
10.5.2 DNSRR Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
10.5.3 Testar a descoberta de serviços . . . . . . . . . . . . . . . . . . . . . 180
10.6 Balanceamento de carga com Traefik . . . . . . . . . . . . . . . . . . . . . . 182
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
11 SUMÁRIO
10.6.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
10.6.2 Conhecendo o Traefib . . . . . . . . . . . . . . . . . . . . . . . . . . 182
10.6.3 Load balance utilizando Traefik . . . . . . . . . . . . . . . . . . . . . 183
10.6.4 Resolução de nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
10.7 LAB 8.4 – Balanceamento de carga com Traefik . . . . . . . . . . . . . . . . 184
10.7.1 Criar serviço do Traefik no cluster . . . . . . . . . . . . . . . . . . . . 184
10.7.2 Criar serviços no cluster . . . . . . . . . . . . . . . . . . . . . . . . . 185
10.7.3 Acessar o dashboard do Traefik . . . . . . . . . . . . . . . . . . . . . 187
10.7.4 Alterar os arquivos index.html dos containers . . . . . . . . . . . . . . 188
10.8 LAB 8.5 – Redirecionar URLs com Traefik . . . . . . . . . . . . . . . . . . . 192
10.8.1 Criar serviços no cluster . . . . . . . . . . . . . . . . . . . . . . . . . 192
10.8.2 Alterar os arquivos index.html dos containers . . . . . . . . . . . . . . 192
10.9 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
11 Gerenciar stacks no cluster Swarm e dashboard 196
11.1 Introdução a stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
11.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
11.2 LAB 9.1 – Gerenciar serviços utilizando stacks . . . . . . . . . . . . . . . . . 198
11.2.1 Criar stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
11.2.2 Atualizar stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.2.3 Remover Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.3 LAB 9.2 – Gerenciar réplicas, limites, volumes e redes utilizando Stacks . . . . 201
11.3.1 Escalonar serviços e gerenciar limites . . . . . . . . . . . . . . . . . . 202
11.3.2 Utilizar volume e rede em stacks . . . . . . . . . . . . . . . . . . . . 203
11.3.3 Integrando Traefik com stacks . . . . . . . . . . . . . . . . . . . . . . 204
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
12 SUMÁRIO
12 Gerenciamento gráfico do Docker com Portainer 207
12.1 Introdução ao Portainer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
12.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
12.2 LAB 9.3 – Instalar o Portainer no cluster Swarm . . . . . . . . . . . . . . . . 207
12.2.1 Instalação do Portainer . . . . . . . . . . . . . . . . . . . . . . . . . 208
12.3 LAB 9.4 – Acessaro painel do Portainer . . . . . . . . . . . . . . . . . . . . . 210
12.4 LAB 9.5 – Gerenciar stacks com Portainer . . . . . . . . . . . . . . . . . . . 213
12.5 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
13 Provisionar ambientes com Docker Machine 219
13.1 Introdução ao Docker Machine . . . . . . . . . . . . . . . . . . . . . . . . . 219
13.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
13.2 Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.1 Virtualbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.2 Vmware (Fusion/vSphere/vCloud Air) . . . . . . . . . . . . . . . 220
13.2.3 DigitalOcean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.4 AWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.5 Google Cloud Platform . . . . . . . . . . . . . . . . . . . . . . . . 221
13.2.6 Exoscale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
13.2.7 OpenStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
13.3 LAB 10.1 – Instalação do Docker Machine . . . . . . . . . . . . . . . . . . . 221
13.3.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
13.3.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
13.3.3 Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
13.4 LAB 10.2 – Provisionar ambientes Docker no Virtualbox . . . . . . . . . . . . 222
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
13 SUMÁRIO
13.4.1 Comandos iniciais Docker Machine . . . . . . . . . . . . . . . . . 223
13.4.2 Comandos de gerenciamento do Docker Machine . . . . . . . . 223
13.5 Provisionar ambiente Docker na nuvem . . . . . . . . . . . . . . . . . . . . . 227
13.5.1 Google Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
13.5.2 Etapas: criar instância no Google Cloud através do Docker Machine: . 228
13.5.3 Digital Ocean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
13.5.4 Etapas: criar instância no Digital Ocean através do Docker Machine: . 228
13.5.5 Amazon Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . 229
13.5.6 Etapas: criar instância na AWS através do Docker Machine: . . . . . . 229
13.6 LAB 10.3 – Cluster Swarm com Trafiek através do Docker Machine . . . . . . 229
13.6.1 ETAPA 1 - Criar máquinas virtuais no cluster Swarm . . . . . . 229
13.6.2 ETAPA 2 – Criar um cluster Swarm utilizando as máquinas
virtuais do Docker Machine . . . . . . . . . . . . . . . . . . . . . 230
13.6.3 ETAPA 3 – Criar serviço do Traefik no cluster Swarm . . . . . . . . . 232
13.6.4 ETAPA 4 – Definir labels para os nós worker no cluster Swarm . . . . 232
13.6.5 ETAPA 5 – Realizar Deploy do Wordpress no Cluster Swarm . . . . . . 233
13.6.6 ETAPA 6 – Acessar aplicação Wordpress no cluster Swarm . . . . . . . 235
13.6.7 ETAPA 7 – Removendo máquinas virtuais do cluster Swarm . . . . . . 238
13.7 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
14 Extra: introdução e instalação do Docker UCP 240
14.1 Introdução ao Docker UCP . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
14.1.1Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
14.1.2 Requisitos de instalação Docker UCP . . . . . . . . . . . . . . . 241
14.1.3 Atualização do Docker UCP . . . . . . . . . . . . . . . . . . . . . . . 241
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
14 SUMÁRIO
14.2 LAB 11.1 – Instalar o Docker UCP . . . . . . . . . . . . . . . . . . . . . . . 241
14.2.1 Cluster Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
14.2.2 Docker UCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
14.3 LAB 11.2 – Acesso ao painel do Docker UCP . . . . . . . . . . . . . . . . . . 245
14.4 LAB 11.3 – Gerenciar nós através do Docker UCP . . . . . . . . . . . . . . . 248
14.5 LAB 11.4 – Realizar backup e restauração do Docker UCP . . . . . . . . . . . 252
14.5.1 Exibir id do Docker UCP . . . . . . . . . . . . . . . . . . . . . . . . 252
14.5.2 Backup do UCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
14.5.3 Desinstalação do Docker UCP . . . . . . . . . . . . . . . . . . . . 257
14.5.4 Restore do Docker UCP . . . . . . . . . . . . . . . . . . . . . . . 258
14.6 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
15 Extra: introdução e instalação do DTR 262
15.1 Introdução ao DTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
15.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
15.1.2 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
15.1.3 Funcionalidades do DTR . . . . . . . . . . . . . . . . . . . . . . . . . 263
15.2 LAB 12.1 – Instalação do DTR . . . . . . . . . . . . . . . . . . . . . . . . . 264
15.3 LAB 12.2 – Enviar imagem para o DTR . . . . . . . . . . . . . . . . . . . . . 267
15.4 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
16 Extra: configuração RBAC no Docker UCP 270
16.1 RBAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
16.1.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
16.1.2 Componentes do RBAC . . . . . . . . . . . . . . . . . . . . . . . . . 271
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
15 SUMÁRIO
16.2 LAB 13.1 – Configurar equipes e usuários e no Docker UCP . . . . . . . . . . 271
16.2.1 Adicionar equipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
16.2.2 Adicionar usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
16.2.3 Associar um usuário a uma equipe . . . . . . . . . . . . . . . . . . . . 276
16.3 LAB 13.2 – Configurar Access Control no Docker UCP . . . . . . . . . . . . . 280
16.3.1 Criar role (regras) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
16.3.2 Conceder acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
17 Extra: Docker Security 288
17.1 Áreas principais na segurança do Docker . . . . . . . . . . . . . . . . . . . . 288
17.1.1 Conceito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
17.2 LAB 14.1 – Gerenciar imagens com Docker Content Trust . . . . . . . . . . . 290
17.2.1 Realizar o download . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
17.2.2 Realizar o upload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
17.3 Certificados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
17.3.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
17.4 LAB 14.2 – Utilizar certificados externos no Docker UCP . . . . . . . . . . . 294
17.5 Client Bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
17.6 LAB 14.3 – Criar pacote para clientes no Docker UCP . . . . . . . . . . . . . 298
17.6.1 Gerar pacote via download no painel . . . . . . . . . . . . . . . . . . 299
17.6.2 Gerar pacote via download no terminal . . . . . . . . . . . . . . . . . 301
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
1
Preparando o ambiente de
aprendizado
Objetivos
• Instalar e configurar o VirtualBox
• Instalar o Ansible
• Instalar o Git
• Instalar o Vagrant
• Obter os arquivos necessários para o aprendizado
VirtualBox
O VirtualBox [1] é um software de virtualização desenvolvido pela empresa Innotek. Pre-
cisamos do VirtualBox em nossa infraestrutura para gerenciar as máquinas virtuais que serão
apresentadas neste material.
LAB 1 – Instalar e configurar o VirtualBox
Neste laboratório vamos aprender como instalar e configurar, o VirtualBox nos sistemas op-
eracionais Windows, Linux e Mac.
16
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
17 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Sistema operacional Windows
Para começar, acesse o site do VirtualBox, clique em Downloads e clique na opção Windows
hosts:
Fig. 1.1: Download do Virtualbox para Windows
Clique duas vezes no arquivo executável do instalador e siga as instruções de instalação con-
forme a imagem a seguir:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
18 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.2: Download do Virtualbox para Windows-1
Após realizar a instalação clique no botão Finish:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
19 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.3: Instalação do Virtualbox no Windows
Verifique se o VirtualBox foi instalado corretamente em seu sistema:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
20 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.4: Tela inicial do Virtualbox no Windows
Sistema operacional Linux
Acesse o site do Virtualbox, clique em Downloads e clique na opção Linux distributions:
Fig. 1.5: Download do Virtualbox para Linux
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
21 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Selecione a sua distribuição para realizar o download do pacote de instalação. No exemplo
apresentado, será feito o download para a distribuição Ubuntu:
Fig. 1.6: Download do Virtualbox - Escolha da distribuição Linux
Selecione a opção para salvar o arquivo:
Fig. 1.7: Download do Virtualbox para Linux
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
22 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Acesse a pasta onde o pacote de instalação do VirtualBox foi salvo após o download e realize
a instalação conforme a sua distribuição. Exemplos:
Debian/Ubuntu:
1 sudo dpkg -i $HOME/Downloads/virtualbox-<versão>.deb
2 sudo apt install -f
Oracle Linux/openSUSE/Fedora:
1 sudo rpm -i $HOME/Downloads/virtualbox-<versão>.rpm
Verifique se o VirtualBox foi instalado corretamente em seu sistema:
Fig. 1.8: Tela inicial do Virtualbox no Linux
Sistema operacional Mac OS X
Para começar acesse o site do VirtualBox, clique em Downloads e clique na opção OS X hosts:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
23 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.9: Download do Virtualbox para Mac OS X
Clique duas vezes no arquivo DMG para montar o disco de instalação do VirtualBox:
Fig. 1.10: Disco de instalação do Virtualbox para Mac OS X
Dê um duplo clique no arquivo VirtualBox.pkg e siga as instruções de instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
24 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.11: Instalação do Virtualbox no Mac OS X
Após realizar a instalação clique no botão Fechar:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
25 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.12: Instalação do Virtualbox no Mac OS X
Verifique se o VirtualBox foi instalado corretamente em seu sistema:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
26 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.13: Tela inicial do Virtualbox no Mac OS X
Configuração do VirtualBox Extension Pack em Windows/Linux/Mac
Realize o download do Extension pack na área de downloads do site do VirtualBox, clicando
em All supported platforms:
Fig. 1.14: Download do Extension Pack para o Virtualbox
Cliqueduas vezes no arquivo Oracle_VM_VirtualBox_Extension_Pack-<versão>.vbox-extpack
para iniciar a instalação do pacote. Na janela do Virtualbox clique no botão Instalar:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
27 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.15: Instalação do Extension Pack para o Virtualbox
Clique Eu concordo (A) na tela seguinte para aceitar a licença de uso:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
28 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.16: Instalação do Extension Pack para o Virtualbox
Confirme a instalação do Extension Pack e clique no botão OK.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
29 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.17: Instalação do Extension Pack para o Virtualbox
Ansible
O Ansible [2] é um software utilizado para gerenciar a orquestração da sua infraestrutura através
de código. Precisamos do Ansible em nossa infraestrutura para provisionar as máquinas virtuais
que serão utilizadas durante o aprendizado deste conteúdo.
Git
Também faremos uso do versionador de código Git [3], que será utilizado para gerenciar seus
códigos através de repositórios públicos e privados. Precisamos do Git em nossa infraestrutura,
para obter os arquivos apresentados neste material através do endereço GitHub da 4Linux.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
30 1. PREPARANDO O AMBIENTE DE APRENDIZADO
LAB 2 – Instalar o Ansible e Git
Neste laboratório vamos aprender como instalar o Git e o Ansible nos sistemas operacionais
Windows, Linux e Mac.
Sistema Operacional Windows
Antes de iniciar a instalação do Ansible e Git no Windows, vamos utilizar a ferramenta Cygwin
[4]. Essa ferramenta disponibiliza uma coleção de ferramentas open source, que fornecem
recursos semelhantes à uma distribuição Linux no Windows.
Acesse o site do Cygwin clique em Install Cygwin e em seguida no link setup-x86_64.exe:
Fig. 1.18: Download do Cygwin
Abra o arquivo executável do instalador e clique no botão Avançar para iniciar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
31 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.19: Instalação do Cygwin - Etapa 1
Selecione quais pacotes serão baixados da Internet, através da opção Install from Internet.
Clique no botão Avançar para continuar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
32 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.20: Instalação do Cygwin - Etapa 2
Confirme o diretório em que o Cygwin será instalado. Clique no botão Avançar para continuar
a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
33 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.21: Instalação do Cygwin - Etapa 3
Confirme o diretório onde o Cygwin irá armazenar os arquivos de pacotes e configurações.
Clique no botão Avançar para continuar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
34 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.22: Instalação do Cygwin - Etapa 4
Selecione o tipo de conexão com a Internet, através da opção Direct Connection. Clique no
botão Avançar para continuar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
35 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.23: Instalação do Cygwin - Etapa 5
Selecione o endereço do site onde o Cygwin irá baixar os pacotes, através da lista Available
Download Sites. Clique no botão Avançar para continuar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
36 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.24: Instalação do Cygwin - Etapa 6
Para selecionar o pacote ansible:
• Na caixa View selecione a opção Full;
• Na caixa Search digite ansible;
• Na coluna New, selecione a versão do ansible e ansible-doc;
• Na coluna Src?, selecione ansible e ansible-doc.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
37 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.25: Instalação Ansible no Cygwin
Para selecionar o pacote git:
• Na caixa View selecione a opção Full;
• Na caixa Search digite git;
• Na coluna New, selecione a versão do git;
• Na coluna Src?, selecione git;
• Clique no botão Avançar para continuar a instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
38 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.26: Instalação do Git Cygwin
Confirme os pacote que serão necessários através do botão Avançar:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
39 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.27: Confirmação dos pacotes ansible, ansible-doc e git no Cygwin
Aguarde o download dos pacotes:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
40 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.28: Downloads de pacotes no Cygwin
Para finalizar a instalação, marque os ícones, menus e clique no botão Concluir:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
41 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.29: Downloads de pacotes no Cygwin
Para confirmar a instalação do Ansible e do Git no Windows, clique duas vezes no ícone
Cygwin64 Terminal e digite os seguintes comandos:
1 ansible --version
1 git --version
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
42 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.30: Ansible e Git instalados no Windows
Sistema operacional Linux
Para instalar o Ansible e o Git na distribuição Ubuntu execute os seguintes comandos:
1 sudo apt update
2 sudo apt install software-properties-common -y
3 sudo apt-add-repository --yes --update ppa:ansible/ansible
4 sudo apt install ansible git -y
Para instalar o Ansible e o Git na distribuição Debian execute os seguintes comandos:
1 sudo vim /etc/apt/sources.list
2 ....
3 deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
1 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
2 sudo apt update
3 sudo apt install ansible git -y
Para instalar o Ansible e o Git na distribuição Fedora execute o comando:
1 sudo dnf install ansible git
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
43 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Para instalar o Ansible e o Git na distribuição CentOS execute o comando:
1 yum --enablerepo=epel -y install ansible git
Para confirmar a instalação do Ansible e do Git no Linux, execute os comandos:
1 ansible --version
1 git --version
Fig. 1.31: Ansible e Git instalados no Linux
Sistema operacional Mac OS X
Antes de iniciar a instalação do Ansible e do Git no Windows, vamos utilizar a ferramenta
Homebrew [5]. Essa ferramenta funciona como um gerenciador de pacotes para o Mac OS X.
Para começar acesse o terminal em seu Mac, e digite o comado para instalar o Homebrew:
1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/
master/install.sh)"
Para instalar o Ansible e o Git através do Homebrew, execute o seguinte comando:
1 brew install ansible git
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
44 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Para confirmar a instalação do Ansible e do Git no Mac OS X, execute os seguintes comandos:
1 ansible --version
1 git --version
Fig. 1.32: Ansible e Git instalados no Mac OS X
Vagrant
O Vagrant [6] é um software de automação escrito em Ruby e mantido pela empresa Hashicorp.
Precisamos do Vagrant em nossa infraestrutura para automatizar a criação da máquinas vir-
tuais do curso.
LAB 3 – Instalar o Vagrant
Neste laboratório vamos aprender como instalar o Vagrant nos sistemas operacionais Windows,
Linux e Mac.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
45 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Sistema operacional Windows
Para começar acesse o site do Vagrant:
Fig. 1.33: Site do Vagrant - https://www.vagrantup.com
Em seguida clique na opção Download para Windows:
Fig. 1.34: Download do Vagrant para Windows
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
46 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Clique duas vezes no arquivo executável doinstalador e siga as instruções:
Fig. 1.35: Instalação do Vagrant no Windows
Após realizar a instalação clique no botão Finish:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
47 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.36: Instalação do Vagrant no Windows
É preciso reiniciar o sistema para concluir a instalação do Vagrant:
Fig. 1.37: Instalação do Vagrant no Windows
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
48 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Sistema operacional Linux
Acesse o site do Vagrant:
Fig. 1.38: Site do Vagrant - https://www.vagrantup.com
Em seguida clique na opção Download conforme a sua distribuição:
Fig. 1.39: Download do Vagrant para Linux
Selecione a opção para salvar o arquivo:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
49 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.40: Download do Vagrant para Linux
Acesse a pasta onde o pacote de instalação do Vagrant foi salvo e realize a instalação conforme
a sua distribuição. Exemplos:
Debian/Ubuntu:
1 sudo dpkg -i $HOME/Downloads/vagrant_<versão>.deb
2 sudo apt install -f
CentOS:
1 sudo rpm -i $HOME/Downloads/vagrant_<versão>.rpm
Sistema operacional Mac OS X
Acesse o site do Vagrant:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
50 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.41: Site do Vagrant - https://www.vagrantup.com
Em seguida clique na opção Download para MAC OS X:
Fig. 1.42: Download do Vagrant para Mac OS X
Clique duas vezes no arquivo DMG para montar o disco de instalação do Vagrant:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
51 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.43: Disco de instalação do Vagrant para Mac OS X
Clique duas vezes no arquivo vagrant.pkg e siga as instruções de instalação:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
52 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.44: Instalação do Vagrant no Mac OS X
Após realizar a instalação clique no botão Fechar:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
53 1. PREPARANDO O AMBIENTE DE APRENDIZADO
Fig. 1.45: Instalação do Virtualbox no Mac OS X
Obtendo os arquivos para aprendizado
Após instalar todas as ferramentas e preparar sua infraestrutura é preciso obter os arquivos
para iniciar o aprendizado neste material no Github da 4Linux. Os arquivos são necessários
para a instalação e configuração das máquinas virtuais através do Vagrant.
Abra um Terminal no Linux ou Mac, ou o Cygwin64 Terminal no Windows, e execute o
comando git para clonar o repositório de seu curso.
Exemplos:
Docker: Código 4540
1 git clone https://github.com/4linux/4540.git
Kubernetes: Código 4541
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
54 1. PREPARANDO O AMBIENTE DE APRENDIZADO
1 git clone https://github.com/4linux/4541.git
OpenShift: Código 4542
1 git clone https://github.com/4linux/4542.git
Para saber o código correto de seu curso, acesse a lista de cursos no site da 4Linux [7].
Links
[1] VirtualBox: https://www.virtualbox.org/
[2] Ansible: https://www.ansible.com/
[3] GitHub da 4Linux: https://github.com/4linux
[4] Cygwin: https://www.cygwin.com
[5] Homebrew: https://brew.sh/index_pt-br
[6] Vagrant: https://www.vagrantup.com
[7] Lista de cursos da 4Linux: https://4linux.com.br/cursos
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
2
Introdução e instalação do Docker
Competências deste conteúdo
Esta material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Installation and Configuration (15% of exam)
LPI DevOps Tools Engineer Container Usage (weight: 7)
Introdução ao Docker
Conceito
O Docker é uma plataforma open source que permite o gerenciamento de pacotes de software
em ambientes isolados. Foi escrito em Go, linguagem de programação desenvolvida pela
Google. O Docker é muito utilizado em ambientes DevOps, pois permite a execução de
aplicações distribuídas em containers.
Ambiente Docker
Um container é uma instância em tempo de execução de uma imagem Docker. Quando exe-
cutamos um container, é criada uma área restrita que contém a aplicação e sua dependências
bem como arquivos de configurações, binários e bibliotecas. A máquina hospedeira ou Host
55
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
56 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
OS, consegue criar diversos ambientes de forma independente e comparado ao modelo tradi-
cional de virtualização O uso de containers permite executar aplicações de forma instantânea
e isolada.
Conforme a imagem abaixo podemos ver a diferença entre executar aplicações em container
e em máquinas virtuais.
Fig. 2.1: Ambiente Docker
Docker Editions
Docker Community
A Docker Community Edition -- CE, é a edição de código aberto disponível gratuitamente e
suportada pela comunidade. Contém o mecanismo Docker e a orquestração Swarm integrada
à rede e à segurança. Seu uso é recomendado por desenvolvedores para testes, treinamento e
aprendizado, sendo a primeira escolha para quem deseja ter experiência prática com Docker.
O Docker Community Edition é ideal para desenvolvedores e pequenas equipes que querem
começar a utilizar o Docker e experimentar aplicativos baseados em container. O Docker CE
possui três tipos de canais de atualização, stable, test e nightly:
• Stable: fornece os últimos lançamentos estáveis do ambiente;
• Test: fornece pré-versões que estão prontas para teste, antes que esta se torne uma
versão stable;
• Nightly: compilações diárias da plataforma que oferecem as mais recentes versões pre-
vistas para lançamento.
Fonte: https://docs.docker.com/engine/install/
Docker Enterprise
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
57 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
O Docker Enterprise Edition – é uma edição utilizada em ambientes de produção disponível
em três versões: básico, padrão e avançado. Para ser suportado pelo Docker, é preciso que
seu hardware atenda à lista de compatibilidade de hardware e com isso seja certificada pelo
Docker.
A versão Docker Enterprise Advanced Edition, inclui a verificação segura de imagens, garantindo
que qualquer imagem de container no seu repositório seja segura e livre de código malicioso.
Foi projetado também para desenvolvimento de empresas e equipes de TI que constroem,
enviam e executam aplicativos críticos de negócios e produção em escala.
é integrado, certificado e suportado para fornecer às empresas a plataforma de containers mais
segura da indústria para modernizar aplicações. Além disso, o Docker EE Advanced vêm com
adicionais corporativos como UCP e DTR.
Plataformas
O Docker Community Edition pode ser executado tanto no sistema operacional GNU/Linux,
MacOS X, quanto no Windows 10, caso você esteja usando o Docker para desenvolvimento,
treinamento ou aprendizado local. O Docker Enterprise Edition também é executado em
uma variedade de diferentes distribuições Linux e no Microsoft Windows Server 2016.
O Docker Enterprise Edition e o Docker Community Edition podem ser executados na nuvem
pública. E essa é uma das grandes vantagens do Docker, os containers criados e executados
em um ambiente de teste local ou em um desktop, podem ser facilmente ser movidos para a
nuvem pública ou para um servidor que execute esses contêineres em produção.
Antes de instalar o Docker Enterprise é preciso fazer uma verificação de requisitos dos seguintes
itens:
• Portas de rede: uma série de portas precisam ser abertas para o tráfego de entrada
de dados.
• Espaço em disco: é preciso 5GB de espaço livre em disco para a partição /var para
os nós manager (é recomendado um mínimo de 6GB) e 500 MB de espaço livre para a
partição /var para os nós worker. A partição /var é utilizada pelo Docker para armazenar
containers e imagens.
• Sincronização de horário: em sistemas distribuídos, como o Docker UCP, a sin-
cronização de tempo é fundamental para garantir a operação adequada. Como prática
recomendada para garantir aconsistência entre os mecanismos de um cluster UCP,
todos os mecanismos devem sincronizar regularmente o tempo com um servidor NTP
(Network Time Protocol).
• Compatibilidade da versão do Docker Engine, DTR e UCP: o Docker EE é uma assi-
natura de software que inclui três produtos: Docker Engine, com suporte de nível corpo-
rativo, registro confiável do Docker (TR) e também o Docker Universal Control Plane
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
58 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
(UCP)
Arquitetura e requisitos
Arquitetura Docker Engine
O Docker Engine é projetado como um aplicativo cliente-servidor, sendo composto por três
itens diferentes, começando pelo dockerd ou daemon do Docker, que é instalado automatica-
mente na instalação do Docker, sendo esse serviço o próprio servidor Docker. Vale lembrar
que o termo daemon é utilizado para definir um programa que é executado como um processo
em background.
Juntamente com a instalação do Docker Engine, você recebe uma API RESTful. Ela é im-
portante porque define a interface que todos os outros programas utilizam para falar com o
daemon.
O cliente é o comando docker que é executado para se comunicar com o servidor Docker, a
fim de extrair e criar imagens e também instanciar containers. Independentemente da versão
do Docker que você esteja usando, seja a Community Edition ou Enterprise Edition, o Docker
Engine é a base necessária para tornar tudo isso possível.
O daemon está instalado no host do Docker. Esse host pode ser seu computador desktop,
laptop, um servidor em um datacenter ou até mesmo uma máquina virtual sendo executada
na nuvem. A partir daí, o host do Docker é usado para executar ou instanciar seus containers
e imagens. Isso é administrado através do cliente Docker, que pode estar no mesmo host que
o daemon ou pode executado remotamente.
Fonte: https://docs.docker.com/get-started/overview/
Arquitetura Docker UCP
O Universal Control Plane é uma aplicação executada com base no Docker Swarm, que é
um orquestrador nativo para o Docker. O Docker UCP permite o gerenciamento gráfico e
monitoramento de uma instância Docker. O aplicativo container que é executado no Docker
Enterprise Edition, estende sua funcionalidade para simplificar a implantação, a configuração
e o monitoramento de seus aplicativos em grande escala.
O UCP também protege o Docker com controle de acesso baseado em função, de modo
que apenas usuários autorizados possam fazer alterações e implantar aplicativos no cluster do
Docker.
Depois que a instância é implantada, os desenvolvedores e a equipe de operações não interagem
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
59 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
mais com o Docker Engine diretamente, mas interagem com o UCP. Como o UCP expõe a
API Docker padrão, tudo isso é feito de maneira transparente, para que você possa usar as
ferramentas que já conhece.
Fig. 2.2: Arquitetura Docker UCP
Fonte: https://docs.mirantis.com/docker-enterprise/v3.0/dockeree-products/ucp.html
Requisitos de hardware e software para Docker UCP
Hardware
• 8 GB de RAM para os nós manager;
• 4 GB de RAM para os nós worker;
• 2 vCPUs para nós manager;
• 4 GB de espaço livre em disco para a partição /var para os nós manager;
• 500 MB de espaço livre em disco para a partição /var para nós worker.
Software
• Docker EE Engine versão 18.09;
• Versão do kernel Linux 3.10 ou superior;
• Endereço IP estático;
• Sincronização de horário através de um servidor NTP.
Portas
Ao instalar o UCP em um host, uma série de portas precisam ser abertas para o tráfego
de entrada. Cada uma dessas portas espera o tráfego de entrada de um conjunto de hosts,
indicado como o “Escopo” dessa porta.
Os três escopos são:
• External: o tráfego chega de fora do cluster, por meio da interação do usuário final;
• Internal: o tráfego chega de outros hosts no mesmo cluster;
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
60 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
• Self: o tráfego chega a essa porta apenas por meio de processos no mesmo host.
Requisitos da distribuição Linux
CentOS
• Versão 7/8 do CentOS;
• Versões inferiores não são suportadas nem testadas;
• O repositório centos-extras deve estar ativado;
• O driver de armazenamento overlay2 é recomendado.
Debian
• Versão Buster 10;
• Versão Stretch 9 (stable);
• O Docker CE é suportado nas arquiteturas x86_64 (ou amd64), armhf e arm64.
Fedora
• Versão 28/29;
• O Docker CE é suportado nas arquiteturas amd64.
Ubuntu
• Versão Cosmic 18.10;
• Versão Bionic 18.04 (LTS);
• Versão Xenial 16.04 (LTS);
• O Docker CE é suportado nas arquiteturas x86_64 (ou amd64), armhf e arm64.
Docker namespaces e Cgroups
Namespace
Os namespaces asseguram que cada container enxergue apenas o seu próprio ambiente e não
afete ou tenha acesso a processos em execução dentro de outros containers. Além disso, os
namespaces fornecem acesso restrito aos sistemas de arquivos como, por exemplo, o Chroot,
por ter uma estrutura de diretório exclusiva para cada container.
O Docker utiliza namespaces de processo, montagem, IPC, rede e usuário para isolar o que está
acontecendo no host do Docker do que está acontecendo em seus contêineres. A Microsoft
adicionou o equivalente a um isolamento de namespace no Windows, de forma que o Docker
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
61 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
para Windows forneça a mesma funcionalidade.
Saiba mais executando o comando: man namespaces e conheça todos os recursos
fornecidos pelos namespaces.
Os namespaces são semelhantes em conceito ao que um hypervisor faz para fornecer os
recursos virtuais, como CPU, memória e armazenamento à uma máquina virtual.
Cgroups
O Docker Engine no Linux, também faz uso de outra tecnologia chamada Cgroups ou grupos de
controle. Com o uso do Cgroups, o Docker consegue isolar as aplicações e gerenciar apenas os
recursos que você desejar. Os grupos de controle, permitem que o Docker compartilhe recursos
de hardware disponíveis para cada container, e se necessário, configure limites e restrições.
Para saber mais sobre o Cgroups execute o comando: man cgroups.
LAB 1.1 – Acessar as máquinas virtuais
Neste laboratório vamos aprender como acessar as máquinas virtuais utilizadas neste material.
é necessário seguir os procedimentos da aula Preparando o ambiente de aprendizado, que
está disponível aqui ou através das vídeo aulas disponíveis no Netclass [1] da 4Linux .
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida verifique se as máquinas virtuais do curso estão presentes, através do Vagrant:
1 vagrant status
Resultado do comando:
1 Current machine states:
2
3 manager poweroff (virtualbox)
4 worker01 poweroff (virtualbox)
5 worker02 poweroff (virtualbox)
6 registry poweroff (virtualbox)
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
62 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
7
8 This environment represents multiple VMs. The VMs are all listed
9 above with their current state. For more information about a specific
10 VM, run ‘vagrant status NAME‘.
Para iniciar as máquinas virtuais utilize o subcomando up do Vagrant:
1 vagrant up
Para acessar as máquinas virtuais utilize o comando vagrant ssh <nome_da_vm>. Exemplos:
1 vagrant ssh manager
1 vagrant ssh worker01
1 vagrant ssh worker02
1 vagrant ssh registry
LAB 1.2 – Instalação do Docker no Linux
Neste laboratório vamos aprender como instalar o Docker em distribuições baseadas no Red-
Hat e Debian.
Instalação em distribuições CentOS
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse as máquinas virtuais Manager e Worker01, através do vagrant ssh.
1 vagrant ssh manager
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
63 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
1 vagrant ssh worker01
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
Para a instalação em ambas máquinas virtuaisvamos seguir os seguintes passos:
1. Instalar o yum-utils, que fornece o utilitário yum-config-manager
2. Configurar o repositório estável do Docker
3. Instalar o Docker
4. Ativar e iniciar o Docker na inicialização do sistema
5. Adicionar o usuário suporte ao grupo do Docker
Conforme a sequência de comandos a seguir:
1 sudo yum install yum-utils device-mapper-persistent-data lvm2 -y
2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/
docker-ce.repo
3 sudo yum install docker-ce docker-ce-cli containerd.io -y
4 sudo systemctl enable docker && sudo systemctl start docker
5 sudo usermod -aG docker suporte && sudo su - suporte
Gerenciar o Docker sem um usuário root
O daemon do Docker é ligado a um soquete Unix ao invés de uma porta TCP. Por padrão, o
soquete Unix é de propriedade do usuário root e outros usuários só podem acessá-lo usando o
comando sudo. O daemon do Docker sempre é executado como usuário root.
Se você não deseja começar o comando docker com sudo, adicione o usuário ao grupo docker.
Desta forma, quando o daemon do Docker é iniciado, ele cria um soquete Unix acessível pelos
membros do grupo docker.
Sendo assim, verifique qual é a versão instalada do Docker:
1 docker version
Instalação em distribuições Ubuntu
Para começar, acesse a pasta 4540 que você obteve do Github da 4Linux:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
64 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
1 cd 4540
Em seguida, acesse as máquinas virtuais Worker02 e Registry, através do vagrant ssh.
1 vagrant ssh worker02
1 vagrant ssh registry
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
Para a instalação em ambas máquinas virtuais vamos seguir os seguintes passos:
1. Atualizar lista de pacotes de repositórios do sistema
2. Instalar as dependências para o Docker
3. Baixar e configurar a chave pública do repositório
4. Configurar o repositório estável do Docker
5. Atualizar novamente a lista de pacotes dos repositórios configurados
6. Instalar o Docker
7. Adicionar o usuário suporte ao grupo do Docker
Conforme a sequência de comandos a seguir:
1 sudo apt-get update
2 sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent
software-properties-common -y
3 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/
ubuntu $(lsb_release -cs) stable"
5 sudo apt-get update
6 sudo apt-get install docker-ce docker-ce-cli containerd.io -y
7 sudo usermod -aG docker suporte && sudo su - suporte
Verifique qual é a versão instalada do Docker:
1 docker version
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
65 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
Instalar o Docker em ambientes Windows Desktop
Acesse o link abaixo e clique no botão Get Docker. Sera feito o download de um instalador,
onde sera preciso instalá-lo seguindo as instruções na tela:
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
Instalar o Docker em ambiente Windows Server
Abra um prompt de comando do PowerShell e digite os seguintes comandos:
1 Install-Module DockerMsftProvider -Force
2 Install-Package Docker -ProviderName DockerMsftProvider -Force
Reinicie o servidor para finalizar a instalação:
1 Restart-Computer
Instalar o Docker em ambientes Mac OS X
Acesse o link abaixo e clique no botão Get Docker.. Será feito o download de um arquivo DMG,
e será preciso montá-lo e arrastar o App do Docker para a pasta Aplicativos:
https://hub.docker.com/editions/community/docker-ce-desktop-mac/
LAB 1.3 – Comandos essenciais do Docker
Neste laboratório vamos aprender os comandos essenciais do Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
66 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
2 sudo su - suporte
Execute o comando que exibe informações do ambiente:
1 docker system info
Para listar containers, imagens e redes no Docker, execute os comandos:
1 docker container ls
2 docker image ls
3 docker network ls
Para pesquisar imagem Debian no Docker Hub, execute o comando:
1 docker search debian
Descrição dos comandos
• docker info ou docker system info: exibe informações do Docker como versão, quan-
tidade de containers em execução, storage drivers entre outros;
• docker ps ou docker container ls: lista os containers em execução. Utilize a flag -a
para mostrar todos os containers em qualquer estado;
• docker images ou docker image ls: lista imagens do Docker armazenadas localmente;
• docker network ls: lista redes criadas para uso do Docker;
• docker search: pesquisa uma imagem no Docker Hub
Baixe a imagem do servidor Debian e verifique se este aparece na lista de imagens:
1 docker image pull debian
2 docker image ls
A imagem do Debian possui o tamanho de um pouco mais de 100MB. Uma dica
para um teste rápido com o Docker, é utilizar imagens mais leves, como o Busybox
(1.22MB) e o Alpine (5.57MB).
Execute um container Debian e verifique se o mesmo aparece na lista de containers em exe-
cução:
1 docker container run -dit --name servidor-debian --hostname servidor-debian
debian
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
67 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
2 docker container ls
A sintaxe do comando docker run é como a seguir:
1 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Para se conectar ao container em execução, execute o comando:
1 docker container attach servidor-debian
Descrição dos comandos
• docker pull ou docker image pull: baixa do Docker Hub uma imagem do Docker, para
a máquina local;
• docker run -dit ou docker container run -dit: executa um container;
• docker attach ou docker container attach: anexa um terminal a um container em ex-
ecução.
Opções do subcomando run ou container run:
• --dit: executa o container em segundo plano, no modo interativo e alocado a um TTY;
• --name: define o nome do container;
• --hostname: define o nome de máquina do container.
Uma vez conectado ao container, verifique o nome da máquina e as configurações de rede:
1 hostname
2 ip a
3 exit
Para exibir logs de um container em execução, digite o comando:
1 docker container logs servidor-debian
Pare a execução de um container, através da opção stop:
1 docker container stop servidor-debian
Para remover apenas o container em execução e conservar a imagem base, execute:
1 docker container rm -f servidor-debian
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
68 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
Descrição dos comandos
• docker logs ou docker container logs: exibe logs de um container em execução.
• docker rm ou docker container rm: remove um container em execução.
Outros comandos do Docker: - docker stop ou docker container stop: para a execução de
um container; - docker start ou docker container start: inicia a execução de um container;
- docker rename ou docker container rename: renomeia um container.
Gerenciar Logging Drivers
Conceito
O Docker inclui vários mecanismos de registro para ajudá-lo a obter informações da execução
de containers e serviços. Esses mecanismos são chamados de drivers de log ou drivers de
registro.
Cada daemon do Docker, possui um driver de registro padrão que cada container usa, a menos
que você o configure para usar um driver de registro diferente.
Configurar o driver de log para um container
Ao iniciar um container, você pode configurá-lo para usar um driver de registro, diferente do
padrão do daemon do Docker, usando a flag --log-driver. Por exemplo:
1 docker container run -it --log-driver json-file debian
O driver padrão é json-file e os logs do container ficam disponíveis no diretório
/var/lib/docker/containers/container_id/container_id-json.log.
Log padrão
Para configurar o daemon do Docker como padrãopara um driver de registro específico, defina
o valor do driver de log como o nome do driver de registro no arquivo daemon.json, localizado
no diretório /etc/docker/ nos hosts do Linux, ou então em C:\ProgramData\docker\config\ em
hosts de servidores Windows.
Vale lembrar que o driver de registro padrão é o arquivo json-file.
Drivers de registro suportados
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
69 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
• none: nenhum log está disponível para o container e os logs do Docker não retornam
nenhuma saída;
• json-file: os logs são formatados em formato JSON e é o driver de log padrão do
Docker;
• syslog: grava mensagens de registro no recurso de syslog. O daemon syslog deve estar
em execução na máquina host;
• journald: grava mensagens de log no journald. O daemon journald deve estar em
execução na máquina host;
• gelf: grava mensagens de log em um endpoint GELF (Graylog Extended Log Format),
como Graylog ou Logstash;
• fluentd: escreve mensagens de log para fluentd (entrada direta). O daemon fluentd
deve estar em execução na máquina host;
• awslogs: grava mensagens de log nos registros do Amazon CloudWatch;
• splunk: grava mensagens de log em splunk, usando o coletor de eventos HTTP;
• etwlogs: grava mensagens de log como eventos de rastreamento para Windows (ETW).
Este comando está disponível apenas nas plataformas Windows;
• gcplogs: grava mensagens de log no registros do Google Cloud Platform (GCP);
• logentries: grava mensagens de log no Rapid7 Logentries.
LAB 1.4 – Alterar log padrão no Docker
Neste laboratório vamos aprender como gerenciar os logs dos containers no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
Visualize o driver padrão, através do seguinte comando:
1 docker info --format ’{{.LoggingDriver}}’
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
70 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
1 json-file
Syslog
Em seguida, visualize o arquivo modelo daemon.json que configura o driver syslog:
1 sudo cat /opt/daemon.json
Resultado do comando:
1 {
2 "log-driver": "syslog"
3 }
Copie o arquivo daemon.json para o subdiretório /etc/docker e reinicie o serviço do Docker:
1 sudo cp /opt/daemon.json /etc/docker/
2 sudo systemctl restart docker
Para testar, execute um container utilizando a imagem httpd:
1 docker container run -dit --name webserver --hostname webserver httpd
Para acompanhar os logs criados pelo container, visualize o conteúdo do arquivo syslog:
1 sudo tail /var/log/messages
Resultado do comando:
1 May 11 10:50:15 manager 66f3d012b14c[3266]: AH00558: httpd: Could not reliably
determine the server’s fully qualified domain name, using 172.17.0.2. Set
the ’ServerName’ directive globally to suppress this message
2 May 11 10:50:15 manager 66f3d012b14c[3266]: AH00558: httpd: Could not reliably
determine the server’s fully qualified domain name, using 172.17.0.2. Set
the ’ServerName’ directive globally to suppress this message
3 May 11 10:50:15 manager 66f3d012b14c[3266]: [Mon May 11 13:50:15.666633 2020] [
mpm_event:notice] [pid 1:tid 140425979872384] AH00489: Apache/2.4.43 (Unix)
configured -- resuming normal operations
4 May 11 10:50:15 manager 66f3d012b14c[3266]: [Mon May 11 13:50:15.683470 2020] [
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
71 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
core:no
Em distribuições baseadas no Debian, o arquivo possui o nome syslog. Exemplo:
1 sudo tail /var/log/syslog
Feito os testes, remova o container webserver:
1 docker container rm -f webserver
Tenha cuidado ao utilizar a flag -f do comando docker container rm, pois esta flag
remove o container sem nenhuma confirmação.
Journald
Para testar o logging do driver journald, execute um container através do seguinte comando:
1 docker container run -dit --log-driver=journald --name webserver --hostname
webserver httpd
Para acompanhar os logs criados pelo container, execute o comando docker logs:
1 docker logs webserver
Resultado do comando:
1 AH00558: httpd: Could not reliably determine the server’s fully qualified domain
name, using 172.17.0.2. Set the ’ServerName’ directive globally to suppress
this message
2 AH00558: httpd: Could not reliably determine the server’s fully qualified domain
name, using 172.17.0.2. Set the ’ServerName’ directive globally to suppress
this message
3 [Mon May 11 14:01:22.819428 2020] [mpm_event:notice] [pid 1:tid 140679525840000]
AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations
4 [Mon May 11 14:01:22.819558 2020] [core:notice] [pid 1:tid 140679525840000]
AH00094: Command line: ’httpd -D FOREGROUND’
é possível acompanhar os logs, através do comando journalctl:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
72 2. INTRODUÇÃO E INSTALAÇÃO DO DOCKER
1 sudo journalctl --output=cat CONTAINER_NAME=webserver
Resultado do comando:
1 AH00558: httpd: Could not reliably determine the server’s fully qualified domain
2 AH00558: httpd: Could not reliably determine the server’s fully qualified domain
3 [Mon May 11 14:01:22.819428 2020] [mpm_event:notice] [pid 1:tid 140679525840000]
4 [Mon May 11 14:01:22.819558 2020] [core:notice] [pid 1:tid 140679525840000] AH00
5 lines 1-4/4 (END)
Tecle CTRL + C para destravar o terminal.
Feitos os testes, remova o container webserver:
1 docker container rm -f webserver
A seguir, vamos entender como funcionam as imagens no Docker.
Links
[1] Netclass 4Linux: http://netclass.4linux.com.br/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
3
Gerenciar imagens no Docker
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Installation and Configuration (15% of exam);
DCA (Docker Certified Associate) Image Creation Management, and Registry
(20% of exam);
LPI DevOps Tools Engineer Container Usage (weight: 7)
Introdução à imagens no Docker
Conceito
Uma imagem Docker contém o que é necessário para que uma aplicação seja executada. Ao
executar o comando docker container run, estamos na verdade executando uma camada da
imagem e a aplicação com suas variáveis de ambientes, bibliotecas e seu código.
Podemos concluir que um container é uma instância em tempo de execução de uma imagem.
Sendo assim, podemos resumir que uma imagem é um container que ainda não está em
execução.
73
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
74 3. GERENCIAR IMAGENS NO DOCKER
Camadas em uma Imagem Docker
As imagens do Docker possuem várias camadas somente leitura e que não podem ser modifi-
cadas. Você pode criar novas imagens a partir de imagens existentes, mas não pode modificá-
las. Vários containers são geralmente baseados na mesma imagem, portanto, você pode usar
essa imagem e gerar centenas ou milhares de containers.
Quando uma imagem é instanciada ou executada como um container, uma camada gravável
superior é criada. Em seguida, essa camada gravável superior é realmente excluída quando o
container é removido. O Docker faz isso, usando drivers de armazenamento para gerenciar o
conteúdo das camadas de imagem e a camada superior gravável.
Fonte: https://docs.docker.com/storage/storagedriver/
Fig. 3.1: Imagem para Representar as Camadas de uma Imagem
Ao baixar uma imagem base do Docker, podemos adicionar a ela diversas camadas de leitura
antes da camada de gravação. Exemplo:
1. Vou baixar uma imagem base do Debian e adicionar uma aplicação como, por exemplo,
um editor de textos;
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
75 3. GERENCIAR IMAGENS NO DOCKER
2. À partir dessa alteração, crio uma nova imagem que vai conter as camadas Debian (Base
Image) e o editor de texto emacs (Image);
3. Baixo uma imagem com a base do Debian + oeditor de textos e adiciono nela uma
segunda aplicação como, por exemplo, um servidor Apache;
4. A partir dessa alteração, crio uma nova imagem que vai conter as camadas Debian (Base
Image), o editor de textos emacs (Image) e o servidor Apache (Image);
5. Ao executar um container usando a imagem com as três camadas, a última camada será
de gravação, quando o container estiver em execução.
Containers e camadas de imagem
A principal diferença entre um container e uma imagem, é a camada gravável superior. Todas
as gravações no container que adicionam novos dados ou modificam dados existentes, são
armazenadas nessa camada gravável. Quando o container é excluído, a camada gravável
também é excluída. A imagem subjacente permanece inalterada.
Como cada container tem sua própria camada de container gravável e todas as alterações são
armazenadas nessa camada de container, vários containers podem compartilhar o acesso à
mesma imagem subjacente e ainda ter seu próprio estado único de dados. O diagrama abaixo
mostra vários containers compartilhando a mesma imagem do Ubuntu 15.04.
Fig. 3.2: Compartilhamento de Imagens entre Inúmeros containers
Fonte: https://docs.docker.com/storage/storagedriver/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
76 3. GERENCIAR IMAGENS NO DOCKER
Docker Hub
Conceito
O Docker Hub [1] é o maior repositório do mundo, com imagens de container e uma variedade
de fontes de conteúdo, incluindo desenvolvedores de comunidades de containers, projetos de
código aberto e fornecedores independentes de software (ISV – Independent Sofware Vendors),
além de distribuir seu código em containers.
Os usuários obtêm acesso a repositórios públicos gratuitos para armazenar e compartilhar
imagens, ou podem escolher o plano de assinatura para repositórios privados.
O Docker Hub é um recurso centralizado para trabalhar com o Docker e seus componentes.
Ele fornece os seguintes serviços:
• Hospedagem de imagens do Docker;
• Autenticação de usuário;
• Construções automáticas de imagens e ferramentas de fluxo de trabalho, como triggers
de construção e ganchos da web;
• Integração com GitHub e Bitbucket.
LAB 2.1 – Criar conta no Docker Hub
Neste laboratório vamos aprender como criar uma conta no Docker Hub.
Utilize sua máquina física para realizar este laboratório.
Acesse o endereço https://hub.docker.com/ e clique em Sign Up para criar uma conta:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
77 3. GERENCIAR IMAGENS NO DOCKER
Fig. 3.3: Docker Hub - Acesso ao Site
Após preencher seu ID, e-mail e senha, selecione o plano Community através do botão Continue.
Um e-mail sera enviado onde será preciso confirmar o cadastro através do botão Verify email
address.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
78 3. GERENCIAR IMAGENS NO DOCKER
Fig. 3.4: Docker Hub - Escolhendo Plano Community
Em seguida você será redirecionado para a tela de login. Informe seu ID e senha do Docker
Hub.
Fig. 3.5: Docker Hub - Login
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
79 3. GERENCIAR IMAGENS NO DOCKER
Parabéns, agora você possui uma conta gratuita no Docker Hub. Ainda neste capítulo vamos
aprender como enviar imagens do Docker para sua conta no Docker Hub.
Fig. 3.6: Docker Hub - Tela de Boas Vindas
Testar o acesso a sua conta do Docker Hub
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Para iniciar as máquinas virtuais, utilize o subcomando up do Vagrant:
1 vagrant up
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
Execute o comando para logar no Docker Hub:
1 docker login -u usuario_docker_hub <TECLE ENTER>
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
80 3. GERENCIAR IMAGENS NO DOCKER
Resultado do comando:
1 Password: digite_sua_senha
2 WARNING! Your password will be stored unencrypted in /home/suporte/.docker/
config.json.
3 Configure a credential helper to remove this warning. See
4 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
5
6 Login Succeeded
Verifique se um arquivo de autorização foi criado:
1 cat .docker/config.json
Resultado do comando:
1 {
2 "auths": {
3 "https://index.docker.io/v1/": {
4 "auth": "c2VuaGFtdWl0b2RpZmljaWw="
5 },
6 },
7 "HttpHeaders": {
8 "User-Agent": "Docker-Client/19.03.11 (linux)"
9 }
10 }
Para encerrar o login da conta do Docker Hub, execute o comando:
1 docker logout
Resultado do Comando:
1 Removing login credentials for https://index.docker.io/v1/
Descrição dos comandos
• docker login: permite logar em uma conta no repositório Docker, sendo ele local ou
remoto;
• docker logout: permite encerrar o login em uma conta no repositório Docker, sendo ele
local ou remoto.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
81 3. GERENCIAR IMAGENS NO DOCKER
LAB 2.2 – Gerenciamento de imagens no Docker
Neste laboratório vamos aprender como gerenciar imagens no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
Comandos iniciais
Liste as imagens e verifique o histórico de comandos utilizados para sua construção:
1 docker image ls
2 docker image history debian
Para inspecionar uma imagem, utilizamos o comando:
1 docker image inspect debian
Antes de criar uma nova imagem, execute o seguinte:
1 docker container run -dit --name servidor-debian debian
2 docker container exec servidor-debian apt-get update
3 docker container exec servidor-debian apt-get install apache2 -y
Para criar uma nova imagem a partir das alterações feitas em um container, execute os
seguintes comandos:
1 docker commit servidor-debian servidor-web
2 docker image ls
Para inspecionar a nova imagem criada a partir do container em execução:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
82 3. GERENCIAR IMAGENS NO DOCKER
1 docker image inspect servidor-web
Descrição dos comandos
• docker image ls: lista imagens do Docker armazenadas localmente;
• docker inspect: exibe informações detalhadas de um container ou imagem;
• docker container exec: executa um comando em um container em execução.
Backup e restauração de Imagens
Salve a imagem servidor-web que inclui o Apache em um arquivo em formato .tar:
1 docker image save servidor-web -o imagem-servidor-web.tar
2 du -sh imagem-servidor-web.tar
Remova o container servidor-debian e a imagem servidor-web:
1 docker container rm -f servidor-debian
2 docker image rm -f servidor-web
3 docker image ls
Para remover imagens não utilizadas, execute o seguinte comando:
1 docker image prune
Resultado do comando:
1 Are you sure you want to continue? [y/N] y
2 Total reclaimed space: 0B
Carregue a imagem servidor-web a partir do arquivo .tar, e inicie o container servidor-web
utilizando a nova imagem:
1 docker image load -i imagem-servidor-web.tar
2 docker image ls
Execute o container com a imagem restaurada:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
83 3. GERENCIAR IMAGENS NO DOCKER
1 docker container run -dit --name=servidor-web --hostname=servidor-web servidor-
web
2 docker container ls
Para terminar o laboratório, remova o container servidor-web:
1 docker container rm -f servidor-web
Descrição dos comandos
• docker commit: cria uma imagem, a partir de alterações realizadas em um container.
• docker image save: salva uma ou mais imagens em um arquivo .tar.
• docker image rm: remove uma imagem (a opção -f força a remoção).
• docker image prune: remove imagens não utilizadas.
• docker image load: carrega uma imagem do Docker, a partir de um arquivo .tar.
Dockerfile
Conceito
O Docker pode criar imagens automaticamente, lendo as instruções de um Dockerfile, que é
um documento de texto que contém todos os comandos que um usuário pode chamar na linhade comando para montar uma imagem.
O arquivo Dockerfile, não faz distinção entre letras maiúsculas e minúsculas. No entanto, a
convenção é que elas sejam MAIÚSCULAS para distingui-las dos argumentos mais facilmente.
O Docker executa instruções em um Dockerfile em ordem. Um Dockerfile deve começar com
uma instrução FROM. A instrução FROM especifica a imagem base, a partir da qual você está
construindo e só pode ser precedido por uma ou mais instruções ARG, que declaram argumentos
que são usados em linhas FROM no Dockerfile.
O Docker trata as linhas que começam com # como um comentário, a menos que a linha seja
uma diretiva de analisador válida. Um marcador # em qualquer outro lugar de uma linha é
tratado como um argumento.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
84 3. GERENCIAR IMAGENS NO DOCKER
Instruções do Dockerfile
FROM
A instrução FROM define o estágio inicial de compilação da imagem. Devemos sempre iniciar
o arquivo Dockerfile com essa instrução, permitindo assim a execução das instruções subse-
quentes.
COPY
A instrução COPY, copia novos arquivos ou diretórios de origem e os adiciona ao sistema de
arquivos do container no caminho de destino.
RUN
A instrução RUN, permite executar comandos em uma nova camada na parte superior da
imagem. Essa nova camada será usada para a próxima etapa no Dockerfile.
EXPOSE
A instrução EXPOSE, define quais são as portas de rede que o container irá monitorar em tempo
de execução. Podemos especificar portas com protocolo UDP e TCP, sendo esse o padrão
no Dockerfile. Vale lembrar que essa instrução não é usada para publicar a porta e sim para
informar qual porta pode ser publicada.
Para definir a porta que o container irá monitorar em tempo de execução, usamos o comando
docker container run.
CMD
A instrução CMD, executa um comando no container quando o mesmo for iniciado, mas também
permite definir argumentos para a instrução ENTRYPOINT. Quando definimos mais de uma
instrução CMD, somente a última será considerada.
Podemos converter a instrução CMD para um parâmetro passado ao final do comando docker
container run.
Exemplo com Dockerfile:
1 FROM debian:latest
2 CMD ["/bin/ping", "localhost"]
Convertendo para docker container run:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
85 3. GERENCIAR IMAGENS NO DOCKER
1 docker run -it imagem /bin/ping localhost
ENTRYPOINT
A instrução ENTRYPOINT, permite especificar o comando que sempre será executado no container
quando este for iniciado.
Exemplo com Dockerfile:
1 FROM debian:latest
2 ENTRYPOINT ["/bin/ping"]
3 CMD ["localhost"]
Convertendo para docker container run:
1 docker run -it imagem /bin/ping localhost
LAB 2.3 – Criar imagem no Docker com Dockerfile
Neste laboratório vamos realizar as seguintes tarefas:
1. Criar uma imagem para um servidor web do WordPress através das instruções do arquivo
Dockerfile.
2. Criar uma imagem para o banco de dados WordPress através do comando docker commit.
3. Rodar a aplicação WordPress utilizando as duas imagens criadas.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
86 3. GERENCIAR IMAGENS NO DOCKER
Imagem webserver-wordpress
Acesse o diretório webserver e visualize o conteúdo do arquivo Dockerfile:
1 cd webserver
2 ls
1 cat Dockerfile
Resultado do comando:
1 FROM debian:9
2 COPY sources.list /etc/apt/sources.list
3 RUN apt update && apt install apache2 php libapache2-mod-php php-mysql php-curl
php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip php-cli -y
4 COPY wordpress.conf /etc/apache2/sites-available/wordpress.conf
5 RUN a2enmod rewrite
6 COPY wordpress /var/www/html/wordpress
7 RUN chown -R www-data:www-data /var/www/html/wordpress
8 EXPOSE 80
9 CMD ["apachectl", "-D", "FOREGROUND"]
Instruções do Dockerfile
• FROM: define o nome da imagem base com uma tag, utilizada para criação de uma nova
imagem no Docker;
• ENV: define uma variável de ambiente, utilizada durante a construção da nova imagem;
• COPY: define a cópia de novos arquivos ou diretórios da máquina local para o sistema de
arquivos da nova imagem;
• RUN: define a execução de comandos em uma nova camada em cima da imagem atual.
• EXPOSE: informa ao Docker, que o container escuta em uma determinada porta de rede
em tempo de execução;
• CMD: define um comando que será executado no momento da execução do container;
Construa a imagem dexter-intranet, através do subcomando build:
1 docker image build -t webserver-wordpress .
O comando docker image build permite construir uma imagem do Docker, a partir de um
arquivo Dockerfile.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
87 3. GERENCIAR IMAGENS NO DOCKER
Para montar um volume utilize a instrução VOLUME. Exemplo: VOLUME /meuvolume. É
considerado boas práticas não combinar vários aplicativos em um único contêiner.
Verifique se a nova imagem consta na lista:
1 docker image ls
A partir da nova imagem, execute o container wordpress na porta 80:
1 docker container run -d --name=wordpress -p 0.0.0.0:80:80 webserver-wordpress
Verifique se o container está em execução na porta e ao final, remova o container.
1 docker container ls
2 docker port wordpress
3 docker container rm -f wordpress
Descrição dos comandos
• docker container run -p: permite mapear uma porta do container no host hospedeiro;
• docker container port: lista mapeamentos de portas de um container.
Imagem banco-wordpress
Antes de criar a imagem do banco de dados, acesse a HOME do usuário suporte:
1 cd
Execute o container para o servidor de banco de dados MySQL:
1 docker container run -d -e ’MYSQL_ROOT_PASSWORD=4linux’ -v "$PWD/banco":/var/lib
/mysql --name=dbserver -p 0.0.0.0:3306:3306 mysql:5.7.22
Descrição dos comandos
• docker run -v /volume:/volume: permite criar e mapear um novo volume, no momento
da execução de um container.
• docker container exec: permite executar um comando diretamente em um container.
• -e ou --env: define variáveis de ambiente na execução do container. A variável MYSQL_ROOT_PASSWORD
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
88 3. GERENCIAR IMAGENS NO DOCKER
define a senha do usuário root no MySQL.
Acesse o container dbserver, através do comando docker container exec:
1 docker container exec -it dbserver /bin/bash
Ao acessar o container, logue no prompt do servidor MySQL:
1 mysql -u root -p4linux
Crie o banco de dados chamado wordpress, através do seguinte comando:
1 CREATE DATABASE wordpress;
Defina as permissões de acesso ao banco wordpress e ao usuário wordpressuser:
1 GRANT ALL PRIVILEGES ON wordpress.* TO ’wordpressuser’@’%’ IDENTIFIED BY ’4linux
’;
Atualize os privilégios e abandone o prompt do MySQL:
1 FLUSH PRIVILEGES;
2 EXIT
Desconecte do container e verifique se o diretório banco possui os arquivos do MySQL:
1 CTRL + D
2 ls banco
Salve as alterações do container dbserver em uma nova imagem:
1 docker commit dbserver banco-wordpress
2 docker image ls
Para terminar, remova a execução do container dbserver:
1 docker container rm -f dbserver
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
89 3. GERENCIAR IMAGENS NO DOCKER
Executar uma aplicação WordPress com Docker
Execute o container para o servidor de banco de dados MySQL, usando a imagem criada:
1 docker container run -d -e MYSQL_ROOT_PASSWORD=4linux -v "$PWD/banco":/var/lib/
mysql --name=dbserver -p 0.0.0.0:3306:3306 banco-wordpress
Execute o container para o servidor de web na porta 80:
1 docker container run -d --name=wordpress --link dbserver:dbserver -p
0.0.0.0:80:80 webserver-wordpress
Verifique se os containers estão em execução:
1 docker container ls
Acesse o endereço http://172.16.0.100/wordpress e realize a instalação do WordPress:
Fig. 3.7: WordPress - Tela de Instalação
E
rik Henrique P
inheiro / erikpinheiro@
gm
ail.com
90 3. GERENCIAR IMAGENS NO DOCKER
Fig. 3.8: WordPress - Configuração do Usuário
Logue com o usuário suporte e a senha definida durante a instalação:
Fig. 3.9: WordPress - Tela de Login
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
91 3. GERENCIAR IMAGENS NO DOCKER
Altere o tema do WordPress, conforme o exemplo apresentado:
Fig. 3.10: WordPress - Dashboard de Temas
Acesse o endereço http://172.16.0.100/wordpress para testar as alterações:
Fig. 3.11: WordPress - Página Inicial do Site
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
92 3. GERENCIAR IMAGENS NO DOCKER
Para terminar, remova a execução dos containers do WordPress:
1 docker container rm -f wordpress dbserver
LAB 2.4 – Enviar imagens ao Docker Hub
Neste laboratório vamos aprender como enviar as duas imagens que utilizamos para executar
a aplicação WordPress, para nossa conta no Docker Hub.
Acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a conta
do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
Execute o comando para logar no Docker Hub:
1 docker login -u usuario_docker_hub <TECLE ENTER>
Resultado do comando:
1 Password: digite a senha
Liste as imagens que estão disponíveis no Docker:
1 docker image ls
Defina uma tag para a imagem webserver-wordpress, e envie a mesma para o Docker Hub:
1 docker tag webserver-wordpress <usuario_docker_hub>/webserver-wordpress
2 docker push usuario_docker_hub/webserver-wordpress
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
93 3. GERENCIAR IMAGENS NO DOCKER
Uma tag é um alias do ID de uma imagem. Através das tag adicionamos informações
nas imagens, tais como versões, ambiente de desenvolvimento etc.
Exemplo de uma tag para versão 2.0 de uma imagem:
1 docker tag imagem imagem:2.0
Exemplo de uma tag para ambiente de desenvolvimento para a imagem:
1 docker tag imagem imagem:dev
Defina uma tag para a imagem banco-wordpress e envie a mesma para o Docker Hub:
1 docker tag banco-wordpress <usuario_docker_hub>/banco-wordpress
2 docker push <usuario_docker_hub>/banco-wordpress
Confirme em sua conta do Docker Hub o upload das imagens webserver-wordpress e banco-
wordpress.
Fig. 3.12: Docker Hub - Listagem das Imagens na Plataforma
Links
[1] Docker Hub: https://docs.docker.com/docker-hub/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
4
Gerenciar volumes no Docker
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Storage and Volumes (10% of exam)
LPI DevOps Tools Engineer Container Usage (weight: 7)
LPI DevOps Tools Engineer Container Infrastructure (weight: 4)
Introdução aos volumes Docker
Conceito
O volume [1] é um diretório especialmente designado, seja em um ou mais containers que
ultrapassam o sistema de arquivos da Union.
Volumes são projetados para manter os dados, independentemente do ciclo de vida do con-
tainer. O Docker, portanto, nunca exclui volumes automaticamente quando um container é
removido.
Existem três tipos de volumes: host, anônimo e nomeado:
• host: um volume do host reside no sistema de arquivos do host do Docker e pode ser
94
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
95 4. GERENCIAR VOLUMES NO DOCKER
acessado de dentro do container;
• nomeado: um volume nomeado é um volume no qual o Docker gerencia no disco, o
volume é criado, mas recebe um nome;
• anônimo: um volume anônimo é semelhante a um volume nomeado, no entanto, pode
ser difícil referir-se ao mesmo volume ao longo do tempo, quando se trata de volumes
anônimos.
Volumes x Bind
Vantagens de um volume sobre montagens Bind:
• Volumes são mais fáceis de fazer backup ou migrar do que montagens de ligação;
• Você pode gerenciar volumes, usando os comandos do Docker CLI (linha de comando)
ou na API do Docker;
• Os volumes funcionam nos containers do Linux e do Windows;
• Volumes podem ser compartilhados com mais segurança entre vários containers;
• Os drivers de volume, permitem armazenar volumes em hosts remotos ou provedores de
nuvem, criptografar o conteúdo de volumes ou adicionar outras funcionalidades;
• Novos volumes podem ter seu conteúdo pré-preenchido por um container.
Além disso, os volumes costumam ser uma opção melhor do que manter dados persistentes na
camada gravável de um container, porque um volume não aumenta o tamanho dos containers
que estes utilizam e o conteúdo do volume existe fora do ciclo de vida de um determinado
container.
Se o seu container gerar dados de estado não persistente, considere então usar uma montagem
tmpfs para evitar o armazenamento permanente dos dados e aumentar o desempenho do
container, evitando gravar na camada gravável do container.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
96 4. GERENCIAR VOLUMES NO DOCKER
Armazenamento compartilhado
Fig. 4.1: Exemplo de Estrutura para Armazenamento Compartilhamento
Ao criar aplicativos tolerantes à falha, você pode precisar configurar várias réplicas do mesmo
serviço para ter acesso aos mesmos arquivos.
Existem várias maneiras de conseguir isso ao desenvolver seus aplicativos. Uma delas, é
adicionar lógica ao seu aplicativo, para armazenar arquivos em um sistema de armazenamento
de objetos em nuvem, como o Amazon S3. A outra é criar volumes com um driver que suporte
a gravação de arquivos em um sistema de armazenamento externo, como o NFS ou o Amazon
S3.
Os drivers de volume, permitem abstrair o sistema de armazenamento subjacente da lógica do
aplicativo. Por exemplo, se seus serviços usarem um volume com um driver NFS, você poderá
atualizar os serviços para usar um driver diferente, como um exemplo para armazenar dados
na nuvem, sem alterar a lógica do aplicativo.
Storage drivers
Idealmente, poucos dados são gravados na camada gravável de um container, sendo assim
é comum utilizar os volumes do Docker para gravar dados. No entanto, algumas cargas de
trabalho exigem que se grave na camada gravável do container. é aqui que entram os drivers
de armazenamento.
O Docker suporta vários drivers de armazenamento diferentes, usando uma arquitetura conec-
tável. O driver de armazenamento controla a forma como as imagens e os containers são
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
97 4. GERENCIAR VOLUMES NO DOCKER
armazenados e gerenciados no host do Docker. O Docker suporta os seguintes drivers de
armazenamento:
• overlay2: driver de armazenamento preferido para todas as distribuições Linux, atual-
mente suportadas e não requer configuração extra;
• aufs: driver de armazenamento preferido em versões superiores ao Docker 18.06 quando
executado no Ubuntu 14.04 no kernel 3.13, que não tem suporte para overlay2;
• devicemapper: é suportado, mas requer o direct-lvm para ambientes de produção, en-
quanto que no loopback-lvm, a configuração é zero, tem um desempenho muito ruim.
O devicemapper era o driver de armazenamento recomendado para o CentOS e o RHEL,
já que a versão do kernel não suportava o overlay2. No entanto, as versões atuais do
CentOS e do RHEL agora têm suporte para overlay2, que agora é o driver recomendado;
• btrfs e zfs: os drivers de armazenamento são usados se forem o sistema de arquivos
de suporte (o sistema de arquivos do host, no qual o Docker está instalado). Esses
sistemas de arquivos permitem opções avançadas, como a criação de “instantâneos”,
mas exigem mais manutenção e configuração. Cada um deles depende do sistema de
arquivos de apoio que está sendo configurado corretamente;
• vfs: o driver de armazenamento, destinado para fins de teste e para situações em
que nenhum sistema de arquivos copy-on-write (cópia em tempo de gravação) possa
ser usado. O desempenho desse driver de armazenamento é ruim e geralmente não é
recomendado para uso em produção.
Para visualizar qual é o Storage Driver que o Docker está utilizando,execute o seguinte
comando:
docker info | grep ’Storage Driver’
Avisos e recomendações
Quando você altera o driver de armazenamento, todas as imagens e containers existentes nele
ficam inacessíveis. Isso ocorre, porque suas camadas não podem ser usadas pelo novo driver de
armazenamento. Se você reverter suas alterações, poderá acessar as imagens e os containers
antigos novamente, mas qualquer novo container que você tenha obtido ou criado usando o
novo driver, ficará inacessível.
Cada driver de armazenamento, tem suas próprias características de desempenho que o tornam
mais ou menos adequados para diferentes cargas de trabalho.
Considere as seguintes generalizações:
• overlay2, aufs e overlay, todos operam no nível do arquivo e não no nível do bloco.
Isso usa a memória de forma mais eficiente, mas a camada gravável do container pode
crescer bastante em cargas de trabalho com muita gravação;
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
98 4. GERENCIAR VOLUMES NO DOCKER
• Os drivers de armazenamento no nível de bloco, como devicemapper, btrfs e zfs, têm
melhor desempenho para cargas de trabalho com capacidade de gravação (embora não
tão bem quanto os volumes do Docker);
• Para muitas gravações pequenas ou containers com muitas camadas ou sistemas de
arquivos profundos, o overlay pode ter melhor desempenho do que a overlay2, mas
consome mais inodes, o que pode levar à exaustão do inode.
• Os sistemas de arquivos btrfs e zfs requerem muita memória.
• O zfs é uma boa escolha para cargas de trabalho de alta densidade, como PaaS.
LAB 3.1 – Gerenciar volumes no Docker – Parte 1
Neste laboratório vamos aprender como mapear, criar e remover volumes no Docker.
Mapear volumes
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Para iniciar as máquinas virtuais, utilize o subcomando up do Vagrant:
1 vagrant up
Em seguida, acesse a máquina virtual Worker 01, através do vagrant ssh e alterne para a
conta do usuário suporte.
1 vagrant ssh worker01
2 sudo su - suporte
Volume do tipo host
Para mapear um volume no container com um diretório no host hospedeiro, use a flag -v do
comando docker run:
1 docker container run -di --name=servidor -h servidor -v /srv:/srv busybox
2 docker container exec servidor df -Th
Faça um teste copiando arquivos no host hospedeiro e verifique se o conteúdo é mapeado no
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
99 4. GERENCIAR VOLUMES NO DOCKER
volume do container:
1 docker container exec servidor ls /srv
2 sudo cp /etc/*.conf /srv
3 docker container exec servidor ls /srv
Remova a execução do container servidor para continuar os próximos comandos:
1 docker container rm -f servidor
Criar volumes com Docker
Volume do tipo não nomeado
Para criar um volume no container, use a flag -v do comando docker run:
1 docker container run -di --name=servidor -h servidor -v /volume busybox
2 docker container ls
Para exibir informações detalhadas sobre o volume, execute o seguinte comando:
1 docker container inspect servidor | grep volume
Veja que o Docker criou um hash representando o novo volume criado:
1 docker volume ls
2 docker volume inspect <hash>
Veja também no interior do container o volume criado, através do comando docker exec:
1 docker container exec servidor df -Th
2 docker container exec servidor ls volume
Copie arquivos no host hospedeiro, e verifique se o conteúdo é mapeado no volume:
1 docker volume ls
2 sudo cp /etc/*.conf /var/lib/docker/volumes/<hash>/_data
3 docker container exec servidor ls volume
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
100 4. GERENCIAR VOLUMES NO DOCKER
Usar volume de outro container
Para utilizar um volume existente de outro container, use a opção --volumes-from quando
executar um novo container:
1 docker container run -di --name=cliente -h cliente --volumes-from servidor
busybox
Verifique se, no novo container, o volume mapeado está montado e com conteúdo:
1 docker container exec cliente df -Th
2 docker container exec cliente ls volume
3 docker container rm -f cliente
Remover volumes
Remova a execução de qualquer container servidor, para continuar os próximos comandos:
1 docker container rm -f servidor
Para remover um volume no Docker, usamos a opção rm, conforme o exemplo abaixo:
1 docker volume ls
2 docker volume rm <hash>
3 docker volume ls
Para remover volume não utilizados, execute o seguinte comando:
1 docker volume prune
Resultado do comando:
1 WARNING! This will remove all local volumes not used by at least one container
.
2 Are you sure you want to continue? [y/N] y
3 Total reclaimed space: 0B
Descrição dos comandos
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
101 4. GERENCIAR VOLUMES NO DOCKER
• docker run -v /volume:/volume: permite criar e mapear um novo volume, no momento
da execução de um container;
• docker container exec: permite executar um comando, diretamente em um container.
• docker volume: permite gerenciar volumes no Docker;
• docker volume ls: lista os volumes disponíveis no Docker;
• docker volume inspect: exibe informações detalhadas sobre um ou mais volumes;
• docker volume rm: permite remover um volume disponível no Docker;
• docker volume prune: remove volumes não utilizados;
• docker run --volumes-from: permite mapear um volume que está sendo utilizado por
outro container.
LAB 3.2 – Gerenciar volumes no Docker – Parte 2
Neste laboratório vamos aprender como personalizar volumes, backup e restauração no Docker.
Criar volumes personalizados
Volume do tipo nomeado
Para criar um volume definindo o tipo, nome e tamanho, execute o comando a seguir:
1 docker volume create -d local --opt type=tmpfs --opt device=tmpfs --opt o=size
=1000m --name dexter-volume
2 docker volume ls
3 docker volume inspect dexter-volume
Use a flag -v, apontando o volume personalizado e o diretório mapeado no container:
1 docker container run -di --name=servidor -h servidor -v dexter-volume:/backup
busybox
2 docker container inspect servidor | grep volume
3 docker container exec servidor df -Th
Faça um teste copiando arquivos no host hospedeiro e verifique se o conteúdo é mapeado no
volume personalizado do container:
1 sudo cp /etc/*.conf /var/lib/docker/volumes/dexter-volume/_data
2 docker container exec servidor ls backup
Opções do comado docker volume create:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
102 4. GERENCIAR VOLUMES NO DOCKER
• -d: define qual será o driver utilizado para a criação do volume;
• --opt type: define o sistema de arquivos utilizado pelo volume;
• --opt device: define o dispositivo utilizado pelo volume; --opt size: define o tamanho
do volume;
• --name: define o nome do volume.
Realizar backup de volumes
Para realizar o backup de um volume existente, use a opção --volumes-from, conforme o
exemplo abaixo:
1 docker container run --rm --volumes-from servidor -v dexter-volume:/backup
busybox tar cvf /backup/backup.tar /backup
Verifique se o arquivo empacotado foi criado no diretório do volume e aproveite para listar seu
conteúdo:
1 sudo ls /var/lib/docker/volumes/dexter-volume/_data
2 sudo tar -tf /var/lib/docker/volumes/dexter-volume/_data/backup.tar
Backup de volumes
• No exemplo apresentando, o volume dexter-volume está montado a partir do container
servidor;
• O diretório de /var/lib/docker/volumes/dexter-volume/_data do host hospedeiro, é
montado como volume com o caminho (/backup) dentro do container servidor;
• O comando tar é executado dentro do container servidor no diretório /backup, e o arquivo
backup.tar é copiado para o mapeamento /backup (em /var/lib/docker/volumes/dexter
-volume/_data).
Realizar restauração de volumes
Antes de realizar a restauração, remova os arquivos .conf do diretório de volume:
1 sudo su -
2 rm -rf /var/lib/docker/volumes/dexter-volume/_data/*.conf
3 ls /var/lib/docker/volumes/dexter-volume/_data/
4 exit
Para realizar a restauração de um volume existente, use a opção --volumes-from, conformeo
exemplo a seguir:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
103 4. GERENCIAR VOLUMES NO DOCKER
1 docker container run --rm --volumes-from servidor -v dexter-volume:/backup
busybox tar xvf /backup/backup.tar
2 sudo ls /var/lib/docker/volumes/dexter-volume/_data/
Remova a execução do container servidor, para terminar o laboratórios:
1 docker container rm -f servidor
Restauração de volumes
• No exemplo apresentando, o volume dexter-volume está montado a partir do container
servidor;
• O diretório /var/lib/docker/volumes/dexter-volume/_data do host hospedeiro, é mon-
tado como volume com o caminho (/backup) dentro do container servidor;
• Dentro do container servidor o comando tar está sendo executado no arquivo /backup/
backup.tar e o seu conteúdo será extraído para no diretório /var/lib/docker/volumes/
dexter-volume/_data, que é montado pelo volume dexter-volume.
Introdução aos pontos de montagem Bind
Conceito
Os pontos de montagem Bind (ou Bind Mounts) [2] têm funcionalidade limitada em compara-
ção com volumes. Quando você usa um Bind Mount, um arquivo ou diretório na máquina host
é montado em um container. O arquivo ou diretório é referenciado por seu caminho completo
ou relativo na máquina host.
Por outro lado, quando você usa um volume, um novo diretório é criado no diretório de
armazenamento do Docker na máquina host e o Docker gerencia o conteúdo desse diretório.
Os Bind Mounts são muito eficientes, mas dependem do sistema de arquivos da máquina host,
que possui uma estrutura de diretórios específica disponível. Se você estiver desenvolvendo
novos aplicativos Docker, considere o uso de volumes nomeados. Você não pode usar os
comandos do Docker CLI para gerenciar diretamente os Bind Mounts.
Uso de flags:
Originalmente, a flag -v ou --volume, era usada para containers independentes e a flag --
mount era usado para serviços do Swarm. No entanto, a partir da versão Docker 17.06,
você também pode usar --mount com containers independentes. Em geral, o --mount é mais
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
104 4. GERENCIAR VOLUMES NO DOCKER
explícito e detalhado.
A maior diferença é que a sintaxe -v combina todas as opções juntas em um único campo,
enquanto a sintaxe --mount, as separa.
Diferenças entre as flags:
• -v ou --volume: consiste em três campos, separados por caracteres de dois pontos (:
). Os campos devem estar na ordem correta e o significado de cada campo não é
imediatamente óbvio;
– No caso de Bind Mounts, o primeiro campo é o caminho para o arquivo ou diretório
na máquina host. O segundo campo é o caminho onde o arquivo ou diretório é
montado no container. O terceiro campo é opcional e é uma lista separada por
vírgulas de opções, como ro, consistent, delegated, cached, z e Z.
• --mount: consiste em vários pares de valores-chave separados por vírgulas e cada um
consistindo em uma tupla <key> = <value>. A sintaxe --mount é mais detalhada do que
-v ou --volume, mas a ordem das chaves não é significativa e o valor do sinalizador é
mais fácil de entender.
LAB 3.3 – Gerenciar Bind Mounts no Docker
Neste laboratório vamos aprender como gerenciar Bind Mounts no Docker.
Executar contêiner usando Bind Mounts
Crie e acesse o subdiretório /tmp/target:
1 mkdir /tmp/target
2 cd /tmp
Para realizar o mapeamento no diretório na pasta /volumes2, execute os comandos:
1 docker container run -di --name=servidor -h servidor --mount type=bind,source=
$PWD/target,target=/volumes2 busybox
Realize a inspeção do container para identificar o mapeamento feito:
1 docker container inspect servidor | grep Mounts -A 5
Remova a execução do container servidor, antes de continuar com os próximos comandos:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
105 4. GERENCIAR VOLUMES NO DOCKER
1 docker container rm -f servidor
Uso de pontos de montagem somente leitura
Para realizar o mapeamento somente leitura, execute os comandos:
1 docker container run -di --name=servidor -h servidor --mount type=bind,source=
$PWD/target,target=/volumes2,readonly busybox
Tente copiar algum arquivo para o diretório /tmp/target
1 docker container exec -it servidor cp /etc/hosts /volumes2
Resultado do comando:
1 cp: can’t create ’/volumes2/hosts’: Read-only file system
Realize a inspeção do container para identificar o mapeamento feito:
1 docker container inspect servidor | grep Mounts -A 5
Remova a execução do container servidor, antes de continuar com os próximos comandos:
1 docker container rm -f servidor
Montagem em um diretório ocupado no contêiner
Para realizar o mapeamento diretamente no container emum diretório que já possua arquivos,
como por exemplo o diretório de sistema /etc, execute os comandos:
1 docker container run -di --name=servidor -h servidor --mount type=bind,source=
$PWD/target,target=/etc busybox
Liste o conteúdo da pasta target para visualizar os arquivos:
1 ls target
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
106 4. GERENCIAR VOLUMES NO DOCKER
Para terminar remova a execução do container servidor:
1 docker container rm -f servidor
Descrição das opções
• A flag --mount consiste em vários pares de valores-chave, separados por vírgulas e cada
um consistindo em uma tupla <key> = <value>. A sintaxe --mount é mais detalhada do
que -v ou --volume, mas a ordem das chaves não é significativa e o valor do sinalizador
é mais fácil de entender;
• A opção type pode ser bind, volume ou tmpfs;
• A opção source define o caminho para o arquivo ou diretório no host do daemon e do
Docker. Pode ser especificado como source ou src;
• A opção target recebe como valor o caminho em que o arquivo ou diretório está montado
no container;
• A opção readonly se estiver presente, faz com que a montagem de ligação seja montada
no container em formato somente leitura.
Introdução aos plugins de volume
Conceito
Plugins ampliam a funcionalidade do Docker [3]. Eles possuem tipos específicos. Por exemplo,
um plugin de volume pode permitir que os volumes do Docker persistam em vários hosts do
Docker, e um plugin de rede pode criar redes virtuais em um cluster e assim por diante.
Atualmente, o Docker suporta plugins de autorização, volume e driver de rede. No futuro,
esperamos que exista suporte para plugins adicionais.
Você também pode estender as capacidades do Docker Engine, carregando plugins de terceiros.
Os tipos de plugins disponíveis no Docker são:
• Volume: permite persistir volumes em vários hosts;
• Rede: permite o gerenciamento avançado de redes;
• Autenticação: gerenciamento de acesso de usuários;
• Logs: permite o gerenciamento avançado de logs.
Plugins de volume
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
107 4. GERENCIAR VOLUMES NO DOCKER
Plugin Descrição
Hedvig Docker O plugin de volume Hedvig Docker permite
que os usuários provisionem
armazenamento portátil persistente usando
a Plataforma de armazenamento distribuído
Hedvig;
vSphere Storage for Docker O vSphere Storage for Docker permite
executar aplicativos stateful em contêiner
no VMware vSphere;
Pure Storage Docker Volume Plugin Permite executar aplicativos stateful em
contêiner no FlashArray e FlashBlade;
HPE Nimble Storage Volume Plugin
for Docker
Fornece uma gama de serviços de dados
avançados que estão disponíveis no seu
array Nimble Storage;
Blockbridge Volume Plugin for Swarm Integra o Docker ao armazenamento
elástico Blockbridge usando a API do v2
Docker Plugin. O plugin fornece acesso ao
armazenamento de alto desempenho com
recursos avançados de segurança,
mobilidade, backup e restauração;
HPE 3PAR Volume Plug-in for Docker Plugin de volume HPE 3PAR para Docker
3.2 Adiciona suporte para operações –
Compartilhamento de arquivo (criação/-
montagem/desmontagem/exclusão de
compartilhamento NFS) com base nos
recursos de Persona de arquivo do 3PAR;
DataCore SDS Docker Volume Plugin O plugin de volume do DataCore SDS
Docker está disponível gratuitamente para
uso com nós licenciados do DataCore SDS;
Nutanix DVP O Nutanix DockerVolume Plugin (DVP)
permite que os Docker Containers usem o
armazenamento persistente. O Acropolis
Container Services (ACS) fornece um
plugin de volume de armazenamento que
permite que as implantações do Docker
sejam integradas aos sistemas de
armazenamento externo da Nutanix;
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
108 4. GERENCIAR VOLUMES NO DOCKER
Plugin Descrição
Veritas Docker Volume Plugin V2 O Veritas HyperScale for Containers é uma
solução de gerenciamento de
armazenamento definido por software para
arquiteturas baseadas em contêineres que
alavanca o armazenamento anexado direto
(DAS) e fornece serviços de
armazenamento corporativos para
implantações robustas em escala de
produção, atendendo às necessidades de
desempenho e proteção de dados;
Trident from NetApp Fornece integração direta como o
ecossistema Docker e o armazenamento
Netapp;
Virtuozzo Storage Possui suporte para armazenamento
Virtuozzo em nuvem distribuídos, bem
como dispositivos Ploop;
HyperCloud Block Storage Volume
Plugin
Permite provisionamento e montagem
automatizados de dispositivos de bloco de
alto desempenho para fornecer
armazenamento persistente para
contêineres;
OSNEXUS Quantastor Docker Volume
Plugin
O Docker Volume Plugin para OSNEXUS
Quantastor facilita a criação e o
gerenciamento de contêineres Docker
persistentes usando APIs do Docker e
ferramentas de linha de comando para
aplicativos em contêiner e volumes de
armazenamento QuantaStor;
HPE Cloud Volumes Plugin for Docker Permite manipular facilmente todo o ciclo
de vida dos dados do armazenamento
persistente de seu contêiner no HPE Cloud
Volumes Block, seja na AWS, GCP ou
Azure.
StorageOS Plugin O plugin de volume StorageOS transforma
seu nó do Docker em uma plataforma de
armazenamento hiperconvergente. Cada nó
que executa o plugin StorageOS pode
contribuir com armazenamento local ou
anexado disponível em um pool distribuído,
que fica disponível para todos os membros
do cluster por meio de um espaço para
nome global.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
109 4. GERENCIAR VOLUMES NO DOCKER
Para obter mais informações sobre o plugins de volume, acesse o link abaixo:
https://hub.docker.com/search/?q=&type=plugin&category=volume
LAB 3.4 - Gerenciar volumes utilizando plugins
Neste laboratório vamos aprender como gerenciar volumes através de plugins no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse as máquinas virtuais VMs Worker 01 e Worker02, através do vagrant
ssh.
1 vagrant ssh worker01
1 vagrant ssh worker02
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
Instalação do plugin
Antes de gerenciar seus plugins, conheça as opções de comando disponíveis através do comando
docker plugin --help .
Instale o plugin vieux/sshfs, através do seguinte comando em ambas as máquinas virtuais:
1 docker plugin install --grant-all-permissions vieux/sshfs
Verifique se o plugin esta presente no servidor:
1 docker plugin ls
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
110 4. GERENCIAR VOLUMES NO DOCKER
1 ID NAME DESCRIPTION ENABLED
2 c370be71dcbb vieux/sshfs:latest sshFS plugin for Docker true
Se após a reinicialização ou desligamento do host o plugin estive desabilitado, como por
exemplo:
1 docker plugin ls
Resultado do comando:
1 ID NAME DESCRIPTION ENABLED
2 c370be71dcbb vieux/sshfs:latest sshFS plugin for Docker false
poderemos então habilitá-lo através do comando docker plugin enable nome_do_plugin. Ex-
emplo:
1 docker plugin enable vieux/sshfs
Criar um volume utilizando plugin
Acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Registry, através do vagrant ssh e alterne para a
conta do usuário suporte.
1 vagrant ssh registry
2 sudo su - suporte
Nas máquinas Worker 01 e 02, crie um volume com o nome volume_remote, utilizando o
plugin vieux/sshfs que vai mapear um diretório na máquina Registry:
1 docker volume create --driver vieux/sshfs -o sshcmd=suporte@registry:storage/
backup -o password=4linux volume_remoto
Nas máquinas Worker 01 e 02, liste e inspecione o volume criado:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
111 4. GERENCIAR VOLUMES NO DOCKER
1 docker volume ls | grep remoto
2 docker volume inspect volume_remoto
Na máquina Registry crie o diretório que será usado no mapeamento do volume:
1 mkdir -p storage/backup
Na máquina Worker 01, execute um container utilizando o volume criado:
1 docker container run -di --name=servidor -h servidor -v volume_remoto:/backup
busybox
2 docker container exec servidor df -Th
Na máquina Worker 02, execute um container utilizando o volume criado:
1 docker container run -di --name=servidor -h servidor -v volume_remoto:/backup
busybox
2 docker container exec servidor df -Th
Na máquina Worker 02, execute no container a cópia dos arquivos para o volume mapeado:
1 docker container exec servidor cp /etc/* /backup
2 docker container exec servidor ls /backup
Na máquina Worker 01, verifique se os arquivos estão presentes no volume mapeado:
1 docker container exec servidor ls /backup 2&> /dev/null
Na máquina Worker 01 e na Worker 02, remova o container e o volume criado:
1 docker container rm -f servidor
2 docker volume rm volume_remoto
Na máquina Registry, veja se os dados do volume estão presentes no diretório storage/backup:
1 ls storage/backup
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
112 4. GERENCIAR VOLUMES NO DOCKER
LAB 3.5 – Gerenciar volumes NFS
Neste laboratório vamos aprender como gerenciar volume NFS através de plugins no Docker.
A máquina virtual Registry possui um servidor NFS contendo os arquivos que vamos utilizar
em nosso website.
As máquinas virtuais Worker 01 e Worker 02 vão montar através de um volume, os arquivos
do servidor NFS no diretório /var/www/html no interior do container.
Para começar, acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540
Em seguida, acesse a máquina virtual Registry, através do vagrant ssh e alterne para a
conta do usuário suporte.
1 vagrant ssh registry
2 sudo su - suporte
Preparando o servidor NFS
Configure o compartilhamento do diretório storage no servidor NFS:
1 sudo vim /etc/exports
2 /home/suporte/storage/web_data 172.16.0.0/24(rw,no_root_squash)
Reinicie o servidor NFS para aplicar as configurações:
1 sudo systemctl restart nfs-kernel-server
Preparar o cliente NFS
Logue com o usuário suporte no servidor Worker 01 e instale o pacote do cliente NFS:
1 sudo yum install nfs-utils -y
Logue com o usuário suporte no servidor Worker 02 e instale o pacote do cliente NFS:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
113 4. GERENCIAR VOLUMES NO DOCKER
1 sudo apt install nfs-common -y
Liste o compartilhamento do servidor NFS nos clientes Worker 01 e 02:
1 sudo showmount -e registry
Criar volumes persistentes no servidor web
Nas máquinas Worker 01 e 02, instale o plugin de volume NFS através do seguinte comando:
1 docker plugin install trajano/nfs-volume-plugin --grant-all-permissions
Para listar os plugins instalados, utilize o comando docker plugin ls.
Crie o volume para montar o compartilhamento web_data, localizado no servidor NFS:
1 docker volume create -d trajano/nfs-volume-plugin --opt device=registry:/home/
suporte/storage/web_data volume_nfs
Verifique se o volume de nome volume_nfs, foi criado corretamente através do comando docker
volume ls.
Para exibir informações mais detalhadas do volume, execute o seguinte comando:
1 docker inspect volume_nfs
Execute o container do servidor Web, utilizando o volume_nfs para mapear o conteúdo do
diretório /var/www/html:
1 docker container run -d --name webserver --hostname webserver -v volume_nfs:/var
/www/html -p 0.0.0.0:80:80 php:7.2-apache
Verifique se os containers estão em execução com o comando docker container ls.
Acesse no navegador do seu computador o IP das máquinasvirtuais Worker 01 e 02:
• Worker 01: http://172.16.0.101
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
114 4. GERENCIAR VOLUMES NO DOCKER
Fig. 4.2: NFS - Aplicação Web - Worker 01
• Worker 02: http://172.16.0.102
Fig. 4.3: NFS - Aplicação Web - Worker 02
Para terminar esse laboratório, remova das máquinas virtuais Worker 01 e 02 o container
webserver:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
115 4. GERENCIAR VOLUMES NO DOCKER
1 docker container rm -f webserver
Links
[1] Volumes Docker: https://docs.docker.com/storage/volumes/
[2] Bind Mount: https://docs.docker.com/storage/bind-mounts/
[3] Plugins Docker: https://docs.docker.com/engine/extend/legacy_plugins/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
5
Gerenciar redes no Docker
Competências deste conteúdo
Estae material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Networking (15% of exam)
LPI DevOps Tools Engineer Container Usage (weight: 7)
LPI DevOps Tools Engineer Container Infrastructure (weight: 4)
Introdução às redes Docker
Conceito
O Docker utiliza recursos de rede para fornecer isolamento completo aos containers, ao que
chamamos de Docker Network [1]. Os componentes de rede permitem aos aplicativos o acesso
a outros containers no host local ou remoto quando o Docker estiver sendo executado em um
cluster.
116
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
117 5. GERENCIAR REDES NO DOCKER
Modelo de rede de um container
Fig. 5.1: Modelo de Rede de Container
A seguir vamos conhecer alguns dos componentes do modelo de redes do Docker:
• Network Sandbox – Define a configuração da pilha de rede de um container. Um
Sandbox pode conter muitos Endpoints de várias redes. O Network Sandbox cria um
ambiente isolado, onde a configuração de rede para um contêiner do Docker irá persistir.
• Endpoint – Um Endpoint tem a função de abstrair da aplicação no interior do container,
a conexão real com a rede do Host. Um Endpoint também tem a função de criar ligações
com outros endpoints, em Network Sandbox distintas.
• Network – Define o tipo de rede, que pode ser um Linux Brigde, VLAN etc. Uma
Network é uma coleção de Endpoints que têm conectividade entre elas.
Uma rede bridge (ou ponte), é um dispositivo de rede que permite conectar duas ou mais
redes distintas. Já uma rede do tipo VLAN é um rede lógica que permite dividir em vários
segmentos lógicos um mesma rede física.
Drivers de rede nativos do Docker
Os drivers de rede nativos do Docker [2], são utilizados durante a criação de uma rede.
Os seguintes drivers de rede nativos estão disponíveis no Docker: Host, Bridge, Overlay,
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
118 5. GERENCIAR REDES NO DOCKER
MACVLAN ou None (nenhum).**
Descrição dos drivers de rede
• Host: com o driver host, um container usa a pilha de rede da máquina host. Não há
separação de namespace e todas as interfaces no host podem ser usadas diretamente
pelo container;
• Bridge: o driver bridge, cria uma Linux Brigde no host que é gerenciado pelo Docker.
Por padrão, containers em uma ponte podem se comunicar uns com os outros. O acesso
externo a containers, também pode ser configurado através do driver bridge;
• Overlay: o driver overlay, cria uma rede de sobreposição que suporta redes de vários
hosts prontas para uso. Ele usa uma combinação de Linux Brigde locais e VXLAN para
sobrepor comunicações de container à container, sobre a infraestrutura de rede física;
• MACVLAN: o driver macvlan, usa o modo Linux MACVLAN Brigde para estabele-
cer uma conexão entre interfaces de container e uma interface de host pai (ou sub-
interfaces). Ele pode ser usado para fornecer endereços IP para containers que são
roteáveis na rede física;
• None: o driver none, fornece ao container seu próprio stack de rede e namespace de
rede, mas não configura interfaces dentro do container. Sem configuração adicional, o
container é completamente isolado da pilha de rede do host;
• Plugins de rede: Você pode instalar e usar plug-ins de rede de terceiros com o Docker.
Esses plug-ins estão disponíveis no Docker Hub ou em fornecedores de terceiros.
Tipos de rede
Host
O driver de rede do host possui a mesma configuração de rede que o Linux usa sem o Docker.
A flag --net=host efetivamente desativa a rede do Docker e os containers usam a pilha de
rede do host (ou padrão) do sistema operacional do host.
Normalmente, com outros drivers de rede, cada container é colocado em seu próprio namespace
de rede (ou sandbox) para fornecer isolamento de rede completo entre si. Com os containers
do driver host, todos estão no mesmo namespace de rede do host e usam as interfaces de rede
e a pilha IP do host.
Todos os containers na rede do host, podem se comunicar entre si nas interfaces do host.
Do ponto de vista da rede, isso equivale a vários processos em execução de um host sem
containers. Como eles estão usando as mesmas interfaces de host, não há dois containers
capazes de se vincular à mesma porta TCP. Isso pode causar contenção de porta, se vários
containers estiverem sendo planejados no mesmo host.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
119 5. GERENCIAR REDES NO DOCKER
Bridge
Em qualquer host que esteja executando o Docker Engine, existe por padrão, uma rede Docker
local chamada bridge. Essa rede é criada usando um driver de rede faz exatamente o que seu
noe diz, ou seja, uma ponte, que instancia uma Linux Bridge chamada docker0.
Em um host independente do Docker, a bridge é a rede padrão à qual os containers se
conectam, se nenhuma outra rede for especificada. O Docker Engine conecta-o à rede de
bridge por padrão.
Descrição dos componentes:
• bridge: é o nome da rede Docker;
• bridge: é o driver de rede ou modelo, a partir do qual esta rede é criada;
• docker0: é o nome do Linux Brigde que é o bloco de construção do kernel usado para
implementar esta rede.
Overlay
O plano de controle do Docker Swarm, automatiza todo o provisionamento de uma rede
Overlay (que significa, rede sobreposta ou então uma rede de sobreposição). Nenhuma config-
uração VXLAN ou configuração de rede Linux é necessária. A criptografia do plano de dados,
um recurso opcional de sobreposições, também é configurada automaticamente pelo driver
overlay à medida que as redes são criadas.
Durante a criação da rede overlay, o Docker Engine cria a infraestrutura de rede necessária
para as sobreposições em cada host. Um Linux Brigde é criada por overlay, junto com suas
interfaces VXLAN associadas.
O Docker Engine instancia de forma inteligente as redes overlay nos hosts somente quando um
container anexado a essa rede é agendado no host. Isso evita a proliferação de redes overlay,
nas quais os containers conectados não existem.
Portas, Links e DNS
Uso de portas no Docker
O Docker permite publicar uma ou mais portas para acessar as aplicações que estão sendo
executadas no container, a partir do IP do host. A flag -p ou --publish cria uma regra de
firewall (DNAT) que mapeia a porta do container para a porta do Host.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
120 5. GERENCIAR REDES NO DOCKER
Uso de links no Docker
Por padrão um container não conhece um outro container pelo nome, mas é possível criar
um link para realizar esse tipo de ligação. A flag --link cria un link entre containers, onde
somente o container de destinatário poderá acessar através do link, o container de origem.
Uso de DNS no Docker
Por padrão o Docker utiliza a mesma configuração do arquivo /etc/resolv.conf do host em
seus containers. A flag --dns permite personalizar esse comportamento, definindo outros IPs
para a resolução de nomes.
LAB 4.1 - Gerenciar portas, links e DNS no Docker
Neste laboratório vamos aprender como gerenciar portas, links e DNS no Docker. Verifique se
todas as máquinas virtuais do curso estão ligadas.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux:
1 cd 4540Para iniciar as máquinas virtuais, utilize o subcomando up do Vagrant, desta forma vagrant up.
Em seguida, acesse a máquina virtual Worker 01, através do vagrant ssh e alterne para a
conta do usuário suporte.
1 vagrant ssh worker01
2 sudo su - suporte
Gerenciar portas
Para mapear a porta 80 do container no host local, execute um container com a flag -p:
1 docker container run -d --name webserver --network bridge -p 80:80 nginx
Quando executamos um container, podemos definir a exposição de uma ou mais
portas, através da opção -p host:port:port para especificar a interface externa para
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
121 5. GERENCIAR REDES NO DOCKER
uma determinada ligação. Para expor as portas em qualquer endereço, use o endereço
0.0.0.0 no host hospedeiro ou omita a informação.
Para verificar qual é a porta que está sendo mapeada no container, execute o comando:
1 docker container port webserver
Faça um teste acessando o servidor web NGINX, através do elinks:
1 elinks http://worker01
Tecle q e ENTER para sair do navegador elinks.
Remova a execução do container webserver, antes de continuar executando os próximos co-
mandos:
1 docker container rm -f webserver
Para mapear um porta aleatória do container, execute um container com a flag -P:
1 docker container run -d --name webserver -P nginx
Descubra a porta que o Nginx está atendendo requisições, antes de acessá-lo via elinks:
1 docker container port webserver
2 80/tcp -> 0.0.0.0:32768
1 elinks http://worker01:32768
Remova a execução do container webserver, antes de continuar os próximos comandos:
1 docker container rm -f webserver
Gerenciar links
Para começar, execute um container com o nome de um servidor:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
122 5. GERENCIAR REDES NO DOCKER
1 docker container run -di --name=servidor -h servidor busybox
Em seguida, execute o segundo container, criando um link para o primeiro container:
1 docker container run -di --name=cliente --link servidor:servidor -h cliente
busybox
Os links no Docker, permitem que um container se comunique com outros containers
pelo hostname. Isso é possível, se o container de destino estiver na mesma rede.
Verifique se no arquivo /etc/hosts do segundo container, consta o nome e IP do primeiro:
1 docker container exec -it cliente cat /etc/hosts
Faça um teste de conectividade do cliente ao servidor, através do comado ping:
1 docker container exec -it cliente ping -c4 servidor
Já o arquivo /etc/hosts do primeiro container, não consta o nome e IP do segundo:
1 docker container exec -it servidor cat /etc/hosts
2 docker container exec -it servidor ping -c4 cliente
Remova a execução do containers, antes de continuar os próximos comandos:
1 docker container rm -f servidor cliente
Gerenciar DNS
Os endereços IP transmitidos por meio da opção --dns, são usados pelo servidor DNS para
encaminhar a consulta DNS.
Por padrão, o servidor Docker cria e configura o docker0 do sistema host como uma interface
de rede homônima, que é um dispositivo de Ethernet Brigde. O Docker configura o docker0
com um endereço IP, máscara de rede e intervalo de alocação de IP. Os containers conectados
à brigde padrão, recebem endereços IP dentro desse intervalo.
Execute um container com o nome de servidor, apontando um servidor de DNS na rede:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
123 5. GERENCIAR REDES NO DOCKER
1 docker container run -di --name=servidor -h servidor --dns=172.16.0.103 busybox
Verifique se no arquivo /etc/resolv.conf do container, consta o IP do servidor DNS:
1 docker container exec -it servidor cat /etc/resolv.conf
Faça um teste no container, pingando por nome os hosts configurados no servidor DNS:
1 docker container exec -it servidor ping -c4 worker01.4labs.example
2 docker container exec -it servidor ping -c4 worker02.4labs.example
Certifique-se de que as máquinas virtuais Worker02 e Registry estão ligadas
Remova a execução do container servidor, antes de continuar os próximos comandos:
1 docker container rm -f servidor
Para fixar a configuração do servidor DNS no Docker, edite ou crie o arquivo daemon.json:
1 sudo vim /etc/docker/daemon.json
Resultado do comando:
1 {
2 "dns": ["172.16.0.103"]
3 }
Você pode definir as configurações da rede de ponte padrão, usando flags do comando
dockerd. No entanto, a maneira recomendada de configurar o daemon do Docker, é
utilizar o arquivo daemon.json, localizado em /etc/docker/ no Linux. Se o arquivo não
existir, crie-o. Em nosso exemplo, a opção dns define o IP do servidor DNS, que está
presente no arquivo /etc/resolv.conf em todos os containers.
É preciso reiniciar o serviço do Docker para aplicar as alterações:
1 sudo systemctl restart docker
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
124 5. GERENCIAR REDES NO DOCKER
Execute novamente um container, sem apontar um servidor de DNS na rede:
1 docker container run -di --name=servidor -h servidor busybox
Faça um teste no container, pingando por nome os hosts configurados no servidor DNS:
1 docker container exec -it servidor ping -c4 worker02.4labs.example
Para terminar, remova a execução do container servidor:
1 docker container rm -f servidor
LAB 4.2 – Gerenciar redes host e bridge no Docker
Neste laboratório vamos aprender como executar containers com redes do tipo bridge e host
no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux através do comando
cd 4540 e em seguida, acesse a máquina virtual Worker 01, através do vagrant ssh e alterne
para a conta do usuário suporte.
1 vagrant ssh worker01
2 sudo su - suporte
Rede bridge
Para executar um container utilizando a rede bridge, execute o container com a flag --network:
1 docker container run -d --name webserver --network bridge -p 80:80 nginx
Verifique qual é a porta que está sendo mapeada no host local:
1 docker container port webserver
2 80/tcp -> 0.0.0.0:80
3
4 sudo ss -putan | grep 80
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
125 5. GERENCIAR REDES NO DOCKER
5 tcp LISTEN 0 128 :::80 :::* users:(("docker
-proxy",pid=10556,fd=4))
Faça um teste acessando o Nginx através do elinks e remova a execução do mesmo:
1 elinks http://worker01
1 docker container rm -f webserver
Quando utilizamos a flag --network, o container é executado com a rede padrão que
o Docker configura automaticamente para você. Esta rede não é a melhor escolha
para sistemas em produção.
Rede host
Para executar um container utilizando a rede host, execute o container com a flag --net:
1 docker container run -d --name webserver --net=host nginx
Veja se o container não possui porta mapeada, pois o Nginx está utilizando a porta diretamente
no host local:
1 docker container port webserver
2
3 sudo ss -putan | grep 80
4 tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=10745,fd
=7),("nginx",pid=10708,fd=7))
5 tcp LISTEN 0 128 :::80 :::* users:(("nginx",pid=10745,fd
=8),("nginx",pid=10708,fd=8))
Quando utilizamos a flag --net=host, estamos iniciando um container que se liga
diretamente à porta no host do Docker. Do ponto de vista da rede, esse é o mesmo
nível de isolamento como se o processo nginx estivesse sendo executado diretamente
no host do Docker e não em um container.
No entanto, em todas as outras formas, como armazenamento, namespace de processo
e namespace de usuário, o processo nginx é isolado do host.
Faça um teste acessando o servidor Web Nginx, através do elinks e remova a execução do
mesmo:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
126 5. GERENCIAR REDES NO DOCKER
1 elinks http://worker01
1 docker container rm -f webserver
LAB 4.3 – Comandos de gerenciamento de redes no Docker
Neste laboratório vamos aprender os comandos de gerenciamento de redes no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, acesse a máquina
virtual Worker 01, através do vagrant ssh e alterne para a conta do usuário suporte.
1 vagrant ssh worker012 sudo su - suporte
Utilizar a rede padrão
Verifique quais são as opções do comando docker network e liste as redes disponíveis:
1 docker network --help
2 docker network ls
Para exibir informações detalhadas sobre a rede bridge, execute o comando docker network
inspect bridge. Vamos testar o uso da rede padrão com dois containers, através da imagem
busybox:
1 docker container run -di --name=c1 -h servidor busybox
2 docker container run -di --name=c2 -h cliente busybox
Verifique o endereço IP de cada container, através do comando docker container exec:
1 docker container exec c1 ifconfig eth0
2 docker container exec c2 ifconfig eth0
Faça um teste de conectividade entre os containers, através do comando ping:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
127 5. GERENCIAR REDES NO DOCKER
1 docker container exec c1 ping -c4 172.17.0.3
2 docker container exec c2 ping -c4 172.17.0.2
Remova a execução dos containers c1 e c2, antes de continuar os próximos comandos:
1 docker container rm -f c1 c2
Criar redes personalizadas
Como exemplo prático, vamos criar uma nova rede no Docker com o nome de 4labs:
1 docker network create --driver bridge --subnet 172.19.0.0/16 4labs
2 docker network ls
Para exibir informações detalhadas sobre a rede 4labs, execute o comando docker network
inspect 4labs.
Descrição dos comandos
• docker network: permite gerenciar redes no Docker;
• docker network create: permite criar uma nova rede no Docker. A opção --subnet
define a rede e sua respectiva máscara;
• docker network ls: lista as redes disponíveis no Docker;
• docker network inspect: exibe informações detalhadas sobre uma ou mais redes.
Utilizar IP fixo
Inicie novamente os dois containers na rede 4labs, utilizando IP fixo:
1 docker container run -di --name=container1 -h servidor --net 4labs --ip
172.19.0.111 --add-host=cliente:172.19.0.112 busybox
1 docker container run -di --name=container2 --link container1:servidor -h cliente
--net 4labs --ip 172.19.0.112 busybox
A opção --ip, só pode ser utilizada em conjunto com a opção --net em uma rede
definida pelo usuário.
Faça um teste de conectividade, usando o hostname de cada container na rede 4labs:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
128 5. GERENCIAR REDES NO DOCKER
1 docker container exec -it container1 ping -c2 cliente
2 docker container exec -it container1 ping -c2 172.19.0.112
1 docker container exec -it container2 ping -c2 servidor
2 docker container exec -it container2 ping -c2 172.19.0.111
Para desconectar um container de uma rede, use a opção disconnect:
1 docker network disconnect 4labs container2
2 docker container exec -it container1 ping -c2 cliente
Para conectar um container a uma rede, use a opção connect:
1 docker network connect --ip 172.19.0.112 4labs container2
2 docker container exec -it container1 ping -c2 cliente
Descrição dos comandos
• docker network disconnect: permite desconectar um container de uma rede, disponível
no Docker;
• docker network connect: permite conectar um container a uma rede, disponível no
Docker.
Remover rede
Remova a execução dos containers container1 e container2, antes de continuar os próximos
comandos:
1 docker container rm -f container1 container2
Para remover uma rede no Docker, usamos a opção rm, conforme o exemplo a seguir:
1 docker network rm 4labs
2 docker network ls
Para remover redes que não estão sendo utilizadas, execute o comando docker network prune.
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
129 5. GERENCIAR REDES NO DOCKER
1 WARNING! This will remove all custom networks not used by at least one container
.
2 Are you sure you want to continue? [y/N] y
Descrição dos comandos
• docker network rm: permite remover uma rede, disponível no Docker;
• docker network prune: remove redes que não estão sendo utilizadas.
Plugins de rede
Os plug-ins de rede do Docker, permitem que as implantações do Engine sejam estendidas
para suportar uma ampla gama de tecnologias de rede, como VXLAN, IPVLAN, MACVLAN
ou algo completamente diferente;
Plugins de driver de rede, são suportados através do projeto LibNetwork. Cada plugin é
implementado como um driver remoto para o LibNetwork, que compartilha a infraestrutura
do plugin com o Engine. Efetivamente, plugins de driver de rede são ativados da mesma
maneira que outros plugins e usam também o mesmo tipo de protocolo.
Plugins de Rede
• Weave Net: um plugin de rede [3] que cria uma rede virtual e que conecta containers
do Docker em vários hosts ou nuvens. O Weave Net fornece descoberta automática de
aplicativos, pode operar em redes parcialmente conectadas, não requer um armazena-
mento de cluster externo e é compatível com operações.
• Infoblox IPAM Plugin: é um plugin da libnetwork do Docker, que interage com o
Infoblox para fornecer serviços de gerenciamento de endereço IP. Para usar o plugin,
você precisa acessar o produto Infoblox DDI.
Para obter mais informações sobre o plugins de rede, acesse o link abaixo: https:
//hub.docker.com/search/?q=&type=plugin&category=network
LAB 4.4 – Instalar plugin de rede no Docker
Neste laboratório vamos aprender como instalar um plugin de rede no Docker. O plugin de
rede será utilizado em outra aula posteriormente.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, acesse as máquinas
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
130 5. GERENCIAR REDES NO DOCKER
virtuais Manager , Worker 01 e Worker 02, através do vagrant ssh.
1 vagrant ssh manager
1 vagrant ssh worker01
1 vagrant ssh worker02
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
Instalação do plugin de rede Weave Net
Para começar, instale o plugin Weave Net, em todas as máquinas, através do comando:
1 docker plugin install --grant-all-permissions store/weaveworks/net-plugin:2.5.2
Liste os plugins para validar o comando anterior:
1 docker plugin ls
Resultado do comando:
1 ID NAME DESCRIPTION
ENABLED
2 3273cdd0d179 store/weaveworks/net-plugin:2.5.2 Weave Net plugin for Docker
true
3 0d2d07fffbfb trajano/nfs-volume-plugin:latest NFS mounted plugin for Docker
true
4 486a37d341bd vieux/sshfs:latest sshFS plugin for Docker
true
Para exibir informações detalhadas sobre o plugin, execute o seguinte comando:
1 docker plugin inspect store/weaveworks/net-plugin:2.5.2
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
131 5. GERENCIAR REDES NO DOCKER
Resultado do comando:
1 [
2 {
3 "Config": {
4 "Args": {
5 "Description": "",
6 "Name": "",
7 "Settable": null,
8 "Value": null
9 },
10 "Description": "Weave Net plugin for Docker",
11 "DockerVersion": "18.09.2",
12 "Documentation": "https://weave.works",
13 "Entrypoint": [
14 "/home/weave/launch.sh"
15 ],
No próximo capítulo vamos conhecer o Docker Registry, como ele funciona e seus principais
recursos.
Links
[1] Docker Network: https://success.docker.com/article/networking
[2] Redes Docker: https://docs.docker.com/network/
[3] Weave Net: https://www.weave.works/oss/net/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
6
Gerenciar Docker Registry e
Compose
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Image Creation Management, and Registry
(20% of exam).
Introdução ao Docker Registry
Conceito
O Registry [1] é uma aplicação stateless, altamente escalonável, que armazena e permite
distribuir imagens do Docker. O registry é de código aberto, sob a licença permissiva Apache.
Antes de implantar um registry, você precisa instalar o Docker no host. Basicamente, o
Registry é uma instância docker da sua própria imagem.
Você deve usar o registro para:
• Ter um controle rigoroso de onde suas imagens estão sendo armazenadas;
132
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
133 6. GERENCIAR DOCKER REGISTRY E COMPOSE
• Possuir total controle sobre seupipeline de distribuição de imagens;
• Integrar o armazenamento e a distribuição de imagens em seu fluxo de trabalho de
desenvolvimento interno.
LAB 5.1 – Instalação do Docker Registry
Neste laboratório vamos aprender como instalar e utilizar de forma local o Docker Registry.
Acesse a pasta 4540 que você obteve do Github da 4Linux, inicie as máquinas virtuais utilizando
o subcomando up do Vagrant, em seguida acesse a máquina virtual Registry, através do
vagrant ssh e alterne para a conta do usuário suporte.
Inicie o Docker Registry na porta 5000:
1 docker container run -d -p 5000:5000 --restart=always --name registry registry:2
Verifique se o container esta em execução e atendendo requisições na porta 5000:
1 docker container ls
2 CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
3 176418e82181 registry:2 "/entrypoint.sh /etc" 11 seconds ago
Up 9 seconds 0.0.0.0:5000->5000/tcp registry
4
5 ss -nltp | grep 5000
6 LISTEN 0 128 :::5000 :::*
Antes de testar o Docker Registry, faça o download da imagem do Busybox:
1 docker image pull busybox:latest
Defina uma tag para a imagem do Busybox no Registry:
1 docker tag busybox:latest localhost:5000/busybox
Envie a imagem do Busybox para o servidor local Registry:
1 docker push localhost:5000/busybox
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
134 6. GERENCIAR DOCKER REGISTRY E COMPOSE
Verifique se a imagem está armazenada no servidor:
1 docker image ls
2 REPOSITORY TAG IMAGE ID CREATED
SIZE
3 busybox latest c7c37e472d31 2 weeks ago
1.22MB
4 localhost:5000/busybox latest c7c37e472d31 2 weeks ago
1.22MB
5 registry 2 2d4f4b5309b1 4 weeks ago
26.2MB
Remova a imagem local com o comando docker image rm busybox:latest e para testar execute
um container utilizando a imagem do Docker Registry:
1 docker container run -dit --name busybox localhost:5000/busybox
Verifique se o container esta em execução:
1 docker container ls
2 CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
3 08db50b65a5c localhost:5000/busybox "sh" 7 seconds
ago Up 5 seconds busybox
4 176418e82181 registry:2 "/entrypoint.sh /etc" About a
minute ago Up About a minute 0.0.0.0:5000->5000/tcp registry
Para terminar remova o container busybox:
1 docker container rm -f busybox
LAB 5.2 – Configurar certificados e autenticação básica
Neste laboratório vamos aprender como melhorar a segurança em nosso servidor de registro
Docker, adicionando certificado e autenticação de usuários, ainda utilizando a máquina virtual
Registry na qual nos conectamos anteriormente.
Gere os certificados, através do seguintes comandos:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
135 6. GERENCIAR DOCKER REGISTRY E COMPOSE
1 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout registry.key -out
registry.crt -subj "/CN=registry/O=4Labs/OU=DevOps"
Opções do comando openssl
• req: define a requisição de um novo certificado.
• -x509: define em qual padrão o certificado será criado.
• --nodes: avisa ao comando openssl para não criptografar a chave de saída.
• -days: define o número de dias que o certificado X509 é valido.
• -newkey: define a geração de uma nova chave que será utilizada pelo certificado.
• -keyout: define o nome do arquivo que irá armazenar a nova chave.
• -out: define o nome do arquivo que irá armazenar o certificado.
• -subj: define as informações contidas no certificado.
Criar a pasta de certificados. Mova o arquivo de certificado e chave para esta nova pasta:
1 mkdir certs
2 mv registry* certs
Criar a pasta auth para armazenar o arquivo de autenticação htpasswd.
1 mkdir auth
Instale o pacote apache2-utils e gere o arquivo htpasswd contendo o nome de usuário e senha:
1 sudo apt install apache2-utils -y
2 htpasswd -Bbn suporte 4linux > auth/htpasswd
Opções do comando htpasswd
• -B: permite encriptar a senha.
• -b: permite passar a senha em linha de comando.
• -n: permite exibir os resultados na saída padrão.
Criar a pasta onde iremos armazenar as imagens em nosso servidor de registro, ela terá o nome
data.
1 mkdir data
Antes de iniciar o servidor com as novas funcionalidades, remova o container registry:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
136 6. GERENCIAR DOCKER REGISTRY E COMPOSE
1 docker container rm -f registry
Inicie o servidor do Docker Registry com certificado, sistema de autenticação e pasta local
para armazenar imagens do Docker:
1 docker container run -d --restart=always --name registry \
2 -v "$(pwd)"/data:/var/lib/registry -v "$(pwd)"/auth:/auth -e "REGISTRY_AUTH=
htpasswd" \
3 -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
4 -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
5 -v "$(pwd)"/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
6 -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key -p 5000:5000 registry:2
Verifique se o container está em execução:
1 docker container ls
2 CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
3 2634f28633f0 registry:2 "/entrypoint.sh /etc" 5 seconds ago
Up 4 seconds 0.0.0.0:5000->5000/tcp registry
LAB 5.3 – Configurar o acesso aos clientes
Neste laboratório vamos aprender como enviar as duas imagens que utilizamos para executar
a aplicação Wordpress, para nosso servidor de Registry Docker.
Acesse a pasta 4540 que você obteve do Github da 4Linux, acesse as máquinas virtuais
Manager , Worker 01 e Worker 02, através do vagrant ssh e alterne para a conta do
usuário suporte.
Configurar clientes
Crie no diretório /etc/docker/certs.d uma subpasta com o nome da máquina registry e a
porta de atendimento:
1 sudo mkdir -p /etc/docker/certs.d/registry:5000
Copie da máquina registry o arquivo de certificado:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
137 6. GERENCIAR DOCKER REGISTRY E COMPOSE
1 scp registry:certs/registry.crt .
Mova para a pasta /etc/docker/certs.d/registry:5000, o arquivo registry.crt renomeando
para ca.crt:
1 sudo mv registry.crt /etc/docker/certs.d/registry:5000/ca.crt
Logue com o usuário suporte e a senha 4linux em nosso servidor Docker Registry:
1 docker login -u suporte registry:5000
2 Password: 4linux
3 WARNING! Your password will be stored unencrypted in /home/suporte/.docker/
config.json.
4 Configure a credential helper to remove this warning. See
5 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
6
7 Login Succeeded
Repita os passos nas máquinas virtuais Worker 01 e Worker 02.
Enviar imagens para o Docker Registry
Alterne para a máquina virtualManager
Defina uma tag para a imagem webserver-wordpress, e envie a mesma para nosso servidor
Docker Registry:
1 docker tag webserver-wordpress registry:5000/webserver-wordpress:latest
2 docker push registry:5000/webserver-wordpress:latest
Defina uma tag para a imagem banco-wordpress, e envie a mesma para nosso servidor Docker
Registry:
1 docker tag banco-wordpress registry:5000/banco-wordpress
2 docker push registry:5000/banco-wordpress
Confirme se a imagens estão presentes em no servidor de Registro Docker através do seguinte
comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
138 6. GERENCIAR DOCKER REGISTRY E COMPOSE
1 curl -ik --user suporte:4linux https://registry:5000/v2/_catalog
Resultado do comando:
1 HTTP/1.1 200 OK
2 Content-Type: application/json; charset=utf-8
3 Docker-Distribution-Api-Version: registry/2.0
4 X-Content-Type-Options: nosniff
5 Date: Sun, 31 May 2020 14:57:45 GMT
6 Content-Length: 59
7 {"repositories":["banco-wordpress","webserver-wordpress"]}
As imagens do Docker estão armazenadas na máquina virtual Registry, no diretório
/home/suporte/data/docker/registry/v2/repositories/.
Opções do comando curl
• -i: permite incluir cabeçalhos de protocolo na saída do comando
• -k: permite conexões a sites SSL sem certificado seguros
• --user: define o nome de usuário e senha do servidor remoto.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
7
Orquestrar ambientes com
Docker Compose
Competências deste conteúdo
O material a seguirpossui conteúdos que atendem aos objetivos das seguintes certificações:
Certificação Objetivos
LPI DevOps Tools Engineer Container Deployment and Orchestration (weight: 5)
Introdução ao Docker Compose
Conceito
O Docker Compose [2], é uma ferramenta que define e executa aplicativos Docker interligando
vários containers. Com ele, é possível utilizar um arquivo YAML para configurar os serviços do
seu aplicativo. Então, com um único comando, é possível criar e inicializar todos os serviços
da sua configuração.
O Compose funciona em todos os ambientes: produção, teste, desenvolvimento e em fluxos
de trabalho de CI (Continuous Integration – Integração Contínua).
A partir de um arquivo chamado docker-compose.yml, podemos configurar diversos serviços de
um ambiente. Usando um único comando, criamos e iniciamos todos os containers presentes
139
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
140 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
no arquivo de configuração.
Exemplo do arquivo docker-compose.yml:
1 version: ’3’
2 services:
3 webserver:
4 image: "registry:5000/webserver-wordpress:latest"
5 hostname: "webserver-webserver"
6 container_name: "webserver-webserver"
7 domainname: "4labs.example"
8 ports:
9 - "80:80"
Instruções do arquivo docker-compose.yml:
• version: permite definir a versão das instruções, utilizadas no arquivo docker-compose.
yaml;
• services: permite definir quais serão os serviços orquestrados, sendo que cada serviço
corresponde a um container, volume ou rede;
• image: define qual será a imagem utilizada para executar o container;
• hostname: define o nome do host do container;
• domainname: define o nome do domínio na configuração de rede do container;
• container_name: define o nome do container;
• ports: define uma ou mais portas que serão mapeadas para o container.
LAB 5.4 – Instalação do Docker Compose
Neste laboratório vamos aprender como instalar o Docker Compose no Linux. Utilizando a
máquina virtual Worker 01, alterne para a conta do usuário suporte e em seguida realize a
instalação do Docker Compose, através da ferramenta curl:
1 sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-
compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Adicione uma permissão de execução ao binário docker-compose:
1 sudo chmod +x /usr/local/bin/docker-compose
Verifique a versão da ferramenta, através do seguinte comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
141 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
1 docker-compose --version
LAB 5.5 – Docker Compose: comandos essenciais
Neste laboratório vamos testar os comandos essenciais do Docker Compose.
Visualize o conteúdo do arquivo modelo docker-compose.yaml, localizado no diretório /opt:
1 cat /opt/docker-compose.yaml
Resultado do comando:
1 version: ’3’
2 services:
3 webserver:
4 image: "registry:5000/webserver-wordpress:latest"
5 hostname: "webserver-4labs"
6 container_name: "webserver-4labs"
7 domainname: "4labs.example"
8 ports:
9 - "80:80"
Em seguida, copie o arquivo modelo docker-compose.yml para a pasta /tmp:
1 cp /opt/docker-compose.yaml /tmp
É preciso alternar para a pasta onde o arquivo docker-compose.yml está localizado:
1 cd /tmp
Para validar a formatação do arquivo docker-compose.yml, use a opção config:
1 docker-compose config
Para iniciar o container webserver-4labs, execute o seguinte comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
142 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
1 docker-compose up -d
Verifique se o container aparece na lista de containers:
1 docker-compose ps
Resultado do comando:
1 Name Command State Ports
2 ----------------------------------------------------------------------
3 webserver-4labs apachectl -D FOREGROUND Up 0.0.0.0:80->80/tcp
Pare e liste os containers através dos comandos:
1 docker-compose stop
2 docker-compose ps
Inicie e liste os containers através dos comandos:
1 docker-compose start
2 docker-compose ps
Pare e remova o container em execução através do subcomando rm:
1 docker-compose stop
2 docker-compose rm -f
LAB 5.6 – Docker Compose: gerenciar volumes e redes
Neste laboratório vamos testar o gerenciamento de volumes e redes através do Docker Com-
pose.
Antes de continuar, crie uma rede:
1 docker network create --subnet 172.20.0.0/16 4labs
Verifique se a rede foi criada corretamente
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
143 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
1 docker network ls
Verifique se o volume_nfs está presente na máquina virtual Worker 01:
1 docker volume ls
Edite o arquivo docker-compose.yaml para adicionar configurações de rede e volume:
1 vim docker-compose.yaml
1 ....
2
3 networks:
4 4labs:
5 ipv4_address: 172.20.0.150
6 volumes:
7 - "volume_nfs:/var/www/html"
8
9 volumes:
10 volume_nfs:
11 external: true
12 networks:
13 4labs:
14 external: true
Para validar a formatação do arquivo docker-compose.yml, use a opção config:
1 docker-compose config
Para iniciar o container webserver-4labs usando a rede 4labs, execute o comando:
1 docker-compose up -d
Verifique se o container está sendo utilizado no IP da rede 4labs:
1 docker container exec -it webserver-4labs ip a
Verifique se o container está sendo utilizado no volume montado:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
144 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
1 docker container exec -it webserver-4labs df -Th
2 docker container exec -it webserver-4labs ls /var/www/html
Acesse através do navegador do seu computador o IP da máquina virtual Worker 01: http://172.16.0.101
Fig. 7.1: webserver
Pare e remova o container em execução, através do subcomando rm:
1 docker-compose stop
2 docker-compose rm -f
LAB 5.7 – Gerenciar Registry com Docker Compose
Neste laboratório vamos criar o arquivo docker-compose.yaml, para gerenciar o Docker Registry
através do Docker Compose.
Instalação do Docker Compose
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, acesse a máquina
virtual Registry e alterne para a conta do usuário suporte.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
145 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
Em seguida realize a instalação do Docker Compose, através da ferramenta curl:
1 sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-
compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Em seguida, adicione uma permissão de execução ao binário docker-compose:
1 sudo chmod +x /usr/local/bin/docker-compose
Verifique a versão da ferramenta, através do comando docker-compose --version.
Instalação do Docker Compose em Mac OS X ou Windows
O Docker Desktop para Mac/Windows e o Docker Toolbox já incluem o Compose junto com
outros aplicativos do Docker, portanto, a maioria dos usuários de Mac/Windows não precisam
instalar o Compose separadamente.
Configuração do arquivo docker-compose.yml
Visualize o conteúdo do arquivo modelo docker-compose.yml, localizado no diretório /opt:
1 cat /opt/docker-compose.yaml
Resultado do comando:
1 version: ’3’
2 services:
3 registry:
4 restart: always
5 image: registry:2
6 ports:
7 - 5000:5000
8 environment:
9 REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt
10 REGISTRY_HTTP_TLS_KEY: /certs/registry.key
11 REGISTRY_AUTH: htpasswd
12 REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
13 REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
14 volumes:
15 - ./data:/var/lib/registry
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
146 7. ORQUESTRAR AMBIENTES COM DOCKER COMPOSE
16 - ./certs:/certs
17 - ./auth:/auth
Copie o arquivo docker-compose.yaml para o diretório HOME do usuário suporte:
1 cp /opt/docker-compose.yaml .
Para validar a formatação do arquivo docker-compose.yaml, use a opção config:
1 docker-compose config
Antes de iniciar o servidor com as novas funcionalidades, remova o container registry:
1 docker container rm -f registry
Para iniciar o DockerRegistry através do Docker Compose, execute o seguinte comando:
1 docker-compose up -d
Verifique se o container do Docker Registry está em execução:
1 docker-compose ps
Resultado do comando:
1 Name Command State Ports
2 --------------------------------------------------------------------------------
3 suporte_registry_1 /entrypoint.sh /etc/docker... Up 0.0.0.0:5000->5000/
tcp
No capítulo seguinte vamos entender como funciona o gerenciamento de cluster com Docker.
Links
[1] Docker Registry: https://docs.docker.com/registry/introduction/
[2] Docker Compose: https://docs.docker.com/compose/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
8
Gerenciar Cluster com Docker
Swarm
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Orchestration (25% of exam)
LPI DevOps Tools Engineer Container Deployment and Orchestration
(weight: 5)
Introdução ao Docker Swarm
Conceito
O Docker Swarm [1] é um Cluster nativo para Docker. Os recursos de gerenciamento e
orquestração do cluster, incorporados no mecanismo do Docker, são criados usando o swarmkit
. O Swarmkit é um projeto separado que implementa a camada de orquestração do Docker,
e é utilizado diretamente por ele.
Um cluster Swarm, consiste em vários hosts do Docker que são executados no modo swarm e
atuam como manager (para gerenciar associação e delegação) e worker (que executam serviços
do Swarm, ou seja, são os trabalhadores em si). Um determinado host do Docker pode ser
147
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
148 8. GERENCIAR CLUSTER COM DOCKER SWARM
um manager, um worker ou desempenhar as duas funções.
Quando você cria um service, define seu estado ideal (número de réplicas, recursos de rede
e armazenamento disponíveis para ele, portas que o serviço expõe ao mundo externo etc.). O
Docker trabalha para manter esse estado desejado. Por exemplo, se um nó de trabalho ficar
indisponível, o Docker agendará as tarefas desse nó em outros nós.
Já uma task (tarefa) é um container em execução, que faz parte de um serviço do Swarm
gerenciado por um manager do cluster, em oposição a um container autônomo.
Funcionamento do Swarm
Fig. 8.1: Estrutura do Swarm
Um nó, é uma instância do mecanismo do Docker que participa do Swarm. Você também
pode pensar nisso como um nó do Docker. É possível executar um ou mais nós em um único
computador físico ou em um servidor em nuvem, mas as implantações em produção do Swarm
geralmente incluem nós Docker distribuídos em várias máquinas físicas ou até em nuvem.
Para realizar o deploy de suas aplicações em um cluster Swarm, você envia uma definição
de serviço (service) para um nó manager. O nó manager despacha unidades de trabalho
chamadas task para os nós worker.
O nó manager
Os nós manager, também executam as funções de orquestração e gerenciamento de cluster,
necessárias para manter o estado desejado do cluster Swarm. Os nós manager elegem um único
líder para conduzir tarefas de orquestração.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
149 8. GERENCIAR CLUSTER COM DOCKER SWARM
O nó worker
Os nós do tipo worker, recebem e executam tarefas despachadas pelos nós manager. Por padrão,
os nós manager também executam serviços como os nós worker, mas você pode configurá-los
para executar exclusivamente tarefas do manager e serem apenas nós de gerenciamento.
Um agente é executado em cada nó worker e relata as tarefas atribuídas a ele. O nó worker
notifica o nó manager do estado atual de suas tarefas designadas, para que o gerenciador possa
manter o estado desejado de cada nó worker.
LAB 6.1 – Criar um cluster com Docker Swarm
Neste laboratório vamos aprender como criar um cluster com Docker Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, inicie as máquinas
virtuais com o subcomando up do Vagrant, em seguida, acesse a máquina virtual Manager,
através do vagrant ssh e alterne para a conta do usuário suporte.
Para criar um cluster utilizando o Docker Swarm, execute o seguinte comando:
1 docker swarm init --advertise-addr 172.16.0.100
Resultado do comando:
Fig. 8.2: swarm-init
A flag --advertise-add define o IP em que os outros nós do cluster, irão utilizar para
se conectar no nó master ;
Copie o resultado do comando docker swarm init e logue com o usuário suporte na máquina
virtual Worker 01. Em seguida, acesse a máquina virtual Worker 01 (também utilizando o
usuário suporte para tal e cole o comando que você copiou da máquina virtual Manager:
1 docker swarm join --token SWMTKN-1-2
ioy5ebkwc33f5r16p9iramv9t9uziyxtc28ocdcda00cykgio-5wykmz5kf0mc2jnuupogjb206
172.16.0.100:2377
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
150 8. GERENCIAR CLUSTER COM DOCKER SWARM
Resultado do comando:
Fig. 8.3: swarm-join-worker1
Agora acesse a máquina virtual Worker 02, alterne para a conta do usuário suporte e cole
o comando que você copiou da máquina virtual Manager:
1 docker swarm join --token SWMTKN-1-2
ioy5ebkwc33f5r16p9iramv9t9uziyxtc28ocdcda00cykgio-5wykmz5kf0mc2jnuupogjb206
172.16.0.100:2377
Resultado do comando:
Fig. 8.4: swarm-join-worker1
Alterne para a máquina virtual Manager e liste os nós presentes no Cluster Swarm:
1 docker node ls
Resultado do comando:
1 ‘‘‘text
2 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
3
4 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
5 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
6 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
7 ‘‘‘
Confirme se o Swarm está ativo na configuração do Docker:
1 docker info | grep Swarm
• Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
151 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 Swarm: active
Para exibir novamente o comando para ingressar o nó worker no cluster, execute o seguinte
comando:
1 docker swarm join-token worker
Resultado do comando:
1 ‘‘‘text
2 To add a worker to this swarm, run the following command:
3
4 docker swarm join --token SWMTKN-1-2
ioy5ebkwc33f5r16p9iramv9t9uziyxtc28ocdcda00cykgio-5
wykmz5kf0mc2jnuupogjb206 172.16.0.100:2377
5 ‘‘‘
Descrição dos Comandos
• docker swarm --help: lista as opções do subcomando Docker Swarm e sua descrição;
• docker swarm init: inicializa um cluster Swarm no Docker.
• docker swarm join: permite ingressar o nó no cluster Swarm;
• docker swarm join-token: exibe o comando que deve ser executado para ingressar no
cluster Swarm;
• docker node ls: lista os nós disponíveis no cluster.
LAB 6.2 – Gerenciamento de nós no cluster Swarm
Neste laboratório vamos aprender como gerenciar os nós de um com Docker Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, inicie as máquinas
virtuais utilizando o subcomando up do Vagrant e em seguida, acesse a máquina virtual Man-
ager, através do vagrant ssh, alternando para a conta do usuário suporte.
Listar nós
É possível filtrar um nó pelo seu papel de gerenciador (manager):
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
152 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 docker node ls --filter role=manager
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
É possível filtrar um nó também pelo seu papel de trabalhador (worker):
1 docker node ls --filter role=worker
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
3 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Na coluna AVAILABILITY os nós estão como Active, indicando que estão disponíveis
para receber tarefas. Ainda é possível defini-los como DRAIN ou PAUSE.
Definir labels (rótulos)
Podemos definir pequenos rótulos aos nós do cluster para que seja possível filtrar os nós de
forma mais amigável. Desta forma será possível classificar os nósquanto aos tiplos, realizar
atualizações e até mesmo criar uma política de nomenclatura para facilitar a organização dos
seus clusters.
Defina o label cloud=aws para o nó worker01:
1 docker node update --label-add cloud=aws worker01
Defina o label cloud=azure para o nó worker02:
1 docker node update --label-add cloud=azure worker02
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
153 8. GERENCIAR CLUSTER COM DOCKER SWARM
Os labels são usados para classificar e realizar atualizações em nós no cluster Swarm.
Inspecionar o nó
Utilize a opção inspect para visualizar informações sobre o nó:
1 docker node inspect worker01
Utilize a opção inspect para filtrar informações sobre os labels do nó worker01:
1 docker node inspect --pretty worker01 | grep Labels -A 2
Resultado do comando:
1 Labels:
2 - cloud=aws
3 Hostname: worker01
Utilize a opção inspect para filtrar informações sobre os labels do nó worker02:
1 docker node inspect --pretty worker02 | grep Labels -A 2
Resultado do comando:
1 Labels:
2 - cloud=azure
3 Hostname: worker02
Para remover o label utilize o mesmo comando alterando --label-add (onde -add seria
adicionar) por --label-rm (onde -rm seria remover).
Remover nó do Cluster
Para remover um nó do Cluster, utilize a opção rm juntamente com a opção --force:
1 docker node rm worker01 --force
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
154 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 docker node ls
Alterne para a máquina virtual Worker 01 e abandone o cluster através do seguinte comando:
1 docker swarm leave
Para ingressar novamente no Cluster, colete novamente o token na máquina virtual Manager:
1 docker swarm join-token worker
E execute o comando docker swarm join na máquina virtual Worker01 conforme o resultado
do comando anterior.
Alterne para o nó Manager e defina novamente o label cloud=aws para o nó worker01:
1 docker node update --label-add cloud=aws worker01
Promoção dos nós no Cluster
Antes de promover um nó a manager, liste os servidores que participam do Cluster:
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2
3 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
4 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
5 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
O valor Leader na coluna MANAGER STATUS define que o nó é o manager e realiza todo
o gerenciamento do cluster. O valor Reachable significa que o nó é um nó manager
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
155 8. GERENCIAR CLUSTER COM DOCKER SWARM
que participa do cluster Se o nó líder ficar indisponível, ele estará qualificado para a
eleição como o novo líder. O valor Unavailable significa que o nó é um gerente não
pode se comunicar com outros gerentes.
Em nosso exemplo, vamos promover a máquina virtual Worker01 para nó manager:
1 docker node promote worker01
Resultado do comando:
1 Node worker01 promoted to a manager in the swarm.
Liste novamente os servidores o verifique que o nó worker01 possui o status Reachable:
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2
3 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
4 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active Reachable
19.03.8
5 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Remova a função manager da máquina Manager através da opção demote:
1 docker node demote manager
Resultado do comando:
1 Manager manager demoted in the swarm.
Alterne para a máquina Worker01 que agora faz o papel de Manager e liste novamente os
servidores que participam do cluster:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
156 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2
3 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active
19.03.8
4 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active Leader
19.03.8
5 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Reverter promoção de um nó
Na máquina Worker 01, promova a máquina Manager a nó manager:
1 docker node promote manager
Resultado do comando
1 Node manager promoted to a manager in the swarm.
Remova a função manager da máquina Worker01 através da opção demote:
1 docker node demote worker01
Resultado do comando:
1 Manager worker01 demoted in the swarm.
Alterne para a máquina Manager e liste os servidores que participam do cluster:
1 docker node ls
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
157 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2
3 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
4 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
5 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Descrição dos Comandos
• docker node update: atualiza informações de um nó no cluster Swarm;
• docker node inspect: exibe informações detalhadas de um nó no cluster Swarm;
• docker node rm: remove o nó de um cluster Swarm;
• docker swarm leave: permite que o nó abandone o cluster Swarm;
• docker node promote: permite promover um nó a manager do cluster Swarm;
• docker node demote: permite rebaixar um nó manager do cluster Swarm.
Manutenção no cluster Swarm
Considere que o có do cluster Swarm precisa de uma manutenção, como por exemplo em
uma atualização do sistema operacional que requer uma reinicialização ou uma atualização no
Docker. Para realizar a manutenção do nó, deixo-o em modo de drenagem. O Swarm permite
definir três tipos de estado para o nó:
• Active: significa que eles são membros normais do cluster swarm e podem ter con-
taineres em execução e novos agendados;
• Pause: significa que todos os containeres em execução são deixados como estão, mas
nenhum novo container será agendado no nó;
• Drain: significa que não há novos containeres programados e que os containeres exis-
tentes são normalmente encerrados e realocados para outro nó.
LAB 6.3 – Realizar manutenção no cluster Swarm
Neste laboratório vamos aprender como realizar a manutenção no cluster Swarm, alterando o
estado de um nó.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
158 8. GERENCIAR CLUSTER COM DOCKER SWARM
Verifique o estado de cada nó do cluster Swarm:
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
3 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
4 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Crie um serviço para a aplicação Nginx com duas réplicas para testar a disponibilidade do nó:
1 docker service create --name webserver --replicas=2 nginx
Verifique se o nó Worker 01 ou Worker 02 possui pelo menos uma cópia do container nginx:
1 docker service ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 0o08di4kbzla webserver.1 nginx:latest manager Running Running 17
seconds ago
3 o0rxwtmkqy6v webserver.2 nginx:latest worker01 Running Running 17
seconds ago
O manager verifica a disponibilidade de todos os nós do cluster durante a criação
do serviço, sendo assim, o container webserver pode ser alocado em qualquer nó do
cluster.
Pause
Altere o estado do nó Worker 01 para Pause e verifique o estado do mesmo:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
159 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 docker node update --availability pause worker01
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
3 bubiu21p2amsvj4lgix8gt4np worker01Ready Pause
19.03.8
4 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Altere para 5 a quantidade de réplicas do serviço webserver:
1 docker service scale webserver=5
Liste os containers em cada nó e perceba que o nó Worker 01 não recebeu novas réplicas:
1 docker service ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 0o08di4kbzla webserver.1 nginx:latest manager Running Running 5
minutes ago
3 o0rxwtmkqy6v webserver.2 nginx:latest worker01 Running Running 5
minutes ago
4 69jqltvon86d webserver.3 nginx:latest worker02 Running Running 9
seconds ago
5 rdqmhp5omut7 webserver.4 nginx:latest manager Running Running 10
seconds ago
6 jscakrx9e1i5 webserver.5 nginx:latest worker02 Running Running 9
seconds ago
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
160 8. GERENCIAR CLUSTER COM DOCKER SWARM
Active
Altere para Active o estado do nó Worker 01, antes de continuar o laboratório:
1 docker node update --availability active worker01
Drain
Vamos migrar os containers do nó Worker 02 mudando seu estado para Drain:
1 docker node update --availability drain worker02
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
3 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
4 fdi5n76upcedwaziocung42bn worker02 Ready Drain
19.03.8
Liste os containers em cada nó e perceba que os containers do Worker 02 foram reagendadas
para outros nós:
1 docker service ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 0o08di4kbzla webserver.1 nginx:latest manager Running Running 10
minutes ago
3 o0rxwtmkqy6v webserver.2 nginx:latest worker01 Running Running 10
minutes ago
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
161 8. GERENCIAR CLUSTER COM DOCKER SWARM
4 b0v8qlqhtqco webserver.3 nginx:latest worker01 Running Running 26
seconds ago
5 69jqltvon86d \_ webserver.3 nginx:latest worker02 Shutdown Shutdown 26
seconds ago
6 rdqmhp5omut7 webserver.4 nginx:latest manager Running Running 4
minutes ago
7 9zghl22xtdvp webserver.5 nginx:latest worker01 Running Running 26
seconds ago
8 jscakrx9e1i5 \_ webserver.5 nginx:latest worker02 Shutdown Shutdown 26
seconds ago
Altere para Active o estado do nó Worker 02 e remova o serviço webserver para terminar o
laboratório:
1 docker node update --availability active worker02
1 docker service rm webserver
Lock e Unlock
Para travar o cluster utilize a opção autolock do comando docker swam update:
1 docker swarm update --autolock=true
Resultado do comando:
1 Swarm updated.
2 To unlock a swarm manager after it restarts, run the docker swarm unlock
3 command and provide the following key:
4
5 SWMKEY-1-VnjU0lKESiX6GVJvHoNJVrN4Cb64Qo35gvzxtwqbJvQ
6
7 Please remember to store this key in a password manager, since without it you
8 will not be able to restart the manager.
É muito importante guardar essa chave paara que seja possível destravar o cluster.
Para exibir novamente a chave, antes da efetivar a trava execute:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
162 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 docker swarm unlock-key
Resultado do comando:
Fig. 8.5: docker-swarm-autolock
Reinicie o serviço do Docker para efetivar a trava:
1 sudo systemctl restart docker
Verifique se o Cluster esta travado, listando os nós:
1 docker node ls
Resultado do comando:
1 Error response from daemon: Swarm is encrypted and needs to be unlocked before
it can be used. Please use "docker swarm unlock" to unlock it.
É exibida a mensagem informando que precisamos destravar o cluster através do comando
docker swarm unlock. Será preciso informar a chave guardada anteriormente.
1 docker swarm unlock
Resultado do comando:
1 Please enter unlock key: <adicione_sua_chave>
Verifique que agora é possível listar os nós do Cluster:
1 docker node ls
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
163 8. GERENCIAR CLUSTER COM DOCKER SWARM
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
3 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
4 fdi5n76upcedwaziocung42bn worker02 Ready Drain
19.03.8
Para impedir um novo lock automático após o restart, execute os seguintes comandos:
1 docker swarm update --autolock=false
1 sudo systemctl restart docker
Descrição dos comandos
• docker swarm update --autolock: cria uma trava automática do cluster Swarm, após
o reinício do daemon do Docker. Para habilitar ou desabilitar utilize os valore true e
false;
• docker swarm unlock-key: exibe a chave utilizada para destravar o cluster Swarm;
• docker swarm unlock: destravar o cluster Swarm.
No próximo capítulo vamos tratar do gerenciamento de serviços e tarefas em clusters Swarm.
Links
[1] Docker Swarm: https://docs.docker.com/engine/swarm/key-concepts/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
9
Gerenciamento de serviços no
Docker Swarm
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Orchestration (25% of exam)
LPI DevOps Tools Engineer Container Deployment and Orchestration
(weight: 5)
Serviços e tarefas
Conceitos
Um serviço é a definição das tarefas a serem executadas nos nós manager ou worker. É a
estrutura central do sistema do cluster Swarm e a raiz principal da interação do usuário com
o Swarm [1].
Ao criar um serviço, você especifica qual imagem do container usar e quais comandos executar
dentro dos containers em execução.
No modelo de serviços replicados, o manager distribui um número específico de tarefas de
164
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
165 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
réplica entre os nós, com base na escala que você definiu no estado desejado.
Para serviços globais, o Swarm executa uma tarefa para o serviço em cada nó disponível no
cluster.
Uma tarefa carrega um container do Docker e os comandos para serem executados dentro do
container. É a unidade de programação atômica do Swarm. Os nós manager atribuem tarefas
aos nós worker, de acordo com o número de réplicas definidas na escala de serviço. Quando
uma tarefa é atribuída a um nó, ela não pode ser movida para outro nó. Ele só pode ser
executado no nó atribuído ou falhar.
Tarefas e agendamento
Uma tarefa é a unidade atômica de agendamento dentro de um cluster Swarm. Quando você
declara um estado de serviço desejado, criando ou atualizando um serviço, o orquestrador
percebe o estado desejado agendando tarefas. Por exemplo, você define um serviço que
instrui o orquestrador a manter três instâncias do servidor HTTP em execução. O orquestrador
responde criando três tarefas. Cada tarefa é um slot que o agendador preenche, gerando um
container. O container é a instanciação da tarefa. Se uma tarefa do servidor HTTP falhar em
sua verificação de integridade ou travar, o orquestrador criará uma nova tarefa de réplica que
gerará um novo container.
Uma tarefa é um mecanismo unidirecional. Ele progride constantemente por meio de uma
série de estados: atribuído, preparado, em execução etc. Se a tarefa falhar, o orquestrador
removerá a tarefa de seu container e criará uma nova tarefa para substituí-la de acordo com
o estado desejado especificado pelo serviço.
A lógica fundamental do modo do cluster Docker Swarm, é um agendador (scheduler) e um
orquestrador (orchestrator) de uso geral. Os serviço e tarefas são abstrações e não têm con-
hecimento dos containers implementados. Hipoteticamente, você poderia implementar outros
tipos de tarefas, como tarefas de máquina virtual ou tarefas de processo não conteinerizadas.
O agendador e o orquestrador são agnósticos sobre o tipo de tarefa.
Serviços replicados e globais
Existem doistipos de implantações de serviços: replicados e globais.
Para um serviço replicado, você especifica o número de tarefas idênticas que deseja executar.
Por exemplo, você decide implantar um serviço HTTP com três réplicas, cada uma servindo
o mesmo conteúdo.
Já o serviço global, é um serviço que executa uma tarefa em cada nó. Não há um número pré-
especificado de tarefas. Cada vez que for adicionado um nó ao cluster Swarm, o orquestrador
cria uma tarefa e o agendador atribui a tarefa ao novo nó.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
166 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
Bons candidatos para serviços globais são agentes de monitoramento, softwares de antivírus
ou outros tipos de containers que desejamos executar em todos os nós do cluster Swarm.
LAB 7.1 – Gerenciar serviço no cluster Swarm
Neste laboratório vamos aprender como gerenciar serviços no Docker Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, inicie as VMs
utilizando o subcomando up do Vagrant e em seguida, acesse a máquina virtual Manager,
através do vagrant ssh e alterne para a conta do usuário suporte.
Criar um serviço
Para criar um serviço no cluster Swarm execute o comando:
1 docker service create --name webserver nginx
Liste os serviços para validar o comando anterior:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 uj9fmyd84z70 webserver replicated 1/1 nginx
Para exibir detalhes de um serviço no Cluster, execute o seguinte comando:
1 docker service inspect --pretty webserver
Resultado do comando:
1 ID: iggfyp4tbvq0ya97uanod452z
2 Name: webserver
3 Service Mode: Replicated
4 Replicas: 1
5 Placement:
6 UpdateConfig:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
167 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
7 Parallelism: 1
8 On failure: pause
9 Monitoring Period: 5s
10 Max failure ratio: 0
11 Update order: stop-first
12 RollbackConfig:
13 Parallelism: 1
14 On failure: pause
15 Monitoring Period: 5s
16 Max failure ratio: 0
17 Rollback order: stop-first
18 ContainerSpec:
19 Image: nginx:latest@sha256:86
ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12
20 Init: false
21 Resources:
22 Endpoint Mode: vip
Atualizar serviço
Para atualizar um serviço expondo uma porta no container, execute o seguinte comando:
1 docker service update --publish-add 80 webserver
O subcomando update do comando docker service, permite atualizar redes, volumes,
portas, entre outros componentes de um serviço em execução. No exemplo apre-
sentado, estamos atualizando o serviço webserver e mapeando a porta 80 para o
container.
Liste os serviços para validar o comando anterior:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 uj9fmyd84z70 webserver replicated 1/1 nginx:latest *:30000->80/tcp
O Docker Swarm utiliza como padrão o modo ingress que permite o acesso a aplicação
NGINX, em todos os nós do Cluster através de seu IP e uma porta aleatória criada.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
168 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
Escalonar serviço
Para atualizar a quantidade de réplicas, execute o seguinte comando:
1 docker service scale webserver=2
Liste os serviços para validar o comando anterior:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 kplq2idr7abt webserver replicated 2/2 nginx:latest *:30000->80/tcp
Utilize o subcomando ps para listar a quantidade de containers no serviço:
1 docker service ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 vbns5n8goq6d webserver.1 nginx:latest worker02 Running Running 50 seconds
ago
3 hditoelguaig webserver.2 nginx:latest worker01 Running Running 9 seconds
ago
Rollback de serviço
Para reverter uma mudança em um serviço, execute o seguinte comando:
1 docker service rollback webserver
Liste os serviços e verifique que a quantidade de réplicas foi revertida para 1:
1 docker service ls
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
169 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 uj9fmyd84z70 webserver replicated 1/1 nginx *:30001->80/tcp
Remover serviço
Para remover um serviço utilize a opção rm:
1 docker service rm webserver
Liste os serviços para validar o comando anterior:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
Alterar o modo de replicação em um serviço
Crie novamente o serviço de nome webserver, só que agora mudando o modo de replicação
para global:
1 docker service create --name webserver --mode global httpd
Liste o serviços para confirmar o modo de replicação:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 0ydgyts06qwc webserver global 3/3 httpd:latest
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
170 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
No modo global o serviço cria um container em cada nó do Cluster.
Visualizar logs de serviço
Para remover um serviço utilize a opção rm:
1 docker service logs webserver
Para acompanhar em tempo real os logs de um serviço utilize a opção --follow ou -f:
1 docker service logs --follow webserver
Utilize as teclas Ctrl + C para destravar o terminal.
Remova novamente o serviço webserver:
1 docker service rm webserver
Limitar recursos computacionais em um serviço
Para criar um serviço limitando o uso de 20% de 1 CORE do processador e o uso de apenas
512 de memória RAM, execute o seguinte comando:
1 docker service create --name webserver --publish target=80,published=80 --
replicas=3 --limit-cpu 0.2 --limit-memory 256M nginx
Inspecione o serviço para validar os limites aplicados:
1 docker service inspect webserver | grep Resources -A 3
Resultado do comando:
1 "Resources": {
2 "Limits": {
3 "NanoCPUs": 200000000,
4 "MemoryBytes": 268435456
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
171 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
Para terminar remova o serviço webserver:
1 docker service rm webserver
Descrição dos comandos e opções
• docker service --help: lista as opções do subcomando docker service e sua descrição;
• docker service create: cria um serviço no cluster Swarm;
• docker service ls: lista serviços disponíveis no cluster Swarm;
• docker service inspect: exibe detalhes de um serviço no cluster Swarm. A opção --
pretty, exibe os detalhes de forma resumida;
• docker service scale: permite escalonar o serviço, aumentando a quantidade de con-
tainers que atenderão o seu serviço;
• docker service ps: lista serviços disponíveis no cluster Swarm;
• docker service rollback: permite reverter para a versão anterior de um serviço. Depois
de executar este comando, o serviço é revertido para a configuração que estava em vigor
antes do comando docker service update mais recente;
• docker service logs: visualiza os logs de um serviço, disponível no cluster Swarm;
• docker service rm: remove um serviço disponível no cluster Swarm.
• --limit-cpu: aceita um número decimal como argumento e limita os recursos da CPU
de um serviço;
• --limit-memory: leva bytes como argumento, por exemplo 2G e limita o uso de memória
a esse valor;
• --reserve-cpu: reserva uma quantidade específica de recursos da CPU para o serviço;
• --reserve-memory: reserva uma quantidade específica de recursos de memória para o
serviço.
LAB 7.2 – Utilizar redes overlay no cluster Swarm
Neste laboratório vamos aprender como gerenciar redes do tipo overlay no Docker.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux e em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Criar rede do tipo overlay
Para criar uma rede do tipo overlay, execute o seguinte comando:
1 docker network create -d overlay web
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
172 9. GERENCIAMENTO DE SERVIÇOS NO DOCKERSWARM
Verifique se a rede foi criada corretamente no Docker:
1 docker network ls | grep swarm
Resultado do comando:
1 okqwubwscnsj ingress overlay swarm
2 tfj5lbo9zod0 web overlay swarm
Para exibir informações detalhadas sobre a rede, execute o seguinte comando:
1 docker network inspect web
Resultado do comando:
1 [
2 {
3 "Name": "web",
4 "Id": "tfj5lbo9zod04lpxx5p0v8z3e",
5 "Created": "2020-05-04T22:48:49.102300651Z",
6 "Scope": "swarm",
7 "Driver": "overlay",
8 "EnableIPv6": false,
9 "IPAM": {
10 "Driver": "default",
11 "Options": null,
12 "Config": [
13 {
14 "Subnet": "10.0.1.0/24",
15 "Gateway": "10.0.1.1"
16 }
17 ]
18 },
19 "Internal": false,
20 "Attachable": false,
21 "Ingress": false,
22 "ConfigFrom": {
23 "Network": ""
24 },
25 "ConfigOnly": false,
26 "Containers": null,
27 "Options": {
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
173 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
28 "com.docker.network.driver.overlay.vxlanid_list": "4097"
29 },
30 "Labels": null
31 }
32 ]
Criar rede utilizando o plugin Weave Net
Para criar uma rede com o plugin Weave Net, execute o seguinte comando:
1 docker network create --driver=store/weaveworks/net-plugin:2.5.2 weavenet
Verifique se a rede foi criada corretamente no Docker:
1 docker network ls | grep swarm
Resultado do comando:
1 okqwubwscnsj ingress overlay
swarm
2 tfj5lbo9zod0 web overlay
swarm
3 2mbxsxfkm4mb weavenet store/weaveworks/net-plugin:2.5.2
swarm
Para exibir informações detalhadas sobre a rede, execute o seguinte comando:
1 docker network inspect weavenet
Resultado do comando:
1 [
2 {
3 "Name": "weavenet",
4 "Id": "2mbxsxfkm4mbic21azxet83tc",
5 "Created": "2020-05-04T23:15:12.268984263Z",
6 "Scope": "swarm",
7 "Driver": "store/weaveworks/net-plugin:2.5.2",
8 "EnableIPv6": false,
9 "IPAM": {
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
174 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
10 "Driver": "default",
11 "Options": null,
12 "Config": [
13 {
14 "Subnet": "10.0.2.0/24",
15 "Gateway": "10.0.2.1"
16 }
17 ]
18 },
19 "Internal": false,
20 "Attachable": false,
21 "Ingress": false,
22 "ConfigFrom": {
23 "Network": ""
24 },
25 "ConfigOnly": false,
26 "Containers": null,
27 "Options": null,
28 "Labels": null
29 }
30 ]
LAB 7.3 – Utilizar rede e volume em serviços
Neste laboratório vamos aprender como gerenciar serviços com rede do tipo overlay e volume
no Docker Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux e em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Criar volume persistente para servidor web
No capítulo sobre volumes instalamos nas máquinas virtuais Worker 01 e 02 , o plugin de
volume NFS e criamos um volume de nome volume_nfs.
Repita os passos na máquina virtual Manager, com a finalidade de atender a aplicação do
webserver.
1 docker plugin install trajano/nfs-volume-plugin --grant-all-permissions
2 docker volume create -d trajano/nfs-volume-plugin --opt device=registry:/home/
suporte/storage/web_data volume_nfs
Crie um serviço com a rede overlay, para mapear a porta 80 em cada nó do Cluster. Utilize
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
175 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
a imagem webserver-wordpress em nosso registro interno.
1 docker service create --name webserver --with-registry-auth --publish target=80,
published=80 --replicas=3 --network web --mount source=volume_nfs,target=/
var/www/html registry:5000/webserver-wordpress:latest
No exemplo apresentado, estamos criando um serviço para executar o container com
a imagem webserver-wordpress na porta 80 com 3 réplicas. No exemplo, utilizamos a
rede web que utiliza o driver overlay e o volume_nfs que possui dados compartilhados
por um servidor NFS.
A flag --with-registry-auth permite enviar detalhes de autenticação do servidor de
registro para agentes do cluster Swarm.
Liste os serviços para validar o comando anterior:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS
IMAGE PORTS
2 zb4s7kjbxtgn webserver replicated 3/3
registry:5000/webserver-wordpress:latest *:80->80/tcp
Para exibir detalhes de um serviço no Cluster, execute o seguinte comando:
1 docker service inspect --pretty webserver | grep ContainerSpec -A 20
Resultado do comando:
1 ContainerSpec:
2 Image: registry:5000/webserver-wordpress:latest@sha256:4
a4aaeaac8f7e3e837f184dd6658ee7d505c753757bb868915f0e2a67a498092
3 Init: false
4 Mounts:
5 Target: /var/www/html
6 Source: volume_nfs
7 ReadOnly: false
8 Type: volume
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
176 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
9 Resources:
10 Networks: web
11 Endpoint Mode: vip
12 Ports:
13 PublishedPort = 80
14 Protocol = tcp
15 TargetPort = 80
16 PublishMode = ingress
Acesse através do navegador web do seu computador, o IP das máquinas virtuais Manager,
Worker 01 e Worker 02:
Manager: http://172.16.0.100
Fig. 9.1: Replica da Aplicação na Manager
Worker 01: http://172.16.0.101
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
177 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
Fig. 9.2: Replica da Aplicação na Worker01
Worker 02: http://172.16.0.102
Fig. 9.3: Replica da Aplicação na Worker02
Para terminar remova o serviço webserver:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
178 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
1 docker service rm webserver
LAB 7.4 – Utilizar secrets em serviços
Neste laboratório vamos aprender como gerenciar secrets em serviços no Docker Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux e em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Verifique se não há mais serviços e containers disponíveis:
1 docker secret --help
Crie uma nova senha que será usada para acessar o servidor de banco de dados MySQL:
1 echo ’minhasenhamysql’ | docker secret create senha_mysql -
Liste e inspecione a senha criada no Docker:
1 docker secret ls
Resultado do comando:
1 ID NAME DRIVER CREATED
UPDATED
2 9hqxiop1f8na340j3a7p6nmdm senha_mysql 5 seconds
ago 5 seconds ago
1 docker secret inspect senha_mysql
Resultado do comando:
1 [
2 {
3 "ID": "9hqxiop1f8na340j3a7p6nmdm",
4 "Version": {
5 "Index": 1194
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
179 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
6 },
7 "CreatedAt": "2020-05-05T00:14:41.960001452Z",
8 "UpdatedAt": "2020-05-05T00:14:41.960001452Z",
9 "Spec": {
10 "Name": "senha_mysql",
11 "Labels": {}
12 }
13 }
14 ]
Para testar a senha, crie um novo serviço, utilizando o valor senha_mysql como senha do banco:
1 docker service create --replicas 1 --name servidor_mysql --publish 3306:3306/tcp
--update-delay 10s --constraint node.role==manager --secret senha_mysql -e
MYSQL_ROOT_PASSWORD_FILE=/run/secrets/senha_mysql mysql:5.7
A flag --constraint permite definir em qual nó o serviço será alocado, a partir dos
metadados específicos daquele nó. No exemplo, o rótulo node.role com o valor
manager, irá agendar a execução do container no nó Manager.
Para listar os serviços criados, execute o seguinte comando:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 4u3ofwa7lo1v servidor_mysql replicated 1/1 mysql:5.7
*:3306->3306/tcp
Antes de testar o acesso ao container é preciso instalar o cliente MySQL:
1 sudo yum install mariadb -y
Teste o acesso ao container, utilizando a senha do Docker secret:
1 mysql -h manager -u root -pminhasenhamysql
Liste os bancos de dados e abandone o prompt MySQL, através dos seguintes comandos:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
180 9. GERENCIAMENTO DE SERVIÇOS NO DOCKER SWARM
1 SHOW DATABASES;
2 +--------------------+
3 | Database |
4 +--------------------+
5 | information_schema |
6 | mysql |
7 | performance_schema |
8 | sys |
9 +--------------------+10 EXIT
Para terminar, remova e liste o serviço do servidor_mysql:
1 docker service rm servidor_mysql
1 docker service ls
Descrição dos comandos
• docker secret --help: lista as opções do subcomando docker create e sua descrição;
• docker secret create: cria uma senha no serviço de senhas do Docker. O conteúdo
da senha será armazenada no arquivo /run/secrets/<nome_do_secret> no container em
execução;
• docker secret ls: lista senhas, disponíveis e armazenadas no Docker;
• docker secret inspect: exibe detalhes de uma senha armazenada no Docker;
• --secret: define uma senha armazenada no Docker, durante a execução do container;
• -e MYSQL_ROOT_PASSWORD_FILE: define o caminho de um arquivo no container, que será
utilizado como senha do usuário root do MySQL.
Links
[1] Serviços Swarm: https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
10
Routing Mesh e balanceamento
de carga
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Orchestration (25% of exam)
LPI DevOps Tools Engineer Container Deployment and Orchestration
(weight: 5)
Introdução ao Routing Mesh
Conceitos
O Swarm utiliza como padrão o Routing Mesh (malha de roteamento) [1] que é um balanceador
de carga da camada de transporte (L4) em nível de cluster que roteia todas as solicitações
recebidas no Swarm para as portas publicadas de um contêiner disponível em um nó. Ele
permite que todos os nós do Swarm aceitem conexões nas portas publicadas dos serviços.
A imagem a seguir ilustra como a malha de roteamento funciona:
181
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
182 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Fig. 10.1: Exemplo de Routing Mesh
1. Uma rede do tipo overlay de nome appnet é utiliza pela aplicação (docker network
create -d overlay appnet);
2. Um serviço é criado com duas réplicas e a porta é mapeada externamente para a porta
8000 (docker service create --name app --replicas 2 --network appnet --publish 8000:80
nginx);
3. A malha de roteamento expõe a porta 8000 em cada host no cluster (--publish 8000:80
);
4. O tráfego destinado ao aplicativo pode entrar em qualquer host. Nesse caso, o bal-
anceador de carga externo envia o tráfego para um host sem uma réplica de serviço;
5. O balanceador de carga IPVS do kernel redireciona o tráfego na rede overlay de entrada
para uma réplica do serviço. Vale lembrar que o IPVS (IP Virtual Server) é construído
sobre o Netfilter e implementa o balanceamento de carga da camada de transporte como
parte do kernel do Linux.
Routing Mesh: Ingress x Host
Você pode ignorar a malha de roteamento, para que, ao acessar a porta ligada em um de-
terminado nó, esteja sempre acessando a instância do serviço em execução nesse nó. Isso é
chamado de modo host. Exemplo:
1 docker service create --name nginx --replicas 2 --network web --publish
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
183 10. ROUTING MESH E BALANCEAMENTO DE CARGA
published=8000,target=80,protocol=tcp,mode=host nginx
Se você acessar um nó que não está executando uma tarefa de serviço, o serviço não irá
monitorar nessa porta. É possível que nada esteja sendo monitorado ou que um aplicativo
completamente diferente esteja sendo monitorado.
Para ignorar a malha de roteamento, você deve usar --publish published=<port>,target=<
port>,protcol=tcp,mode=host. Se omitir a opção mode=host o Swarm irá utilizar como padrão
mode=ingress.
LAB 8.1 – Gerenciar serviços no modo ingress
Neste laboratório vamos aprender como gerenciar serviços na malha de roteamento do Docker
Swarm, utilizando o modo ingress [2].
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, inicie as máquinas
virtuais utilizando o subcomando up do Vagrant e em seguida, acesse a máquina virtual Man-
ager, através do vagrant ssh alternando para a conta do usuário suporte.
Antes de testar o funcionamento da malha de roteamento, verifique os labels do nó worker01:
1 docker node inspect --pretty worker01 | grep Labels -A 2
Resultado do comando:
1 Labels:
2 - cloud=aws
3 Hostname: worker01
Verifique os labels do nó worker02:
1 docker node inspect --pretty worker02 | grep Labels -A 2
Resultado do comando:
1 Labels:
2 - cloud=azure
3 Hostname: worker02
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
184 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Se os nós do cluster não possuírem labels, adicione através dos seguintes comandos:
1 docker node update --label-add clou=aws worker01
1 docker node update --label-add cloud=azure worker02
Em seguida crie um serviço com as seguintes informações:
Opções Parâmetros
Nome: nginx
Réplicas: 1
Rede overlay: web
Porta externa: 8000
Porta do container: 80
Regra de agendamento: Label cloud==azure
Imagem Docker Hub: nginx
1 docker service create --name nginx --replicas 1 --network web --publish 8000:80
--constraint node.labels.cloud==azure nginx
A flag --constraint permite definir em qual nó o serviço será alocado, a partir dos
metadados específicos daquele nó. No exemplo, o label node.labels.cloud com o
valor azure, irá agendar a execução do container no nó worker02.
Confirme se o serviço esta em execução e se o container está sendo executado na máquina
virtual worker02:
1 docker service ls
• Resultado do Comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 l3xbug2pl8gf nginx replicated 1/1 nginx:latest
*:8000->80/tcp
1 docker service ps nginx
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
185 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
PORTS
2 z9er9bx4moms nginx.1 nginx:latest worker02 Running Running 19 seconds
ago
Mesmo que o container esteja sendo executado no nó worker02, a aplicação Nginx
estará disponível em todos os nós através do IP do nó na porta 8000. O Swarm utiliza
o método Ingress como padrão.
Acesse no navegador web do seu computador, as máquinas virtuais Manager, Worker 01 e
Worker 02 na porta 8000:
Manager: http://172.16.0.100:8000
Fig. 10.2: Rounting Mesh - Ingress - Manager
Worker 01: http://172.16.0.101:8000
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
186 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Fig. 10.3: Rounting Mesh - Ingress - Worker 01
Worker 02: http://172.16.0.102:8000
Fig. 10.4: Rounting Mesh - Ingress - Worker 02
Vamos trocar a aplicação de nó para testar o comportamento da malha de roteamento:
1 docker service update --constraint-rm ’node.labels.cloud==azure’ --constraint-
add node.labels.cloud==aws nginx
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
187 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Confirme se o container agora está sendo executado na máquina virtual worker01:
1 docker service ps nginx
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 jookm4mab3us nginx.1 nginx:latest worker01 Running Running 40
seconds ago
3 z9er9bx4moms \_ nginx.1 nginx:latest worker02 Shutdown Shutdown 41
seconds ago
Mesmo que agora o container esteja sendo executado no nó worker01, a aplicação
Nginx continua disponível em todos os nós através do IP do nó na porta 8000.
Worker 02: http://172.16.0.102:8000
Fig. 10.5: Modo Ingress - Worker 02
Para terminar esse laboratório, remova o serviço Nginx:
1 docker service rm nginx
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
188 10. ROUTING MESH E BALANCEAMENTO DE CARGA
LAB 8.2 – Gerenciar serviços no modo host
Neste laboratório vamos aprender como gerenciar serviços na malha de roteamento do Docker
Swarm, utilizando o modo host.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux e em seguida, acesse
a máquina virtual Worker 01, através do vagrant ssh, alternando a conta do usuário para
suporte.
Crie um serviço com as mesmas informações do laboratório anterior, adicionando o modo host:
1 docker servicecreate --name nginx --replicas 1 --network web --publish
published=8000,target=80,protocol=tcp,mode=host --constraint node.labels.
cloud==azure nginx
Confirme se o serviço esta em execução e se o container está sendo executado na máquina
virtual worker02:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 5zmy9bq7471v nginx replicated 1/1 nginx:latest
1 docker service ps nginx
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
PORTS
2 zpoqy1wm6wsk nginx.1 nginx:latest worker02 Running Running about a
minute ago *:8000->80/tcp
Como estamos utilizando o modo host, a aplicação estará disponível somente no nó
worker02, através do IP do nó na porta 8000.
Acesse no navegador web do seu computador os IP das máquinas virtuais Worker 01 e Worker
02 na porta 8000:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
189 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Worker 01: http://172.16.0.101:8000
Fig. 10.6: Modo Host - Worker 01 - Down
Worker 02: http://172.16.0.102:8000
Fig. 10.7: Modo Host - Worker 02 - UP
Vamos trocar a aplicação de nó para testar o comportamento do modo host:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
190 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 docker service update --constraint-rm ’node.labels.cloud==azure’ --constraint-
add node.labels.cloud==aws nginx
Confirme se o container agora está sendo executado na máquina virtual worker01:
1 docker service ps nginx
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 m08bed9d6cof nginx.1 nginx:latest worker01 Running Running 7
seconds ago *:8000->80/tcp
3 zpoqy1wm6wsk \_ nginx.1 nginx:latest worker02 Shutdown Shutdown 8
seconds ago
Como estamos utilizando o modo host, a aplicação agora estará disponível somente
no nó worker01, através do IP do nó na porta 8000.
Worker 01: http://172.16.0.101:8000
Fig. 10.8: Modo Host - Worker 01 - UP
Worker 02: http://172.16.0.102:8000
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
191 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Fig. 10.9: Modo Host - Worker 02 - DOWN
Para terminar esse laboratório, remova o serviço Nginx:
1 docker service rm nginx
Descoberta de serviços: VIP e DNSRR
O Docker Swarm conta com duas opções para a Service Discovery :
• VIP: é o padrão que utiliza o recurso de balanceamento de carga IPVS, que faz parte
do kernel do Linux. A descoberta VIP significa que cada serviço obtém um endereço IP
virtual. A resolução DNS do Docker sempre retorna o mesmo endereço IP virtual e o
consumidor usa o IPVS para carregar o equilíbrio entre os contêineres nesse IP virtual.
• DNSRR: significa que cada contêiner em um serviço tem seu próprio endereço IP e
a resolução DNS faz o balanceamento de carga. Ele alterna entre os contêineres no
serviço, para que cada consulta DNS obtenha uma resposta diferente. No nível da rede,
o DNSRR é o roteamento da camada 7 e o VIP é o roteamento da camada 3/4.
VIP x DNSRR
O VIP é mais eficiente de duas maneiras:
• É mais eficiente em nível da rede, porque é executado em um nível inferior na pilha de
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
192 10. ROUTING MESH E BALANCEAMENTO DE CARGA
rede e usa o balanceamento de carga no modo kernel.
• Também pode ter melhor desempenho no nível do aplicativo. A maioria das pilhas de
aplicativos faz cache de DNS para economizar em pesquisas no servidor DNS. Isso é
bom no modo VIP, porque existe apenas um IP de serviço, então o aplicativo pode
armazenar em cache o quanto quiser. Mas no DNSRR, o aplicativo pode armazenar em
cache apenas um dos muitos endereços IP do contêiner.
LAB 8.3 – Descoberta de serviços: VIP e DNSRR
Neste laboratório vamos entender na prática como funciona a descoberta de serviços no modo
VIP e DNSR.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux e em seguida, acesse
a máquina virtual Manager, através do vagrant ssh, alternando para a conta do usuário
suporte.
VIP Mode
Em seguida crie um serviço no modo VIP para a aplicação Nginx com 2 réplicas em nós
workers:
1 docker service create --name webserver1 --network web --replicas 2 --constraint
node.role==worker --endpoint-mode vip nginx
Inspecione o serviço webserver1 para confirmar o mode de descoberta VIP:
1 docker service inspect --pretty webserver1 | grep Endpoint
Resultado do comando:
1 Endpoint Mode: vip
Inspecione o serviço webserver1 e verifique que o mesmo possui um IP fixo:
1 docker service inspect -f ’{{json .Endpoint.VirtualIPs}}’ webserver1
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
193 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 [{"NetworkID":"u7v9mnsdv45at8283k73jbbtk","Addr":"10.0.3.78/24"}]
DNSRR Mode
Crie um serviço no modo DNSRR para aplicação Nginx com 2 réplicas em nós workers:
1 docker service create --name webserver2 --network web --replicas 2 --constraint
node.role==worker --endpoint-mode dnsrr nginx
Inspecione o serviço webserver2 para confirmar o modo de descoberta VIP:
1 docker service inspect --pretty webserver2 | grep Endpoint
Resultado do comando
1 Endpoint Mode: dnsrr
Inspecione o serviço webserver2 e verifique que o mesmo não possui um IP fixo:
1 docker service inspect -f ’{{json .Endpoint.VirtualIPs}}’ webserver2
Resultado do comando:
1 null
Testar a descoberta de serviços
Crie um serviço utilizando a imagem busybox:1.28 na mesma rede que os serviços webserver1
e webserver2:
1 docker service create --name client --network web --constraint node.role==
manager busybox:1.28 sleep 3000
Antes de continuar, armazene na variável CONTAINER o ID do container client:
1 CONTAINER=$(docker container ls | grep client | awk -F" " ’{print $1}’)
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
194 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Verifique que o serviço webserver1 possui um IP fixo:
1 docker container exec -it $CONTAINER nslookup webserver1
Resultado do comando:
1 Server: 127.0.0.11
2 Address 1: 127.0.0.11
3
4 Name: webserver1
5 Address 1: 10.0.3.78
O endereço virtual pode ser diferente do resultado apresentado no comando acima.
Teste a conectividade com o serviço webserver1 e perceba que o IP não muda:
1 docker container exec -it $CONTAINER ping -c2 webserver1
2
3 PING webserver1 (10.0.3.78): 56 data bytes
4 64 bytes from 10.0.3.78: seq=0 ttl=64 time=0.053 ms
5 64 bytes from 10.0.3.78: seq=1 ttl=64 time=0.053 ms
1 docker container exec -it $CONTAINER ping -c2 webserver1
2
3 PING webserver1 (10.0.3.78): 56 data bytes
4 64 bytes from 10.0.3.78: seq=0 ttl=64 time=0.050 ms
5 64 bytes from 10.0.3.78: seq=1 ttl=64 time=0.057 ms
Verifique que o serviço webserver2 possui um IP para cada réplica:
1 docker container exec -it $CONTAINER nslookup webserver2
Resultado do comando:
1 Server: 127.0.0.11
2 Address 1: 127.0.0.11
3
4 Name: webserver2
5 Address 1: 10.0.3.76 webserver2.1.wj8yz4vl2yxh2eer3z5jf0odn.web
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
195 10. ROUTING MESH E BALANCEAMENTO DE CARGA
6 Address 2: 10.0.3.77 webserver2.2.ado1p9pciul9hcvb4d4faf4qc.web
Teste a conectividade com o serviço webserver2 e perceba que o IP muda devido ao modo
DNSRR:
1 docker container exec -it $CONTAINER ping -c2 webserver2
2
3 PING webserver2 (10.0.3.77): 56 data bytes
4 64 bytes from 10.0.3.77: seq=0 ttl=64 time=0.563 ms
5 64 bytes from 10.0.3.77: seq=1 ttl=64 time=0.387 ms
1 docker container exec -it $CONTAINER ping -c2 webserver2
2
3 PING webserver2 (10.0.3.76): 56 data bytes
4 64 bytes from 10.0.3.76: seq=0 ttl=64 time=0.711 ms
5 64 bytes from 10.0.3.76: seq=1 ttl=64 time=0.478 ms
Para terminar esse laboratório remova os serviços webserver1, webserver2 e client:
1 docker service rm webserver1 webserver2 client
Balanceamento de carga com Traefik
Conceito
O Docker Swarm realizar o roteamento de tráfego externo para o cluster, balanceamento
de carga entre réplicas e a descoberta de serviços DNS. A malha de rede interna doSwarm
permite que todos os nós do cluster aceitem conexões com qualquer porta de serviço publicada
no Swarm, roteando todas as solicitações recebidas para os nós disponíveis que hospedam um
serviço com a porta publicada.
Conhecendo o Traefib
O Traefik [3] é um roteador de borda de código aberto que torna a publicação de seus serviços
uma experiência fácil e divertida. Ele recebe solicitações em nome do seu sistema e descobre
quais componentes são responsáveis por manipulá-los.
O que diferencia o Traefik, além de seus muitos recursos, é que ele descobre automaticamente
a configuração correta para os seus serviços. A mágica acontece quando o Traefik inspeciona
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
196 10. ROUTING MESH E BALANCEAMENTO DE CARGA
sua infraestrutura, onde encontra informações relevantes e descobre qual serviço atende a qual
solicitação. Abaixo uma imagem que demonstra a arquitetura do Traefik.
Fig. 10.10: Arquitetura do Traefik
Load balance utilizando Traefik
O uso de um balanceador de carga fora do Swarm permite uma maneira fácil de conectar-se
aos seus contêineres sem ter que se preocupar com os nós do cluster. Como todos os serviços
publicados estão disponíveis em qualquer um dos nós do Swarm, graças ao roteamento de
entrada, o balanceador de carga pode ser configurado para usar os endereços IP privados do
Swarm, sem a preocupação de qual nó está hospedando qual serviço.
Podemos executar um Traefik como um serviço no Docker Swarm no próprio Cluster. O IP
da máquina ira realizar todo o balanceamento da aplicação que estará em execução no cluster
Swarm.
Resolução de nomes
O Docker EE possui um serviço chamado HRM (HTTP Routing Mesh) que fornece balancea-
mento de carga de aplicativos baseados em contêiner. O serviço também permite associar um
domínio a um serviço no Cluster Swarm. No Kubernetes isso é equivalente ao Nginx Ingress.
Para o Docker CE podemos ter o mesmo resultado utilizando balanceamento de carga e proxy
reverso com Traefik.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
197 10. ROUTING MESH E BALANCEAMENTO DE CARGA
LAB 8.4 – Balanceamento de carga com Traefik
Neste laboratório vamos aprender como implementar um balanceamento de carga, utilizando
Traefik em nosso Cluster Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse
a VM Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Criar serviço do Traefik no cluster
Antes de criar um serviço para o Traefik, crie uma rede overlay de nome traefik-net.
1 docker network create -d overlay traefik-net
Em seguida crie um serviço para executar o Traefik na rede overlay.
1 docker service create --name traefik \
2 --constraint ’node.role==manager’ \
3 --publish 80:80 --publish 8080:8080 \
4 --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
5 --network traefik-net traefik:1.7 \
6 --docker --docker.swarmMode --docker.domain=4labs.example \
7 --docker.watch --web
Descrição das opções
• --docker: ativa o uso do Traefik no Docker;
• --docker.swarmMode: ativa o modo Swarm no Traefik ao invés de usar o Docker de forma
independente;
• --docker.domain: define o domínio base padrão usado para as regras de front-end no
Traefik;
• --docker.watch: ativa o modo “watch”, para recarregar sua configuração com base em
novas stacks e labels;
• --web: permite visualizar regras de Frontend e Backend do Traefik, através de uma
Dashboard.
Verifique se o serviço traefik esta em execução no cluster Swarm.
1 docker service ls
2 ID NAME MODE REPLICAS IMAGE
PORTS
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
198 10. ROUTING MESH E BALANCEAMENTO DE CARGA
3 lnlqgquoj9ke traefik replicated 1/1 traefik:1.7
*:80->80/tcp, *:8080->8080/tcp
Criar serviços no cluster
Crie um serviço de nome nginx-service, para acessar a aplicação Nginx com duas réplicas
em todos os nós workers:
1 docker service create --name nginx-service --replicas 2 --network traefik-net --
constraint node.role==worker --label ’traefik.port=80’ --label traefik.
frontend.rule="Host:nginx.4labs.example;" nginx
Crie um segundo serviço de nome apache-service, para acessar a aplicação Apache com duas
réplicas em todos os nós workers:
1 docker service create --name apache-service --replicas 2 --network traefik-net
--constraint node.role==worker --label ’traefik.port=80’ --label traefik.
frontend.rule="Host:apache.4labs.example;" httpd
Descrição das opções
• --label ’traefik.port’: define a porta onde o serviço ira atender requisições;
• --label traefik.frontend.rule: define o virtual host (domínio) onde o serviço irá aten-
der requisições. Toda vez que chegar ao IP do manager no cluster uma requisição ao
domínio de Frontend, o Traefik ira redirecionar o acesso ao backend no cluster Swarm,
que são os IPs dos containers do serviço.
A seguir podemos visualizar uma imagem que demonstra a redirecionamento feito pelo Traefik:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
199 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Fig. 10.11: Redirecionamento do Virtual Host para Serviços no Docker
Liste os serviços para validar os comandos anteriores:
1 docker service ls
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE
PORTS
2 386f1tv7j04b apache-service replicated 2/2 httpd:latest
3 mw0lwocoygnl nginx-service replicated 2/2 nginx:latest
4 bcjyx3u06up8 traefik replicated 1/1 traefik:1.7
*:80->80/tcp, *:8080->8080/tcp
Verifique se existe um container do Nginx sendo executado em cada nó do cluster:
1 docker service ps nginx-service
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
200 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 sr5kb9lav8h8 nginx-service.1 nginx:latest worker02 Running Running about a
minute ago
3 eqsinjghvy3a nginx-service.2 nginx:latest worker01 Running Running about a
minute ago
Verifique se existe um container do Apache sendo executado em cada nó do cluster:
1 docker service ps apache-service
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
2 r8vwh760j4qh apache-service.1 httpd:latest worker01 Running Running about a
minute ago
3 81pgcu90pg9i apache-service.2 httpd:latest worker02 Running Running about a
minute ago
Acessar o dashboard do Traefik
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
8080:
http://172.16.0.100:8080
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
201 10. ROUTING MESH E BALANCEAMENTO DE CARGA
Fig. 10.12: Dashboard do Traefik
Na imagem apresentada é possível identificar:
• O Frontend configurado para o domínio apache.4labs.example que aponta para o Back-
end que é um serviço de nome apache-service sendo executado no cluster Swarm;
• O Frontend configurado para o domínio nginx.4labs.example que aponta para o Back-
end que é um serviço de nome nginx sendo executado no cluster Swarm;
Alterar os arquivos index.html dos containers
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, e em seguida, acesse
as máquinas virtuais Worker 01 e Worker 02 através do vagrant ssh. Para realizar o
laboratório, alterne para a conta do usuário suporte.
Execute os passos a seguir tanto na máquina virtual Worker 01 quanto na Worker 02.
Visualize o script nginx.sh que irá modificar o conteúdo do arquivo index.html da aplicação
Nginx:
1 cat scripts/nginx.sh
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
202 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 #!/bin/bash
2 CONTAINER1=$(docker container ls | grep nginx | awk -F" " ’{print $1}’)
3 echo ’<H1><CENTER>Nginx Load Balancer - Node Worker 01’ > index.html
4 docker container cp index.html $CONTAINER1:/usr/share/nginx/html
Execute o script nginx.sh para modificar o conteúdo do arquivo index.html da aplicação Nginx:
1 bash scripts/nginx.sh
Visualize o script apache.sh que irá modificar o conteúdodo arquivo index.html da aplicação
Apache:
1 cat scripts/apache.sh
Resultado do comando:
1 #!/bin/bash
2 CONTAINER2=$(docker container ls | grep httpd | awk -F" " ’{print $1}’)
3 echo ’<H1><CENTER>Apache Load Balancer - Node Worker 01’ > index.html
4 docker container cp index.html $CONTAINER2:/usr/local/apache2/htdocs/
Execute o script apache.sh para modificar o conteúdo do arquivo index.html da aplicação
Apache:
1 bash scripts/apache.sh
Adicione uma entrada no arquivo /etc/hosts em uma máquina física apontando para o IP
200.100.50.103, os domínios nginx.4labs.example e apache.4labs.example:
No Linux e no Mac
• Arquivo: /etc/hosts
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example
No Windows
• Arquivo: C:\Windows\System32\Drivers\etc\hosts
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
203 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example
No navegador web do seu computador, acesse o domínio nginx.4labs.example e atualize a
página através da tecla F5 para testar o Load Balancer :
Acesso: http://nginx.4labs.example
Fig. 10.13: NGINX Loadbalancer - Worker 01
Fig. 10.14: NGINX Loadbalancer - Worker 02
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
204 10. ROUTING MESH E BALANCEAMENTO DE CARGA
No navegador web do seu computador, acesse o domínio apache.4labs.example e atualize a
página através da tecla F5 para testar o Load Balancer :
Acesso: http://apache.4labs.example
Fig. 10.15: Apache Loadbalancer - Worker 01
Fig. 10.16: Apache Loadbalancer - Worker 02
Para terminar esse laboratório, alterne para a máquina virtual Manager e remova os serviços
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
205 10. ROUTING MESH E BALANCEAMENTO DE CARGA
nginx-service e apache-service:
1 docker service rm nginx-service apache-service
LAB 8.5 – Redirecionar URLs com Traefik
Neste laboratório vamos aprender como implementar redirecionamento de URLs utilizando
Traefik em nosso cluster Swarm.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Criar serviços no cluster
Crie um serviço de nome matriz, para acessar a aplicação Nginx no nó Worker 01:
1 docker service create --name matriz --network traefik-net --constraint node.
labels.cloud==aws --label ’traefik.port=80’ --label traefik.frontend.rule="
Host:4labs.example; Path: /matriz/" nginx
Crie um serviço de nome filial, para acessar a aplicação Nginx no nó Worker 02:
1 docker service create --name filial --network traefik-net --constraint node.
labels.cloud==azure --label ’traefik.port=80’ --label traefik.frontend.rule=
"Host:4labs.example; Path: /filial/" nginx
Descrição das opções
• --label traefik.frontend.rule="Host:4labs.example; Path: /matriz/": o parâmetro Path
/matriz/ define que a URL 4labs.example/matriz/ vai redirecionar o acesso ao serviço
matriz;
• --label traefik.frontend.rule="Host:4labs.example; Path: /filial/": o parâmetro Path
/filial/ define que a URL 4labs.example/filial/ vai redirecionar o acesso ao serviço
filial;
Alterar os arquivos index.html dos containers
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, e em seguida acesse
as máquinas virtuais Worker 01 e Worker 02, através do vagrant ssh. Para realizar o
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
206 10. ROUTING MESH E BALANCEAMENTO DE CARGA
laboratório, alterne para a conta do usuário suporte.
Execute os passos a seguir na máquina virtual Worker 01.
Visualize o script matriz.sh que irá modificar o conteúdo do arquivo index.html da aplicação
Nginx:
1 cat scripts/matriz.sh
Resultado do comando:
1 #!/bin/bash
2 CONTAINER=$(docker container ls | grep nginx| awk -F" " ’{print $1}’)
3 echo ’<H1><CENTER>Nginx Unidade Matriz’ > index.html
4 docker container exec -it $CONTAINER mkdir /usr/share/nginx/html/matriz
5 docker container cp index.html $CONTAINER:/usr/share/nginx/html/matriz
Execute o script matriz.sh para modificar o conteúdo do arquivo index.html da aplicação
Nginx:
1 bash scripts/nginx.sh
Execute os passos abaixo na máquina virtual Worker 02.
Visualize o script filial.sh que irá modificar o conteúdo do arquivo index.html da aplicação
Nginx:
1 cat scripts/filial.sh
Resultado do comando:
1 #!/bin/bash
2 CONTAINER=$(docker container ls | grep nginx| awk -F" " ’{print $1}’)
3 echo ’<H1><CENTER>Nginx Unidade Filial’ > index.html
4 docker container exec -it $CONTAINER mkdir /usr/share/nginx/html/filial
5 docker container cp index.html $CONTAINER:/usr/share/nginx/html/filial
Execute o script filial.sh para modificar o conteúdo do arquivo index.html da aplicação
Apache:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
207 10. ROUTING MESH E BALANCEAMENTO DE CARGA
1 bash scripts/filial.sh
Adicione uma entrada no arquivo /etc/hosts em máquina física apontando para o IP 172.16.0.100
, o domínio 4labs.example:
No Linux e Mac
• Arquivo: /etc/hosts
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example 4labs.example
No Windows
• Arquivo: C:\Windows\System32\Drivers\etc\hosts
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example 4labs.example
No navegador web do seu computador acesse o domínio 4labs.example/matriz, para testar o
redirecionamento de URL:
Acesso: http://4labs.example/matriz
Fig. 10.17: Traefik URL Matriz
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
208 10. ROUTING MESH E BALANCEAMENTO DE CARGA
No navegador web do seu computador acesse o domínio 4labs.example/filial, para testar o
redirecionamento de URL:
Acesso: http://4labs.example/filial
Fig. 10.18: Traefik URL Filial
Para terminar esse laboratório, alterne para a máquina virtual Manager e remova os serviços
matriz e filial:
1 docker service rm matriz filial
No próximo capítulo vamos aprender a gerenciar stacks no cluster Swarm e utilizar seu dash-
board.
Links
[1] Routing Mesh: https://success.docker.com/article/ucp-service-discovery-swarm
[2] Ingress: https://docs.docker.com/engine/swarm/ingress/
[3] Traefik: https://docs.traefik.io
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
11
Gerenciar stacks no cluster
Swarm e dashboard
Competências deste conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Orchestration (25% of exam)
LPI DevOps Tools Engineer Container Deployment and Orchestration
(weight: 5)
Introdução a stacks
Conceitos
Stacks são coleções de serviços que compõem um aplicativo em um ambiente específico [1]. O
stack é um arquivo no formato YAML, semelhante a um arquivo docker-compose.yml, que define
um ou mais serviços. Stacks são uma maneira conveniente de implantar automaticamente
vários serviços vinculados entre si, sem precisar definir cada um separadamente.
Os arquivos de Stack definem variáveis de ambiente, tags de implementação, o número de
contêineres e a configuração específica relacionada ao ambiente. Por isso, você deve usar
um arquivo de Stack separado para desenvolvimento, armazenamento temporário, produção e
209
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
210 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
outros ambientes.
Exemplo de um comando para criar um serviço no modo global:
1 docker service create --name webserver --publish 8081:80 --mode global --
constraint node.role==manager --restart-condition on-failure --update-delay
10s registry:5000/webserver-wordpress
Convertendo para stack no formato YAML:
1 version: ’3.1’
2
3 services:
4 webserver:
5 image: registry:5000/webserver-wordpress:latest
6 ports:
7 - "8081:80"
8 deploy:
9 alias:
10 - webserver
11 mode: global
12 placement:
13 constraints: [node.role == manager]
14 restart_policy:
15 condition: on-failure
16 delay: 10s
Instruções do arquivo:
• version: permite definir a versão das instruções, utilizadasno arquivo docker-compose.
yaml;
• services: permite definir quais serão os serviços orquestrados, sendo que cada serviço
corresponde a um container, volume ou rede;
• image: define qual será a imagem utilizada para executar o container;
• ports: define uma ou mais portas que serão mapeadas para o container;
• deploy: especifica a configuração relacionada à implementação e execução de serviços;
• alias: define um apelido para o serviço;
• mode: define o modo de utilização na criação de réplicas. A opção global define um
container por nó Swarm, já na opção replicated, é possível escolher a quantidade de
réplicas que estarão distribuídas entre os nós;
• placement: especifica o posicionamento de restrições e preferências;
• constraints: define restrições de posicionamento, para selecionar em qual nó o container
será executado;
• restart_policy: configura-se como reiniciar contêineres, quando os mesmos falharem.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
211 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
A opção delay define quanto tempo esperar entre as tentativas de reinicialização, es-
pecificadas como duração (padrão: 0).
LAB 9.1 – Gerenciar serviços utilizando stacks
Neste laboratório vamos aprender como gerenciar serviços no Docker Swarm, utilizando ar-
quivos de manifesto stack:
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux. Para iniciar as
máquinas virtuais, utilize o subcomando up do Vagrant. Em seguida, acesse a máquina virtual
Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Criar stack
Antes de criar um serviço com Stack, visualize o conteúdo do arquivo modelo na pasta /opt/
webserver-deploy.yaml:
1 cat /opt/webserver-deploy.yaml
Resultado do comando:
1 version: ’3.1’
2
3 services:
4 webserver:
5 image: "registry:5000/webserver-wordpress:latest"
6 ports:
7 - "8081:80"
8 deploy:
9 mode: global
10 # replicas: 2
11 placement:
12 constraints: [node.role == manager]
13 # labels:
14 # - "traefik.enable=true"
15 # - "traefik.port=80"
16 # - "traefik.backend=webserver"
17 # - "traefik.docker.network=traefik-net"
18 # - "traefik.backend.loadbalancer.swarm=true"
19 # - "traefik.frontend.rule=Host:webserver.4labs.example"
20 restart_policy:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
212 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
21 condition: on-failure
22 delay: 10s
23 # resources:
24 # limits:
25 # memory: 256M
26 # cpus: ’0.2’
27 # volumes:
28 # - "volume_nfs:/var/www/html"
29 # networks:
30 # - traefik-net
31
32 #volumes:
33 # volume_nfs:
34 # external: true
35 #networks:
36 # traefik-net:
37 # external: true
Para começar, verifique as opções do comando Docker stack:
1 docker stack --help
Para iniciar os containers no nó Manager, execute o comando docker stack deploy, apon-
tando o arquivo webserver-deploy.yaml:
1 docker stack deploy --with-registry-auth -c /opt/webserver-deploy.yaml webserver
A flag --with-registry-auth permite enviar detalhes de autenticação do servidor de
registro para agentes do cluster Swarm.
Para listar os stacks criados, execute o seguinte comando:
1 docker stack ls
Resultado do comando:
1 NAME SERVICES ORCHESTRATOR
2 webserver 1 Swarm
Para listar os serviços em execução no Stack, execute o seguinte comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
213 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
1 docker stack services webserver
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 q2zx26lcw7o9 webserver_webserver global 1/1 registry:5000/webserver-
wordpress:latest *:8081->80/tcp
Verifique que o Stack criou um serviço de nome webserver_webserver.
Liste em qual nó do cluster os containers estão em execução:
1 docker stack ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
PORTS
2 hwcvavytz1pj webserver_webserver.fdi5n76upcedwaziocung42bn registry:5000/
webserver-wordpress:latest manager Running Running 30 seconds
ago
Verifique que, como utilizamos o modo global, existe uma réplica apenas no nó Man-
ager.
Atualizar stack
Edite o arquivo do stack, para alterar o tipo de nó para worker:
1 vim /opt/webserver-deploy.yaml
1 ....
2 constraints: [node.role == worker]
Execute novamente o comando docker stack deploy, para atualizar o serviço:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
214 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
1 docker stack deploy --with-registry-auth -c /opt/webserver-deploy.yaml webserver
Liste em qual nó do cluster os containers estão em execução para validar o comando anterior:
1 docker stack ps webserver
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
PORTS
2 fvklmbi084jn webserver_webserver.fdi5n76upcedwaziocung42bn registry:5000/
webserver-wordpress:latest worker02 Running Running 13 seconds
ago
3 to6uzyjiuag3 webserver_webserver.bubiu21p2amsvj4lgix8gt4np registry:5000/
webserver-wordpress:latest worker01 Running Running 13 seconds
ago
4 s07nshq6fsb6 webserver_webserver.4apkxs46tgyn0k6bpe7q3t7d2 registry:5000/
webserver-wordpress:latest manager Shutdown Shutdown 1 second
ago
Remover Stack
Para remover e listar um stack, execute o seguinte comando:
1 docker stack rm webserver
Confirme se o Stack foi removido:
1 docker stack ls
LAB 9.2 – Gerenciar réplicas, limites, volumes e redes utilizando
Stacks
Neste laboratório vamos aprender como gerenciar réplicas, limites de CPU e memória, volume
NFS e rede no Docker Swarm, utilizando arquivos de manifesto através de stacks:
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
215 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
Escalonar serviços e gerenciar limites
Edite o arquivo do stack para alterar o modo de execução e a quantidade de réplicas e
descomente as opções para adicionar limites de utilização e CPU e memória dos containers:
1 vim /opt/webserver-deploy.yaml
1 ....
2 deploy:
3 mode: replicated
4 replicas: 2
1 ....
2 resources:
3 limits:
4 memory: 256M
5 cpus: ’0.2’
Para iniciar os containers, execute novamente o comando docker stack deploy:
1 docker stack deploy --with-registry-auth -c /opt/webserver-deploy.yaml webserver
Para listar os serviços em execução no Stack, execute o seguinte comando:
1 docker stack services webserver
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE PORTS
2 tqridok1tboe webserver_webserver replicated 2/2 registry:5000/webserver-
wordpress:latest *:8081->80/tcp
Inspecione o serviço para validar os limites aplicados:
1 docker service inspect webserver_webserver | grep Resources -A 3
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
216 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
1 "Resources": {
2 "Limits": {
3 "NanoCPUs": 200000000,
4 "MemoryBytes": 268435456
Utilizar volume e rede em stacks
Edite o arquivo do stack para adicionar o uso de volume e rede já existente no cluster:
1 vim /opt/webserver-deploy.yaml
1 ....
2 volumes:
3 - "volume_nfs:/var/www/html"
4 networks:
5 - traefik-net
6
7 volumes:
8 volume_nfs:
9 external: true
10 networks:
11 traefik-net:
12 external: true
Antes de atualizar o serviço verifique nas máquinas virtuais Worker 01 e Worker 02 se o
plugin do NFS esta desabilitado. Exemplo:
1 docker plugin ls
2 ID NAME DESCRIPTION
ENABLED
3 2f37fc24bf5e trajano/nfs-volume-plugin:latest NFS mounted plugin for
Docker false
Podemos habilitá-lo através do comando docker plugin enable nome_do_plugin. Exemplo:
1 docker plugin enable trajano/nfs-volume-plugin
Para atualizar o serviço, execute novamente o comando docker stack deploy:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
217 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
1 docker stack deploy --with-registry-auth-c /opt/webserver-deploy.yaml webserver
Inspecione o serviço para verificar o uso do volume NFS:
1 docker service inspect --pretty webserver_webserver | grep Mounts -A 4
Resultado do comando:
1 Mounts:
2 Target: /var/www/html
3 Source: volume_nfs
4 ReadOnly: false
5 Type: volume
Inspecione o serviço para verificar o uso da rede web:
1 docker service inspect --pretty webserver_webserver | grep Network
Resultado do comando:
1 Networks: traefik-net
Integrando Traefik com stacks
Edite o arquivo do stack para adicionar a integração com Traefik através de labels:
1 vim /opt/webserver-deploy.yaml
1 ....
2 constraints: [node.role == worker]
3 labels:
4 - "traefik.enable=true"
5 - "traefik.port=80"
6 - "traefik.backend=webserver"
7 - "traefik.docker.network=traefik-net"
8 - "traefik.backend.loadbalancer.swarm=true"
9 - "traefik.frontend.rule=Host:webserver.4labs.example"
Para atualizar o serviço, execute novamente o comando docker stack deploy:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
218 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
1 docker stack deploy --with-registry-auth -c /opt/webserver-deploy.yaml webserver
Adicione uma entrada no arquivo /etc/hosts em máquina física apontando para o IP 172.16.0.100
, o domínio webserver.4labs.example:
No Linux e Mac
• Arquivo: /etc/hosts
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example 4labs.example
webserver.4labs.example
No Windows
• Arquivo: C:\Windows\System32\Drivers\etc\hosts
1 ....
2 172.16.0.100 nginx.4labs.example apache.4labs.example 4labs.example
webserver.4labs.example
No navegador web do seu computador, acesse o domínio webserver.4labs.example**:
http://webserver.4labs.example
Fig. 11.1: Traefik e Stack - Aplicação acessada através do domínio
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
219 11. GERENCIAR STACKS NO CLUSTER SWARM E DASHBOARD
Para terminar esse laboratório, remova o stack webserver:
1 docker stack rm webserver
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
12
Gerenciamento gráfico do Docker
com Portainer
Introdução ao Portainer
Conceitos
O Portainer Community Edition é a base do mundo Portainer [2]. Com mais de 2 bilhões de
downloads ao longo de sua história, é um poderoso conjunto de ferramentas de gerenciamento
de código aberto que permite criar, gerenciar e manter facilmente os ambientes Docker. E é
totalmente gratuito. Ao escolher entre uma gama crescente de extensões, a funcionalidade
principal do Portainer pode ser estendida para se tornar o conjunto de ferramentas ideal para
gerenciar ambientes baseados em docker para organizações de qualquer tamanho.
LAB 9.3 – Instalar o Portainer no cluster Swarm
Neste laboratório vamos aprender como instalar o Portainer para realizar o gerenciamento
gráfico do cluster Swarm:
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
220
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
221 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Instalação do Portainer
Realize o download do manifesto modelo do Portainer através do comando curl:
1 curl -s -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer
-agent-stack.yml
Visualize o conteúdo do arquivo portainer-agent-stack.yml para entender a configuração dos
serviços do Portainer:
1 cat portainer-agent-stack.yml
1 version: ’3.2’
2
3 services:
4 agent:
5 image: portainer/agent
6 volumes:
7 - /var/run/docker.sock:/var/run/docker.sock
8 - /var/lib/docker/volumes:/var/lib/docker/volumes
9 networks:
10 - agent_network
11 deploy:
12 mode: global
13 placement:
14 constraints: [node.platform.os == linux]
15
16 portainer:
17 image: portainer/portainer
18 command: -H tcp://tasks.agent:9001 --tlsskipverify
19 ports:
20 - "9000:9000"
21 - "8000:8000"
22 volumes:
23 - portainer_data:/data
24 networks:
25 - agent_network
26 deploy:
27 mode: replicated
28 replicas: 1
29 placement:
30 constraints: [node.role == manager]
31
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
222 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
32 networks:
33 agent_network:
34 driver: overlay
35 attachable: true
36 volumes:
37 portainer_data:
Descrição do arquivo
• O agent do Portainer será executado em todos os nós do cluster (mode: global);
• O agent do Portainer irá utilizar a imagem portainer/agent;
• O agent do Portainer irá utilizar a rede overlay agent_network;
• O servidor do Portainer será executado somente no nó manager (constraints: [node.
role == manager]);
• O servidor do Portainer irá utilizar a imagem portainer/portainer;
• O servidor do Portainer irá utilizar a rede overlay agent_network;
• O servidor do Portainer irá utilizar as portas 8000 e 9000.
Para iniciar os containers do Portainer, execute o comando docker stack deploy, apontando
o arquivo portainer-agent-stack.yml:
1 docker stack deploy --compose-file=portainer-agent-stack.yml portainer
Para listar os stacks criados, execute o seguinte comando:
1 docker stack ls
Resultado do comando:
1 NAME SERVICES ORCHESTRATOR
2 portainer 2 Swarm
Para listar os serviços em execução no Stack, execute o seguinte comando:
1 docker stack services portainer
Resultado do comando:
1 ID NAME MODE REPLICAS IMAGE
PORTS
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
223 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
2 yl3d5j6khayd portainer_agent global 3/3 portainer/agent:latest
3 yvfut7s64rs6 portainer_portainer replicated 1/1 portainer/portainer:latest
*:8000->8000/tcp, *:9000->9000/tcp
Liste em qual nó do cluster os containers estão em execução:
1 docker stack ps portainer
Resultado do comando:
1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
PORTS
2 nubgn03q1cr1 portainer_agent.fdi5n76upcedwaziocung42bn portainer/agent:latest
worker02 Running Running 2 minutes ago
3 0uj6a51pg3uz portainer_agent.bubiu21p2amsvj4lgix8gt4np portainer/agent:latest
worker01 Running Running 2 minutes ago
4 ii7yn4s5uc4j portainer_agent.4apkxs46tgyn0k6bpe7q3t7d2 portainer/agent:latest
manager Running Running 2 minutes ago
5 9l36xylzviel portainer_portainer.1 portainer/portainer:latest
manager Running Running 2 minutes ago
LAB 9.4 – Acessaro painel do Portainer
Neste laboratório vamos aprender como acessar o Portainer e conhecer seus menus.
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
9000:
Manager: http://172.16.0.100:9000
Na tela inicial do Portainer crie uma senha para o usuário admin e clique no botão Create
User.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
224 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.1: Portainer: Tela de Cadastro
A próxima tela irá apresentar o estado do Cluster Swarm, informando a quantidade de stacks,
services, containers e volumes. Clique em primary para visualizar opções de gerenciamento do
cluster.
Fig. 12.2: Portainer: Tela Inicial
Para realizar o gerenciamento de stacks, services, containers, images, entre outros, clique na
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
225 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
opção no lado esquerdo ou direito da tela.
Fig. 12.3: Portainer: Dashboard do Ambiente Swarm
Para exibir informações sobre os cluster, clique no link Go to cluster visualizer.
Fig. 12.4: Portainer: Visualização do Cluster
Para exibir informações sobre os nós, clique na opção Swarm no lado esquerdo da tela.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
226 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.5: Portainer: Informações Gerais do Cluster
LAB 9.5 – Gerenciar stacks com Portainer
Neste laboratório vamos aprender como gerenciar stacks no cluster Swarm utilizando o Por-
tainer.
Antes de iniciar o laboratório, verifique se o plugin do NFS esta ativo nas máquinas virtuais
Manage, Worker 01 e Worker 02.
1 docker pluginls | grep vieux/sshfs
2 331e44c19ced vieux/sshfs:latest sshFS plugin for Docker
true
Caso o plugin do NFS não esteja habilitado, execute o comando que habilita um plugin no
Docker:
1 docker plugin enable vieux/sshfs
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
9000:
• Manager: http://172.16.0.100:9000
Crie um novo Stack através da opção Stacks ao lado esquerdo da tela, e em seguida clique
no botão Add stack.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
227 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.6: Portainer: Stacks
Digite o nome webserver para o nome do stack e cole na janela do editor web, o conteúdo
do arquivo /opt/webserver-deploy.yaml localizado na máquina virtual Manager. Confirme a
criação do stack através do botão Deploy the stack.
Fig. 12.7: Portainer: Configurando um novo Stack
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
228 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.8: Portainer: Configurando um novo Stack
Verifique se o stack de nome webserver foi criado no Portainer.
Fig. 12.9: Portainer: Lista de Stacks
Para visualizar informações e interagir com os serviços, clique no nome do stack. Visualize o
campo Services e expanda as informações clicando na seta próxima ao nome do stack, assim
utilize as opções na coluna Actions para visualizar logs, inspecionar elementos, ver o uso de
recursos e abrir um terminal de comandos.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
229 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.10: Portainer: Fazendo Deploy do novo Stack
Fig. 12.11: Portainer: Estatísticas de Containers
No navegador web do seu computador, acesse o dominio webserver.4labs.example:
• Acesso: http://webserver.4labs.example
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
230 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.12: Loadbalancer - Aplicação Dexter
Para terminar o laboratório, acesse o painel do Portainer e remova o stack webserver através
do botão Remove:
Fig. 12.13: Portainer - Excluindo Stack Webserver
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
231 12. GERENCIAMENTO GRÁFICO DO DOCKER COM PORTAINER
Fig. 12.14: Portainer - Lista de Stacks
Links
[1] Stacks: https://docs.docker.com/get-started/swarm-deploy/
[2] Portainer: https://www.portainer.io
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
13
Provisionar ambientes com
Docker Machine
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
LPI DevOps Tools Engineer Container Infrastructure (weight: 4)
Introdução ao Docker Machine
Conceitos
O Docker Machine [1 ] é uma ferramenta Docker que permite o provisionamento local e
remoto de um ambiente Docker. Através do Docker Machine a instalação do Docker Engine
torna-se automatizada, pois a partir do driver selecionado, uma máquina virtual ou instância
é criada e nela o Docker será instalado e estará pronto para ser usado.
232
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
233 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Providers
Virtualbox
• À partir de sua máquina local, é possível criar máquinas virtuais usando o VirtualBox.
Este driver requer o VirtualBox 5 ou superior para ser instalado em seu host;
• Além de criar automaticamente a máquina virtual no VirtualBox, o Docker Engine tam-
bém será instalado, permitindo o provisionamento de ambientes através da ferramenta
como, por exemplo, o Docker Compose.
Vmware (Fusion/vSphere/vCloud Air)
• A partir de sua máquina local, é possível criar máquinas virtuais usando o VMware local,
se o driver selecionado for o Fusion. Para ambientes remotos, o driver selecionado deve
ser o vSphere ou Cloud Air.
DigitalOcean
• À partir de sua máquina local, é possível criar máquinas virtuais (instâncias) na Digi-
talOcean;
• Antes, é preciso criar um token de acesso pessoal em “Aplicativos e API” no painel de
controle do DigitalOcean;
• Ao executar o comando docker-machine, o token deve ser informado na diretiva --
digitalocean-access-token.
AWS
• A partir de sua máquina local, é possível criar máquinas virtuais (instâncias) na AWS
(Amazon Web Services);
• Para criar máquinas na Amazon Web Services, você deve fornecer dois parâmetros em
sua conta na AWS:
1. O ID da chave de acesso;
2. O ID de senha de acesso.
• Antes de criar uma instância, primeiro é preciso gerar uma chave de acesso (--
amazonec2-access-key) e uma chave secreta (--amazonec2-secret-key) no painel de
administração da AWS.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
234 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Google Cloud Platform
• A partir de sua máquina local, é possível criar máquinas virtuais (instâncias) no Google
Cloud Platform (GCE);
• O driver do Google, usa credenciais padrões do aplicativo para obter credenciais de
autorização para chamar as API’s do Google.
• Antes de criar uma instância, primeiro precisamos instalar o Cloud SDK para autenticar
sua conta do GCE, utilizando o comando gcloud auth login;
• Em seguida, informe o ID do projeto gerado em sua conta no GCE.
Exoscale
• A partir de sua máquina local, é possível criar máquinas virtuais (instâncias) no provedor
de nuvem Exoscale;
• Para criar máquinas no Exoscale, você deve fornecer a API Key e a API secret Key, ao
executar o comando docker-machine nas opções --exoscale-api-key=API e --exoscale-
api-secret-key=SECRET. Essas chaves devem ser criadas no painel de administração do
Exoscale.
OpenStack
• A partir de sua máquina local, é possível criar máquinas virtuais (instâncias) no provedor
de nuvem OpenStack;
• Antes de executar o provisionamento através do Docker Machine, é preciso baixar as
credencias de um usuário válido no Painel Horizon do OpenStack;
• O Docker Machine irá utilizar as variáveis de ambiente, contidas no arquivo de credencias
para iniciar a instância no OpenStack.
• Em seguida, adicione permissão de execução no script gerado pelo Dashboad, para poder
executá-lo;
• Por último, crie a instância informando o modelo computacional (flavor), nome da
imagem, né da rede (Nova ou Neutron), Pool de IP flutuante e grupo de segurança.
LAB 10.1 – Instalação do Docker Machine
Neste laboratório vamos aprender como instalar o Docker Machine no Linux, Windows e Mac.
Linux
Armazene na variável base o link do Docker Machine:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
235 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 base=https://github.com/docker/machine/releases/download/v0.16.0
Faça o download do Docker Machine, utilizando o comando curl e a variável base:
1 curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine
Complete a instalação, movendo o binário docker-machine e adicionando permissão de exe-
cução:
1 sudo mv /tmp/docker-machine /usr/local/bin/docker-machine
2 chmod +x /usr/local/bin/docker-machine
Windows
Abra o terminal do Cygwin64 para executar a instalação do Docker Machine:
1 base=https://github.com/docker/machine/releases/download/v0.16.0
2 curl -L $base/docker-machine-Windows-x86_64.exe > "c:/cygwin64/bin/docker-
machine.exe"
3 chmod +x "c:/cygwin64/bin/docker-machine.exe"
Mac OS X
Abra o terminal para executar a instalação do Docker Machine:
1 sudo su -
2 base=https://github.com/docker/machine/releases/download/v0.16.0
3 curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-
machine
4 chmod +x /usr/local/bin/docker-machine
LAB 10.2 – Provisionar ambientes Docker no Virtualbox
Neste laboratório vamos aprender como provisionar um ambiente com Docker no Virtualbox,
através da ferramenta Docker Machine.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
236 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Utilize sua máquina física para realizar este laboratório. Se você estiver em um
ambiente Windows, abra o terminal do Cygwin64.
Comandos iniciais Docker Machine
Teste a instalaçãodo Docker Machine, exibindo na tela suas opções de comando:
1 docker-machine --help
Verifique a versão do Docker Machine, através do comando docker-machine version. Para
listar máquinas criadas pelo Docker Machine, utilize o subcomando ls:
1 docker-machine ls
Descrição dos Comandos
• docker-machine --help: lista os subcomandos do docker-machine e sua descrição;
• docker-machine version: exibe a versão do Docker Machine;
• docker-machine ls: lista as máquinas do Docker Machine.
Comandos de gerenciamento do Docker Machine
Crie uma máquina virtual com do nome de vm-docker através do seguinte comando:
1 docker-machine create -d virtualbox --virtualbox-memory 1024 vm-docker
Se você está executando em uma ambiente Windows, adicione ao comando a flag
--virtualbox-no-vtx-check. Exemplo:
1 docker-machine create -d virtualbox --virtualbox-no-vtx-check --
virtualbox-memory 1024 vm-docker
Verifique se a máquina aparece na lista e se o seu estado é exibido como Running (em
execução):
1 docker-machine ls
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
237 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
2 vm-docker - virtualbox Running tcp://192.168.99.100:2376 v19.03.5
Para inspecionar uma máquina virtual utilize o subcomando inspect:
1 docker-machine inspect vm-docker
Para copiar um arquivo da máquina local para a máquina virtual vm-docker, utilize o subco-
mando scp:
1 docker-machine scp /etc/hosts vm-docker:
2 docker-machine ssh vm-docker ls
Para acessar a máquina virtual no VirtualBox utilize o SSH do Docker Machine:
1 docker-machine ssh vm-docker
Resultado do comando:
1 ( ’>’)
2 /) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
3 (/-_--_-\) www.tinycorelinux.net
Para abandonar o prompt da máquina virtual e retornar a sua máquina física, execute o
comando exit.
Execute os comandos necessários para gerenciar o Docker da máquina virtual vm-docker, a
partir da sua máquina física:
1 docker-machine env vm-docker
2 eval $(docker-machine env vm-docker)
O comando docker machine env permite definir variáveis de ambiente, para que o
Docker execute comandos em uma máquina remota a partir de uma máquina local.
Se você estiver em um ambiente Windows com Cygwin64, execute os seguintes comandos:
1 docker-machine env vm-docker
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
238 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
2 eval $("C:/cygwin64/bin/docker-machine.exe" env vm-docker)
A partir da máquina virtual, execute um container com a imagem Nginx publicando a porta
80:
1 docker container run -dit --name webserver --hostname webserver -p 80:80 nginx
Verifique se o container webserver está em execução:
1 docker container ls
Resultado do comando:
1 CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
2 cb38cabaca6b nginx "nginx -g ’daemon of" 7 seconds ago Up 7 seconds
0.0.0.0:80->80/tcp webserver
Para sair da máquina virtual vm-docker e retornar à máquina virtual manager utilize o comando
exit.
Verifique qual é o IP da máquina virtual vm-docker:
1 docker-machine ip vm-docker
Resultado do comando:
1 192.168.99.100
Através do navegador web do seu computador, acesse o IP da máquina vm-docker para carregar
a página do Nginx:
• URL: http://192.168.99.100
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
239 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Fig. 13.1: Container NGINX criado via Docker Machine
Caso queira parar a máquina virtual, utilize o subcomando stop:
1 docker-machine stop vm-docker
Verifique o estado da máquina virtual através do subcomando status:
1 docker-machine status vm-docker
Resultado do comando:
1 Stopped
Para iniciar a máquina virtual utilize o subcomando start. Aproveite para verificar seu estado:
1 docker-machine start vm-docker
2 docker-machine status vm-docker
Resultado do comando:
1 Running
Para remover a máquina virtual precisamos antes parar com o subcomando stop e em seguida
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
240 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
remover através do subcomando rm:
1 docker-machine stop vm-docker
2 docker-machine rm vm-docker
Resultado do comando:
1 WARNING: This action will delete both local reference and remote instance.
2 Are you sure? (y/n): y
3 Successfully removed vm-docker
Descrição dos comandos
• docker-machine create: cria uma máquina virtual ou instância na nuvem, contendo a
instalação do Docker;
– --driver: define o driver utilizado para criar a máquina/instância no Docker Ma-
chine;
– --virtualbox-memory: define a quantidade de memória da máquina virtual no Vir-
tualBox;
• docker-machine ls: lista as máquinas disponíveis;
• docker-machine inspect: exibe detalhes de uma determinada máquina;
• docker-machine ssh: permite acessar e/ou executar comandos na máquina remota, cri-
ada pelo Docker Machine;
• docker-machine scp: permite realizar cópias de arquivos entre o host local e a máquina
remota, criada pelo Docker Machine.
• docker-machine ip: exibe o endereço IP de uma determinada máquina;
• docker-machine stop: permite parar uma máquina que está em execução no Docker
Machine;
• docker-machine status: permite exibir o estado da máquina que está em execução no
Docker Machine;
• docker-machine start: permite iniciar uma máquina que está parada no Docker Ma-
chine;
• docker-machine rm: permite remover uma máquina que está parada no Docker Machine.
Provisionar ambiente Docker na nuvem
Caso você não possua uma conta em algum provedor de nuvem, crie uma conta grátis por um
determinado período. É importante que você possua um cartão de crédito internacional, para
realizar o cadastro.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
241 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Google Cloud
• É necessário possuir um cartão de crédito, de preferência internacional
• Link para conta grátis do Google Cloud com crédito de $300: https://cloud.google.com/.
• Clique no botão Comece a usar gratuitamente
Etapas: criar instância no Google Cloud através do Docker Machine:
1. Acesse sua conta no Google Cloud;
2. Clique em Criar projeto. Isso exibirá a caixa de diálogo Novo Projeto. Digite um
nome para o projeto, como por exemplo curso;
3. Digite o comando do Docker Machine para criar a instância:
1 docker-machine create --driver google --google-project <digite-seu-id-do-
projeto-aqui> docker-machine-gcp
O comando solicitará que você cole o URL no navegador e realize a autenticação. Isso
é solicitado para garantir que você faça login com sua Conta do Google, proprietária
do Google Cloud Project.
Faça o login e permita o acesso ao Docker Machine. Na autenticação bem-sucedida
no navegador, você verá um código que precisa colar no “Digite o código:”
Depois de inserir o código, ele iniciará o processo de criação da instância do Compute
Engine, fazendo o download do Docker.
Digital Ocean
• É necessário possuir um cartão de crédito, de preferência internacional
• Link para conta grátis do Digital Ocean com crédito de $100: https://m.do.co/c/74a1c5d63dac
• Preencha o cadastro e clique no botão Create your account
Etapas: criar instância no Digital Ocean através do Docker Machine:
1. Acesse sua conta no Digital Ocean;
2. Em seguida crie um Hash, através da opção API TokensKeys botão Generate New
Token;
3. Confirme a criação do Hash, através do botão Generate Token;
4. Copie o Hash gerado através do link Copy;
5. Digite o comando do Docker Machine para criar a instância:
1 docker-machine create --driver digitalocean --digitalocean-access-token <digite-
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
242 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
seu-token-aqui> docker-machine-do
Amazon Web Services
• É necessário possuir um cartão de crédito, de preferência internacional
• Link para conta grátis por 1 ano do Amazon Web Services: https://aws.amazon.com/pt/free
• Clique no botão Crie uma conta gratuita
Etapas: criar instância na AWSatravés do Docker Machine:
1. Acesse sua conta no Amazon Web Services;
2. Copie as seguintes informações: access key, secret key, region, id do vpc, zone e id
do subnet;
3. Exporte 6 variáveis com essas informações e em seguida, digite o comando do Docker
Machine para criar a instância:
1 export AWS_ACCESS_KEY_ID=<sua_aws_access_key>
2 export AWS_SECRET_ACCESS_KEY=<sua_aws_secret_key>
3 export AWS_DEFAULT_REGION=<sua_aws_region>
4 export AWS_VPC_ID=<sua_aws_vpc_id>
5 export AWS_AZ=<sua_aws_availability_zone>
6 export AWS_VPC_SUBNET=<sua_aws_subnet_id>
1 docker-machine create -d amazonec2 --amazonec2-vpc-id $AWS_VPC_ID --amazonec2-
region $AWS_DEFAULT_REGION --amazonec2-zone $AWS_AZ --amazonec2-instance-
type t2.micro --amazonec2-subnet-id $AWS_VPC_SUBNET docker-machine-aws
LAB 10.3 – Cluster Swarm com Trafiek através do Docker Machine
Neste laboratório vamos aprender como provisionar um ambiente com cluster Swarm e Traefik,
através da ferramenta Docker Machine.
Utilize sua máquina física para realizar este laboratório. Se você estiver em um
ambiente Windows, abra o terminal do Cygwin64.
ETAPA 1 - Criar máquinas virtuais no cluster Swarm
Crie a primeira máquina virtual com do nome de swarm-manager com 3GB de memória:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
243 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 docker-machine create -d virtualbox --virtualbox-memory 3072 swarm-manager
Se você está executando em uma ambiente Windows, adicione ao comando a flag
--virtualbox-no-vtx-check.
Crie a segunda máquina virtual com do nome de swarm-worker01 com 1,5GB de memória:
1 docker-machine create -d virtualbox --virtualbox-memory 1536 swarm-worker01
Crie a terceira máquina virtual com do nome de swarm-worker02 com 1,5GB de memória:
1 docker-machine create -d virtualbox --virtualbox-memory 1536 swarm-worker02
Verifique se as máquinas aparecem na lista e se seu estado esta como Running (em execução):
1 docker-machine ls
Resultado do comando:
1 NAME ACTIVE DRIVER STATE URL SWARM DOCKER
ERRORS
2 swarm-manager - virtualbox Running tcp://192.168.99.104:2376 v19
.03.12
3 swarm-worker01 - virtualbox Running tcp://192.168.99.105:2376 v19
.03.12
4 swarm-worker02 - virtualbox Running tcp://192.168.99.106:2376 v19
.03.12
ETAPA 2 – Criar um cluster Swarm utilizando as máquinas virtuais do Docker
Machine
Na máquina virtual swarm-manager, crie um cluster Swarm através do seguinte comando:
1 docker-machine ssh swarm-manager "docker swarm init --advertise-addr $(docker-
machine ip swarm-manager)"
Em seguida armazene na variável TOKEN o token gerado pelo comando docker swarm init:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
244 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 export TOKEN=$(docker-machine ssh swarm-manager "docker swarm join-token worker
-q")
Verifique se a variável TOKEN possui um token gerado:
1 echo $TOKEN
Resultado do comando:
1 SWMTKN-1-00nmmh9w5m52nwp7r3piovhw5gl30k6glcd6ekqk62mm17xs0m-
c289lhwyqk3t5a05c7bdjjgxn
Na máquina virtual swarm-worker01, execute o comando para ingressar a máquina virtual no
cluster Swarm:
1 docker-machine ssh swarm-worker01 "docker swarm join --token=${TOKEN} \
2 --advertise-addr $(docker-machine ip swarm-worker01) \
3 $(docker-machine ip swarm-manager)"
Na máquina virtual swarm-worker02, execute o comando para ingressar a máquina virtual no
cluster Swarm:
1 docker-machine ssh swarm-worker02 "docker swarm join --token=${TOKEN} \
2 --advertise-addr $(docker-machine ip swarm-worker02) \
3 $(docker-machine ip swarm-manager)"
Liste os nós presentes no cluster Swarm para validar os comandos anteriores:
1 docker-machine ssh swarm-manager docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2 ki8vtv5jajqfijwo5ljapfup9 * swarm-manager Ready Active Leader
19.03.12
3 g2728qmu1jwlzyuw4jbs1d40f swarm-worker01 Ready Active
19.03.12
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
245 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
4 khl0wb90eb8kdba6usdtxxnjw swarm-worker02 Ready Active
19.03.12
ETAPA 3 – Criar serviço do Traefik no cluster Swarm
Execute os comandos necessários para gerenciar o Docker da máquina virtual swarm-manager,
a partir da sua máquina física:
1 docker-machine env swarm-manager
2 eval $(docker-machine env swarm-manager)
Se você estiver em um ambiente Windows com Cygwin64, execute os seguintes comandos:
1 docker-machine env swarm-manager
2 eval $("C:/cygwin64/bin/docker-machine.exe" env swarm-manager)
Em seguida, crie uma rede overlay de nome traefik.
1 docker network create --driver=overlay traefik
Crie um serviço para executar o Traefik na rede overlay.
1 docker service create --name traefik \
2 --constraint ’node.role==manager’ \
3 --publish 80:80 --publish 8080:8080 \
4 --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
5 --network traefik traefik:1.7 \
6 --docker --docker.swarmMode --docker.domain=4labs.example \
7 --docker.watch --web
ETAPA 4 – Definir labels para os nós worker no cluster Swarm
Defina o label node=worker01 para o nó swarm-worker01:
1 docker node update --label-add node=worker01 swarm-worker01
Defina o label node=worker02 para o nó swarm-worker02:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
246 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 docker node update --label-add node=worker02 swarm-worker02
ETAPA 5 – Realizar Deploy do Wordpress no Cluster Swarm
Obtenha os arquivos do curso no GitHub da 4Linux:
1 git clone https://github.com/4linux/4540.git
Em seguida, visualize o conteúdo do arquivo modelo no diretório 4540/wordpress/deploy-
wordpress.yaml:
1 cat 4540/wordpress/wordpress-deploy.yaml
Resultado da leitura do arquivo:
1 version: ’3.1’
2
3 services:
4
5 wordpress:
6 image: "wordpress:latest"
7 environment:
8 WORDPRESS_DB_HOST: database
9 WORDPRESS_DB_USER: wordpressuser
10 WORDPRESS_DB_PASSWORD: wordpresspass
11 WORDPRESS_DB_NAME: wordpressdb
12 deploy:
13 mode: replicated
14 replicas: 1
15 placement:
16 constraints: [node.labels.node == worker01]
17 labels:
18 - "traefik.enable=true"
19 - "traefik.port=80"
20 - "traefik.backend=wordpress"
21 - "traefik.docker.network=traefik"
22 - "traefik.backend.loadbalancer.swarm=true"
23 - "traefik.frontend.rule=Host:wordpress.4labs.example"
24 restart_policy:
25 condition: on-failure
26 delay: 10s
27 resources:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
247 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
28 limits:
29 memory: 512M
30 cpus: ’0.5’
31 volumes:
32 - "wordpress:/var/www/html"
33 networks:
34 - traefik
35
36 database:
37 image: "mysql:5.7"
38 environment:
39 MYSQL_DATABASE: wordpressdb
40 MYSQL_USER: wordpressuser
41 MYSQL_PASSWORD: wordpresspass
42 MYSQL_RANDOM_ROOT_PASSWORD: "1"
43 deploy:
44 mode: replicated
45 replicas: 1
46 placement:
47 constraints: [node.labels.node == worker02]
48 restart_policy:
49 condition: on-failure
50 delay: 10s
51 resources:
52 limits:
53 memory: 512M
54 cpus: ’0.5’
55 volumes:
56 - "database:/var/lib/mysql"
57 networks:
58 - traefik
59
60 volumes:
61 wordpress:
62 database:
63 networks:
64 traefik:
65 external: true
Execute o comando docker stack deploy, apontando o arquivo modelo wordpress-deploy.yaml
:
1 docker stack deploy -c 4540/wordpress/wordpress-deploy.yaml wordpress-deploy
Para listar os stacks criados, execute o seguinte comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
248 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
1 docker stack ls
Resultado do comando:
1 NAME SERVICES ORCHESTRATOR
2 wordpress-deploy 2 Swarm
ETAPA 6 – Acessar aplicação Wordpress no cluster Swarm
Antes de acessar a aplicação, verifique qual é o IP da máquina virtual swarm-manager:
1 docker-machine ip swarm-manager
Resultado do comando:
1 192.168.99.104
No exemplo apresentado o IP da máquina virtual swarm-manager é 192.168.99.101.
Verifique qual é o IP queaparece em seu cenário.
Em seguida adicione uma entrada no arquivo /etc/hosts em uma máquina física apontando
para o IP da máquina virtual swarm-manager, para o domínio wordpress.4labs.example:
No Linux e Mac
• Arquivo: /etc/hosts
1 ....
2 192.168.99.104 wordpress.4labs.example
No Windows
• Arquivo: C:\Windows\System32\Drivers\etc\hosts
1 ....
2 192.168.99.104 wordpress.4labs.example
No navegador web do seu computador acesse o domínio wordpress.4labs.example e realize a
instalação e configuração do Wordpress:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
249 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
http://wordpress.4labs.example
Fig. 13.2: Instalação Wordpress no Cluster Swarm - Docker Machine
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
250 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Fig. 13.3: Instalação Wordpress no Cluster Swarm - Docker Machine
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
251 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Fig. 13.4: Aplicação Wordpress no Cluster Swarm - Docker Machine
ETAPA 7 – Removendo máquinas virtuais do cluster Swarm
Para remover as máquinas virtuais precisamos antes pará-las com o subcomando stop e em
seguida remover através do subcomando rm:
1 docker-machine stop swarm-manager swarm-worker01 swarm-worker02
2 docker-machine rm swarm-manager swarm-worker01 swarm-worker02
Resultado do comando:
1 About to remove swarm-manager, swarm-worker01, swarm-worker02
2 WARNING: This action will delete both local reference and remote instance.
3 Are you sure? (y/n): y
4 Successfully removed swarm-manager
5 Successfully removed swarm-worker01
6 Successfully removed swarm-worker02
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
252 13. PROVISIONAR AMBIENTES COM DOCKER MACHINE
Links
[1] Docker Machine: https://docs.docker.com/machine/concepts/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
14
Extra: introdução e instalação do
Docker UCP
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Installation and Configuration (15% of exam)
Introdução ao Docker UCP
Conceitos
Construído com base no Docker Swarm, o Docker Universal Control Plane [1] permite gerenciar
recursos do Docker, incluindo containers, imagens, registros privados e outros recursos.
O Docker Universal Control Plane (UCP), é a solução de gerenciamento de cluster com nível
empresarial do Docker. Você pode instalá-lo atrás de seu firewall, e isso irá ajudá-lo a gerenciar
todo o seu cluster de um único lugar.
Através do Docker Universal Controle Plane é possível:
• Gerenciamento de cluster centralizado via Dashboard e CLI;
253
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
254 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
• Implantar, gerenciar e monitorar containers;
• Configurar autenticação LDAP e controle de acesso;
• Gerenciar redes, volumes e secrets do Docker;
• Monitoramento do status de nós do cluster via Dashboard.
Requisitos de instalação Docker UCP
• Requisitos mínimos
– 8 GB de RAM para os nós manager;
– 4 GB de RAM para nós worker;
– 2 vCPUs para nós do manager;
– 4 GB de espaço livre em disco, para a partição /var em nós manager;
– 500 MB de espaço livre em disco, para a partição /var em nós worker.
• Requisitos para ambientes de produção
– 16 GB de RAM para nós manager;
– 4 vCPUs para nós manager;
– 25 à 100 GB de espaço livre em disco.
Observe que as imagens do contêiner do Windows são geralmente maiores do que
as imagens do contêiner do Linux. Por esse motivo, você deve provisionar mais
armazenamento local para nós do Windows e para quaisquer configurações de DTR
que armazenem imagens de contêiner do Windows.
Atualização do Docker UCP
Antes de atualizar o Docker UCP, primeiro atualize o Docker Engine e o kernel, através do
comando apt upgrade ou yum update, dependendo da sua distribuição Linux. Em seguida, faça
a atualização do UCP através do comando docker/ucp upgrade e por último a atualização do
DTR através do comando docker/dtr upgrade.
LAB 11.1 – Instalar o Docker UCP
Neste laboratório vamos aprender como instalar o Docker UCP em um ambiente Swarm exis-
tente.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux. Antes de iniciar as
máquinas virtuais, aumente a quantidade de memória da máquina virtual manager para 5GB.
Edite o arquivo environment.yaml que está na pasta 4540 e realize a seguinte alteração:
1 arquivo environment.yaml
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
255 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
2 ---
3 - name: manager
4 box: 4linux/centos7
5 hostname: manager
6 ipaddress: 172.16.0.100
7 memory: 5120
8 cpus: 1
9 provision: provision/ansible/manager.yaml
Inicie a máquina virtual Manager aplicando a alteração da quantidade de memória:
1 vagrant up manager --provision
Inicie as demais máquinas virtuais do curso:
1 vagrant up worker01
2 vagrant up worker02
3 vagrant up registry
Em seguida, acesse a máquina virtual Manager, através do vagrant ssh e alterne para a
conta do usuário suporte.
1 vagrant ssh manager
2 sudo su - suporte
Cluster Swarm
Antes de instalar o Docker UCP, verifique o estado de seu Cluster Swarm:
1 docker node ls
Resultado do comando:
1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ENGINE VERSION
2
3 4apkxs46tgyn0k6bpe7q3t7d2 * manager Ready Active Leader
19.03.8
4 bubiu21p2amsvj4lgix8gt4np worker01 Ready Active
19.03.8
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
256 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
5 fdi5n76upcedwaziocung42bn worker02 Ready Active
19.03.8
Remova os nós worker01 e worker02:
1 docker node rm -f worker01 worker02
Acesse a máquina virtual Worker 01 através do vagrant ssh.
1 vagrant ssh worker01
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
E execute o comando para abandonar o cluster Swarm:
1 docker swarm leave
Resultado do comando:
1 Node left the swarm.
Acesse a máquina virtual Worker 02 através do vagrant ssh.
1 vagrant ssh worker02
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
E execute o comando para abandonar o cluster Swarm:
1 docker swarm leave
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
257 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
1 Node left the swarm.
Docker UCP
Acesse a máquina virtual Manager através do vagrant ssh.
1 vagrant ssh manager
Para realizar o laboratório, alterne para a conta do usuário suporte.
1 sudo su - suporte
Para ter acesso a lista de comandos do Docker UCP, execute:
1 sudo docker container run --rm -ti --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 --help
Para ter acesso a lista de opções de instalação do Docker UCP, execute:
1 sudo docker container run --rm -ti --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 install --help
Instale o Docker UCP através do seguinte comando:
1 sudo docker container run --rm -ti --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 install --host-address 172.16.0.100
Anote a senha do usuário admin, gerada durante o inicio da instalação:
1 Unable to find image ’docker/ucp:3.1.13’ locally
2 3.1.13: Pulling from docker/ucp
3 4167d3e14976: Pull complete
4 af325902296c: Pull complete
5 1c053272dca9: Pull complete
6 Digest: sha256:8ef41e8fa4b40ede84fc8633a28f61ed0bae009e293aad9f1a9fb042fcab8688
7 Status: Downloaded newer image for docker/ucp:latest
8 INFO[0000] Your Docker daemon version 19.03.8, build afacb8b (3.10.0-1062.18.1.
el7.x86_64) is compatible with UCP 3.2.6 (04ac981)
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
258 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
1 INFO[0135] Login to UCP at https://172.16.0.100:443
2 INFO[0135] Username: admin
3 INFO[0135] Password:9782j6A9pN-99U-sUaUNJVn54zuUrYke
Opções de Instalação
• install: permite instalar o Docker UCP no nó do cluster Swarm;
• --host-address: define o endereço de rede que será anunciado para os outros nós do
cluster Swarm;
• --interactive: executa a instalação no modo interativo e solicita o preenchimento de
valores de configuração, tais como nome do usuário, senha e um apelido adicional;
• --rm: remove automaticamente o contêiner ao sair;
• --tty: aloca um pseudo-TTY
LAB 11.2 – Acesso ao painel do Docker UCP
Neste laboratório vamos aprender como acessar o Painel do Docker UCP.
Acesse no navegador web do seu computador o IP da máquina virtual Manager na porta 443.
Entre com o usuário admin e a senha gerada durante a instalação do Docker UCP:
• Acesso: https://172.16.0.100
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
259 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.1: Docker UCP - Tela Inicial
Em seguida clique na opção Skip for now para acessar o painel do Docker UCP sem licença.
Fig. 14.2: Docker UCP - Get Free Trial
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
260 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
A Docker vendeu a parte Enterprise (Docker EE/UCP) para a empresa Mirantis [2],
sendo assim não é mais possível adquirir uma licença trial no site do Docker. Para
o desenvolvimento desse conteúdo, este fator não irá impactar nas aulas do Docker
UCP.
Para adquirir uma licença do Docker UCP, entre em contato com a empresa Mirantis através
do link abaixo:
https://info.mirantis.com/contact-us
Como resultado, você poderá visualizar o painel do Docker UCP:
Fig. 14.3: Docker UCP - Acesso ao Painel
Para alterar a senha do usuário admin, clique em admin My Profile Security. Entre com
a senha gerada na instalação e defina uma nova. Para aplicar as mudanças, clique no botão
Update Password:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
261 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.4: Docker UCP - Redefinindo Senha
LAB 11.3 – Gerenciar nós através do Docker UCP
Neste laboratório vamos aprender como acessar o Docker UCP e adicionar os nós worker 01 e
worker 02.
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
443. Logue com o usuário admin e informe sua senha:
• Acesso: https://172.16.0.100
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
262 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.5: Docker UCP - Tela de Login
Em seguida clique na opção Skip for now> para acessar o painel do Docker UCP sem
licença.
Fig. 14.6: Docker UCP - Get Free Trial
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
263 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Clique em Shared Resources Add Node:
Fig. 14.7: Docker UCP - Incluindo Node
Selecione Node Role Worker e copie o comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
264 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.8: Docker UCP - Informações para Inclusão de Node
Alterne para a máquina virtual Worker 01, depois para a máquina virtual Worker 02 e
execute, nas duas máquinas, o comando copiado no painel do Docker UCP:
1 docker swarm join --token SWMTKN-1-27
xmjucr6dd8gv5skb6uid6fwn2sh4k3opbxkvjr84j32gkqjr-4fma2ft3bbp9lmvo2hed2p83t
172.16.0.100:2377
Resultado do comando:
1 This node joined a swarm as a worker.
Alterne para o painel do Docker UCP e verifique se os nós do cluster estão presentes em
Shared Resources Nodes:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
265 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.9: Docker UCP - Validando Inclusão de Nodes
Pode levar alguns minutos para que o status dos Workers fique “Ready” (pronto) com
a indicação na cor verde.
LAB 11.4 – Realizar backup e restauração do Docker UCP
Neste laboratório vamos aprender como realizar backup e restore do Docker UCP.
Acesse a máquina virtual Manager através do vagrant ssh. Para realizar o laboratório,
alterne para a conta do usuário suporte.
Exibir id do Docker UCP
Para começar verifique as opções de comando id no Docker UCP:
1 docker container run --log-driver none --rm -i --name ucp -v /var/run/docker.
sock:/var/run/docker.sock docker/ucp:3.1.13 --help
Em seguida, visualize o ID do Cluster UCP, através do seguinte comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
266 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
1 docker container run --log-driver none --rm -i --name ucp -v /var/run/docker.
sock:/var/run/docker.sock docker/ucp:3.1.13 id
Resultado do comando:
1 time="2020-07-14T12:36:01Z" level=info msg="Your engine version 19.03.12, build
48a66213fe (3.10.0-1127.el7.x86_64) is compatible with UCP 3.1.13 (0c9c2a4)"
2 m2kwbrnk63qb7yezmrdosdpsd
Anote o ID exibido que será utilizado durante o backup do Docke UCP.
Para facilitar nosso gerenciamento, armazene na variável ID, o id do Docker UCP:
1 export ID=$(docker container run --log-driver none --rm -i --name ucp -v /var/
run/docker.sock:/var/run/docker.sock docker/ucp:3.1.13 id 2>1)
Backup do UCP
Para começar verifique as opções de comando backup no Docker UCP:
1 sudo docker container run --rm -i --name ucp -v /var/run/docker.sock:/var/run/
docker.sock --log-driver none docker/ucp:3.1.13 backup --help
Realize o backup do Docker UCP direcionando seu conteúdo para o arquivo backup_ucp.tar,
através do seguinte comando:
1 sudo docker container run --rm -i --name ucp -v /var/run/docker.sock:/var/run/
docker.sock --log-driver none docker/ucp:3.1.13 backup --passphrase "4
LinuxCursoDocker" --id $ID > backup_ucp.tar
Resultado do comando:
1 INFO[0000] Your engine version 19.03.12, build 48a66213fe (3.10.0-1127.el7.
x86_64) is compatible with UCP 3.1.13 (0c9c2a4)
2 INFO[0000] Temporarily stopping local UCP containers to ensure a consistent
backup
3 INFO[0021] Backing up internal KV store
4 INFO[0000] Beginning backup
5 INFO[0003] Backup completed successfully
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
267 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
6 INFO[0026] Resuming stopped UCP containers
Opções utilizadas
• backup: permite realizar o backup do ambiente Docker UCP, armazenando em um ar-
quivo tar;
• --log-driver: define o driver de log que o Docker irá utilizar;
• --i: executa a desinstalação no modo interativo;
• --passphrase: permite descriptografar o arquivo tar de backup com a senha fornecida.
Para fazer backup dos componentes do Docker EE, primeiro realizamos o backup do
através a compactação da pasta /var/lib/docker/swarm, em seguida do UCP através
do comando docker/ucp backup e por ultimo o backup do DTR através do comando
docker/dtr backup.
Verifique o tamanho do arquivo de backup, através do comando du:
1 du -sh backup_ucp.tar
Resultado do comando:
1 233M backup_ucp.tar
Descriptografe o backup e liste seu conteúdo:
1 gpg --decrypt backup_ucp.tar | tar --list
É necessário adicionar o passphrase 4LinuxCursoDocker
Resultado do comando:
1 gpg: directory ‘/home/suporte/.gnupg’ created
2 gpg: criado um novo ficheiro de configuração ‘/home/suporte/.gnupg/gpg.conf’
3 gpg: AVISO: opções em ‘/home/suporte/.gnupg/gpg.conf’ ainda não estão activas
nesta execução
4 gpg: porta-chaves ‘/home/suporte/.gnupg/secring.gpg’ criado
5 gpg: porta-chaves ‘/home/suporte/.gnupg/pubring.gpg’ criado
6 gpg: AES encrypted session key
7 gpg: encrypted with 1 passphrase
8 gpg: NOTA: o remetente solicitou "apenas-para-seus-olhos"
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
268 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
9 ./ucp-auth-store.json
10 ./ucp-kube-apiserver.json
11 ./ucp-kube-controller-manager.json
12 ./ucp-kubelet.json
13 ./ucp-kube-proxy.json
14 ./ucp-kube-scheduler.json
15 ./ucp-controller.json
16 ./ucp-swarm-manager.json
17 ./ucp-kv.json
18 ./ucp-proxy.json
19 ./ucp-client-root-ca.json
20 ./ucp-cluster-root-ca.json
21 ./ucp-agent.1z20br1rcoj8ulketgivf7ggf.vihiq2k5ex9e94c6gg0aiaurw.json
22 ./ucp-auth-api-certs/23 ./ucp-auth-api-certs/ca.pem
24 ./ucp-auth-api-certs/cert.pem
25 ./ucp-auth-api-certs/key.pem
26 ./ucp-auth-store-certs/
27 ./ucp-auth-store-certs/ca.pem
28 ./ucp-auth-store-certs/cert.pem
29 ./ucp-auth-store-certs/key.pem
30 ./ucp-auth-store-data/
31 ./ucp-auth-store-data/rethinkdb/
32 ./ucp-auth-store-data/rethinkdb/047ccdd8-50f9-4ea2-909c-860c5e0c9768
33 ./ucp-auth-store-data/rethinkdb/1780e5c2-639c-4c53-af87-0e803965803b
34 ./ucp-auth-store-data/rethinkdb/20b3a9ce-4b97-482d-904a-1540006dd3a5
35 ./ucp-auth-store-data/rethinkdb/2ae33d8b-d266-4a34-981c-49dfdc5f8464
36 ./ucp-auth-store-data/rethinkdb/2c78341e-2ee4-49c8-87c7-4546269e890c
37 ./ucp-auth-store-data/rethinkdb/4a85b83e-a5fb-4ca3-a0a4-c8e83c05cb8c
38 ./ucp-auth-store-data/rethinkdb/54045c69-726c-484e-b836-a71c299d4957
39 ./ucp-auth-store-data/rethinkdb/5aaec234-9988-4b29-b675-6141c3348db0
40 ./ucp-auth-store-data/rethinkdb/64aebbc3-1454-4ded-997a-b3089d410a16
41 ./ucp-auth-store-data/rethinkdb/8763b4cc-c54d-4431-b79a-d1bc657d17c7
42 ./ucp-auth-store-data/rethinkdb/95ada295-0a11-4753-8a07-29c85a5599e6
43 ./ucp-auth-store-data/rethinkdb/a9d5f009-a1f1-4f01-bf43-7bffdf77429b
44 ./ucp-auth-store-data/rethinkdb/b6b12bce-c7a4-4c0e-93c4-238192902b93
45 ./ucp-auth-store-data/rethinkdb/b99e788e-7dd4-448d-b54c-15ccb000cb33
46 ./ucp-auth-store-data/rethinkdb/c39eefec-32f3-4c15-acee-7a6b2997f98e
47 ./ucp-auth-store-data/rethinkdb/c8321409-48fb-4375-bc34-99320ddaf450
48 ./ucp-auth-store-data/rethinkdb/cf33bb4f-d4c1-4464-a6b3-febcc10248d5
49 ./ucp-auth-store-data/rethinkdb/daa934fe-03d6-424e-989f-2e51b7faaa42
50 ./ucp-auth-store-data/rethinkdb/ee61bd83-57f6-4b95-afbc-3f0da78fbea8
51 ./ucp-auth-store-data/rethinkdb/log_file
52 ./ucp-auth-store-data/rethinkdb/metadata
53 ./ucp-auth-store-data/rethinkdb/tmp/
54 ./ucp-auth-store-data/rethinkdb.config
55 ./ucp-auth-worker-certs/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
269 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
56 ./ucp-auth-worker-certs/ca.pem
57 ./ucp-auth-worker-certs/cert.pem
58 ./ucp-auth-worker-certs/key.pem
59 ./ucp-auth-worker-data/
60 ./ucp-auth-worker-data/addr.txt
61 ./ucp-auth-worker-data/id
62 ./ucp-auth-worker-data/jobs/
63 ./ucp-auth-worker-data/jobs/0e/
64 ./ucp-auth-worker-data/jobs/0e/ae560f-6661-4dde-8b38-ec6af4b06471/
65 ./ucp-auth-worker-data/jobs/0e/ae560f-6661-4dde-8b38-ec6af4b06471/log
66 ./ucp-auth-worker-data/jobs/5a/
67 ./ucp-auth-worker-data/jobs/5a/dbc150-530b-470c-b302-debda696f967/
68 ./ucp-auth-worker-data/jobs/5a/dbc150-530b-470c-b302-debda696f967/log
69 ./ucp-client-root-ca/
70 ./ucp-client-root-ca/cert.pem
71 ./ucp-client-root-ca/key.pem
72 ./ucp-cluster-root-ca/
73 ./ucp-cluster-root-ca/cert.pem
74 ./ucp-cluster-root-ca/key.pem
75 ./ucp-controller-client-certs/
76 ./ucp-controller-client-certs/ca.pem
77 ./ucp-controller-client-certs/cert.pem
78 ./ucp-controller-client-certs/key.pem
79 ./ucp-controller-server-certs/
80 ./ucp-controller-server-certs/ca.pem
81 ./ucp-controller-server-certs/cert.pem
82 ./ucp-controller-server-certs/key.pem
83 ./ucp-kv/
84 ./ucp-kv/snapshot.db
85 ./ucp-kv-certs/
86 ./ucp-kv-certs/ca.pem
87 ./ucp-kv-certs/cert.pem
88 ./ucp-kv-certs/key.pem
89 ./ucp-node-certs/
90 ./ucp-node-certs/ca.pem
91 ./ucp-node-certs/cert.pem
92 ./ucp-node-certs/controller-manager.conf
93 ./ucp-node-certs/encryption.cfg
94 ./ucp-node-certs/joint-ca.pem
95 ./ucp-node-certs/key.pem
96 ./ucp-node-certs/kubeconfig
97 ./ucp-node-certs/kubelet.conf
98 ./ucp-node-certs/kubeproxy.conf
99 ./ucp-node-certs/scheduler.conf
100 ./ucp-node-certs/service_account_key.pem
101 ./ucp-node-certs/ucp-reconciler.conf
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
270 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Opções utilizadas
• gpg: é uma ferramenta que fornece serviços digitais de criptografia e assinatura, uti-
lizando o padrão OpenPGP;
• --list: permite listar arquivos armazenados no arquivo tar.
Desinstalação do Docker UCP
Antes de realizar a desinstalação, visualize o ID do Cluster UCP através do seguinte comando:
1 docker container run --log-driver none --rm -i --name ucp -v /var/run/docker.
sock:/var/run/docker.sock docker/ucp:3.1.13 id
Resultado do comando:
1 time="2020-07-14T12:36:01Z" level=info msg="Your engine version 19.03.12, build
48a66213fe (3.10.0-1127.el7.x86_64) is compatible with UCP 3.1.13 (0c9c2a4)"
2 m2kwbrnk63qb7yezmrdosdpsd
Para facilitar nosso gerenciamento, armazene na variável ID o id do Docker UCP:
1 export ID=$(docker container run --log-driver none --rm -i --name ucp -v /var/
run/docker.sock:/var/run/docker.sock docker/ucp:3.1.13 id 2>1)
Verifique as opções de comando uninstall-ucp no Docker UCP:
1 sudo docker container run --rm -ti --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 uninstall-ucp --help
Desinstale o Docker UCP informando o ID do Cluster:
1 sudo docker container run --rm -i --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 uninstall-ucp --id $ID
Resultado do comando:
1 time="2020-07-14T12:37:12Z" level=info msg="Your engine version 19.03.12, build
48a66213fe (3.10.0-1127.el7.x86_64) is compatible with UCP 3.1.13 (0c9c2a4)"
2 time="2020-07-14T12:37:12Z" level=info msg="Uninstalling UCP on each node..."
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
271 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
3 time="2020-07-14T12:37:39Z" level=info msg="UCP has been removed from this
cluster successfully."
4 time="2020-07-14T12:37:41Z" level=info msg="Removing UCP Services"
Opções utilizadas
• id: exibe o ID do Docker UCP em execução no nó do cluster;
• uninstall-ucp: permite desinstalar o Docker UCP no nó do cluster Swarm.
Restore do Docker UCP
Antes de realizar a ação de restore, verifique as opções do subcomando restore no Docker
UCP:
1 sudo docker container run --rm -i --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 restore --help
Restaure o Docker UCP, informando a senha e o arquivo tar:
1 sudo docker container run --rm -i --name ucp -v /var/run/docker.sock:/var/run/
docker.sock docker/ucp:3.1.13 restore --passphrase "4LinuxCursoDocker" <
backup_ucp.tar
Resultado do comando:
1 time="2020-07-14T12:48:40Z" level=info msg="Your engine version 19.03.12, build
48a66213fe (3.10.0-1127.el7.x86_64) is compatible with UCP 3.1.13 (0c9c2a4)"
2 time="2020-07-14T12:48:40Z" level=warning msg="None of the hostnames we’ll be
using in the UCP certificates [manager 127.0.0.1 172.17.0.1] contain a
domain component. Your generated certs may fail TLS validation unless you
only use one of these shortnames or IPs to connect. You can use the --san
flag to add more aliases"
3 time="2020-07-14T12:48:40Z" level=warning msg="Restore is running in non-
interactive mode. Proceeding to read backup file from stdin"
4 time="2020-07-14T12:48:40Z" level=info msg="Determining Swarm state"
5 time="2020-07-14T12:48:40Z" level=warning msg="This manager is already in a
swarm, if this swarm is different than the one the backup was taken from
then any existing Admin Client Bundles will not be operational against the
new cluster."
6 time="2020-07-14T12:48:40Z" level=info msg="Parsing backup file"
7 time="2020-07-14T12:48:46Z" level=info msg="Deploying UCP Agent Service"
8 time="2020-07-14T12:50:52Z" level=info msg="The cluster has been successfully
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
272 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
restored. Please ensure that all managers of the cluster are healthy UCP
controllers"
Opções utilizadas
• restore: permite realizar o restore do ambiente Docker UCP, armazenando em um
arquivo tar;
• --passphrase: permite descriptografar o arquivo tar de backup com a senha fornecida.
Acesse o Painel do Docker UCP para verificar se o restore foi realizado com sucesso:
• Acesso: https://172.16.0.100
Fig. 14.10: Docker UCP - Tela de Login
Em seguida clique na opção Skipfor now para acessar o painel do Docker UCP sem licença.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
273 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Fig. 14.11: Docker UCP - Get Free Trial
Fig. 14.12: Docker UCP - Dashboard
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
274 14. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DOCKER UCP
Links
[1] Docker UCP: https://docs.docker.com/ee/ucp/
[2] Mirantis UCP: https://www.mirantis.com/software/docker/download/
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
15
Extra: introdução e instalação do
DTR
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Image Creation Management, and Registry
(20% of exam)
Introdução ao DTR
Conceitos
O Docker Trusted Registry (DTR) [1], é a solução de armazenamento de imagem com nível
empresarial do Docker. Ele deve ser instalado por trás do firewall, para poder armazenar e
gerenciar com segurança as imagens do Docker usadas nos aplicativos.
Você pode usar o DTR como parte de sua integração contínua, e processos de entrega contínua
para criar, enviar e executar seus aplicativos.
O DTR tem uma interface de usuário web, que permite que usuários autorizados em sua
organização naveguem pelas imagens do Docker e revisem eventos do repositório. Ele ainda
275
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
276 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
permite que você veja quais linhas do Dockerfile foram usadas para produzir a imagem e se a
verificação de segurança estiver ativada, será possível visualizar uma lista de todos os softwares
instalados em suas imagens. Além disso, você pode revisar e auditar trabalhos na interface
web.
Arquitetura
Fig. 15.1: Docker Trust Registry
O DTR permite o gerenciamento via Docker CLI para efetuar login, realizar downloads e
uploads de imagens. Você pode utilizar o mesmo login do Docker UCP no DTR, sendo local
ou remoto como uma base LDAP [2].
Funcionalidades do DTR
• Gerenciamento de imagem e trabalho
O DTR pode ser instalado no local ou em uma nuvem privada virtual. E com isso, é possível
armazenar suas imagens do Docker com segurança, atrás do seu firewall.
• Disponibilidade
O DTR é altamente disponível, por meio do uso de várias réplicas de todos os containers e
metadados, de modo que, se uma máquina falhar, o DTR continuará a operar e poderá ser
reparado.
• Eficiência
O DTR tem a capacidade de armazenar as imagens em cache mais perto dos usuários, para
reduzir a quantidade de largura de banda usada ao extrair imagens do Docker.
• Controle de acesso embutido
O DTR usa o mesmo mecanismo de autenticação que o Docker UCP. Os usuários podem
ser gerenciados manualmente ou sincronizados à partir do LDAP ou do Active Directory. O
DTR usa RBAC (Role Based Access Control) para permitir a implementação de políticas de
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
277 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
controle de acesso, refinadas para as imagens do Docker.
• Varredura de segurança
O DTR [3] possui um scanner de segurança integrado, que pode ser usado para descobrir
quais versões de software são usadas em suas imagens. Ele verifica cada camada e agrega os
resultados para fornecer uma visão completa do que você está enviando como parte de sua
pilha.
LAB 12.1 – Instalação do DTR
Neste laboratório vamos aprender como instalar o Docker DTR na máquina virtual Worker
02.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux. Para iniciar as
máquinas virtuais, utilize o subcomando up do Vagrant e em seguida, acesse a máquina vir-
tualWorker 02, através do vagrant ssh e alterne para a conta do usuário suporte.
Em seguida visualize as opções de instalação do DTR:
1 docker run -it --rm docker/dtr:latest --help
Para ter acesso a lista de opções de instalação do Docker DTR, execute:
1 docker run -it --rm docker/dtr:latest --install --help
Antes de configurar o Docker DTR, baixe o certificado do servidor através do comando curl:
1 curl -s -k https://172.16.0.100/ca > ca.pem
Em seguida, realize a instalação do DTR, através do seguinte comando:
1 docker run -it --rm docker/dtr install --ucp-url ’https://172.16.0.100’ --ucp-
username ’admin’ --ucp-password ’4LinuxCursoDocker’ --ucp-ca "$(cat ca.pem)"
Necessário alterar o valor da flag --ucp-password para a senha configurada no UCP.
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
278 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
1 ‘‘‘text
2 INFO[0000] Beginning Docker Trusted Registry installation
3 INFO[0000] Validating UCP cert
4 INFO[0000] Connecting to UCP
5 INFO[0000] health checking ucp
6 INFO[0000] The UCP cluster contains the following nodes without port conflicts:
worker02, worker01
7 ‘‘‘
8 ‘‘‘yml
9 ucp-node: Choose a UCP Node [worker02]: <TECLE ENTER>
10 ‘‘‘
11 ‘‘‘text
12 ....
13 INFO[0676] Establishing connection with Rethinkdb
14 INFO[0677] Verifying auth settings...
15 INFO[0677] Successfully registered dtr with UCP
16 INFO[0677] Installation is complete
17 INFO[0677] Replica ID is set to: 692aed5335dc
18 INFO[0677] You can use flag ’--existing-replica-id 692aed5335dc’ when joining
other replicas to your Docker Trusted Registry Cluster
19 ‘‘‘
Descrição dos comandos
• --ucp-url: define o IP do servidor Docker UCP;
• --ucp-username: define o nome do usuários administrador do Docker UCP;
• --ucp-password: define a senha de administrador do Docker UCP;
• --ucp-ca: define o conteúdo do certificado CA do Docker UCP.
Acesse no navegador do seu computador, o IP da máquina virtual Worker 02 na porta 443.
Entre com o usuário admin e sua senha:
• Acesso: https://172.16.0.102
Fig. 15.2: DTR - Tela de Login
Em seguida clique na opção Skip for now para acessar o painel do Docker Trust Registry
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
279 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
sem licença.
Fig. 15.3: DTR - Configuração de Domain & Proxies
Clique em System, Domain & Proxies e preencha o IP 172.16.0.102 e clique no botão
Save:
Fig. 15.4: DTR - Habilitando opção “Create Repository on Push”
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
280 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
Em Repositories ative a opção Create repository on push:
Fig. 15.5: DTR - Habilitando opção “Create Repository on Push”
LAB 12.2 – Enviar imagem para o DTR
Neste laboratório vamos aprender como realizar o envio de imagens para o servidor Docker
DTR:
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux, em seguida, acesse a
máquina virtual Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Execute o comando docker login para logar no DTR:
1 docker login 172.16.0.102
Resultado do comando:
1 ‘‘‘txt
2 Username: admin
3 Password: 4LinuxCursoDocker
4 Login Succeeded
5 ‘‘‘
Faça o download da imagem busybox:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
281 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
1 docker pull busybox:latest
Resultado do comando:
1 ‘‘‘txt
2 latest: Pulling from library/busybox
3 d9cbbca60e5f: Pull complete
4 Digest: sha256:52cfc475afdd697afd2dbe1a3761c8001bf3ba39f76819c922128c088869d339
5 Status: Downloaded newer image for busybox:latest
6 ‘‘‘
Defina uma tag para a imagem busybox:
1 docker tag busybox:latest 172.16.0.102/admin/busybox:latest
Faça o upload da imagem busybox ao DTR na conta do usuário admin:
1 docker push 172.16.0.102/admin/busybox:latest
Resultado do comando:
1 ‘‘‘txt
2 50761fe126b6: Preparing
3 error parsing HTTP 402 response body: invalid character ’D’ looking for
beginning of value: "DTR doesn’t have a license\n"
4 ‘‘‘
Devido à venda da parte Enterprise para a Mirantis„ não será possível ter acesso a
uma licença trial nem gerenciar downloads e uploads de imagens no Docker Trust
Registry.
Para adquirir uma licença do Docker Trusty Registry, entre em contatocom a empresa Mirantis
através do link abaixo:
https://info.mirantis.com/contact-us
A seguir, veremos como utilizar o controle de acesso baseado em função (RBAC), que é
utilizado para conduzir decisões de autorização por meio do Docker UCP.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
282 15. EXTRA: INTRODUÇÃO E INSTALAÇÃO DO DTR
Links
[1] Docker DTR: https://docs.mirantis.com/docker-enterprise/v3.0/dockeree-products/dtr.html
[2] Arquitetuta DTR: https://docs.mirantis.com/docker-enterprise/v3.0/dockeree-products/dtr/dtr-
architecture.html
[3] Produtos Docktree: https://docs.mirantis.com/docker-enterprise/v3.0/dockeree-products/dtr.html
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
16
Extra: configuração RBAC no
Docker UCP
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Installation and Configuration (15% of exam)
DCA (Docker Certified Associate) Security (15% of exam)
RBAC
Conceitos
O controle de acesso baseado em função (RBAC), é utilizado para conduzir decisões de autor-
ização, permitindo que os administradores configurem políticas dinamicamente por meio do
Docker UCP; A partir do Docker UCP 3.1, as funções do Kubernetes e Swarm têm visualiza-
ções separadas. É possível visualizar todas as funções de um cluster específico em Controle
de acesso e depois em Funções. Selecione Kubernetes ou Swarm para visualizar as funções
específicas de cada um.
283
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
284 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Componentes do RBAC
• Usuários
Cada pessoa precisa de uma conta de usuário do UCP. Todas as contas são criadas com um
acesso padrão de “sem acesso”.
• Organizações e equipes
As equipes são usadas para organizar os usuários. Exemplo: desenvolvimento, homologação,
produção etc.
• Roles
A partir do UCP 2.2.x, as funções podem ser definidas com muita granularidade. Cada função
tem seu próprio conjunto de permissões. As funções padrão devem funcionar para a maioria
dos casos de uso e não devem ser necessárias na maioria dos ambientes, para criar mais do
que algumas funções personalizadas. Uma das funções trata especificamente, sobre listar
permissões e não deve refletir em uma equipe de pessoas nem em uma coleção de recursos.
• Grants
Uma concessão (Grant) define quem (sujeito) tem acesso específico (função) a um conjunto
de recursos (coleção Swarm ou namespace do Kubernetes).
LAB 13.1 – Configurar equipes e usuários e no Docker UCP
Neste laboratório vamos aprender como adicionar equipes e usuários no Docker UCP.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux. Para iniciar as
máquinas virtuais, utilize o subcomando up do Vagrant.
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
443. Logue com o usuário admin e informe sua senha:
• Acesso: https://172.16.0.100
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
285 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.1: UCP - Tela de Login
Em seguida clique na opção Skip for now para acessar o painel do Docker UCP sem licença.
Fig. 16.2: Docker UCP - Get Free Trial
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
286 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Adicionar equipes
Em seguida, clique em Access Control Orgs & Teams docker-datacenter:
Fig. 16.3: UCP - Orgs & Teams
Para criar uma nova equipe, clique no ícone + Create Team:
Fig. 16.4: UCP - Criando um Time
Preencha no campo Team Name o nome developers:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
287 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.5: UCP - Adicionando Nome ao Time
Repita os passos para criar a equipe analistas e devops:
Fig. 16.6: UCP - Criando outros Times
Adicionar usuários
Clique em Access Control Users Create:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
288 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.7: UCP - Criando Usuários
Preencha as seguintes informações:
Username Password Full Name
linus 4LinuxCursoDocker Linus Torvalds
Fig. 16.8: UCP - Preenchendo Informações do Novo Usuário
Repita os passos para criar os usuários tux e analista:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
289 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Username Password Full Name
tux 4LinuxCursoDocker Tux Linux
analista 4LinuxCursoDocker Analista DevOps
Fig. 16.9: UCP - Lista de Usuários
Associar um usuário a uma equipe
Volte a Orgs & Teams docker-datacenter Add User da equipe developers:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
290 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.10: UCP - Orgs - Adicionando Usuários
Escolha o usuário linus para fazer parte da equipe developers:
Fig. 16.11: UCP - Orgs - Escolhendo Usuário - Linus
Em Add User da equipe analistas, escolha o usuário tux para fazer parte da equipe:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
291 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.12: UCP - Orgs - Escolhendo Usuário - Tux
Em Add User da equipe devops, escolha o usuário analista para fazer parte da equipe:
Fig. 16.13: UCP - Orgs - Escolhendo Usuário - Analista
Para testar o login dos novos usuários, realize o Logout do usuário admin através do menu
admin Sign Out
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
292 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.14: UCP - Sign Out
Logue com o usuário analista e senha 4LinuxCursoDocker:
Fig. 16.15: UCP - Tela de Login
Como resultado, você poderá visualizar o painel do Docker UCP:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
293 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.16: UCP - Dashboard Analista
LAB 13.2 – Configurar Access Control no Docker UCP
Neste laboratório vamos aprender como gerenciar RBAC no Docker UCP.
Acesse no navegador web do seu copmputador, o IP da máquina virtual Manager na porta
443. Logue com o usuário analista e senha 4LinuxCursoDocker:
• Acesso: https://172.16.0.100
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
294 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.17: UCP - Tela de Login
Em seguida clique em Shared Resources Images Pull Image:
Fig. 16.18: UCP - Docker Images
Verifique se o usuário possui permissão para baixar a imagem centos:7, informando seu nome
na caixa Name:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
295 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.19: UCP - Pull Image
Perceba que o usuário analista não possui permissão de baixar imagens no Docker UCP:
Fig. 16.20: UCP - Permissão Negada
Deslogue com o usuário analista e logue com o usuário admin:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
296 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.21: UCP - Tela de Login
Criar role (regras)
Clique em Access Control Roles Swarm botão Create:
Fig. 16.22: UCP - Criando Role
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
297 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Defina o nome pull images na caixa Name e em seguida, clique na opção Operations:
Fig. 16.23: UCP - Role Details
Na área de IMAGE OPERATIONS, clique na opção Image Load e no botão Create:
Fig. 16.24: UCP - Role Operations
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
298 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Conceder acesso
Com o usuário admin, clique em Access Control Grants Swarm botão Create Grant:
Fig. 16.25: UCP - Criando Concessão
Em Subject selecione User = analista botão Next Resource Set = Swarm botão Selected
Next Role = pull images botão Create
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
299 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.26: UCP - Preenchendo Informações de Acesso
Alterne para o usuário analista(senha: 4LinuxCursoDocker) e clique em Shared Resources
Images Pull Image:
Fig. 16.27: UCP - Docker Images
Tente novamente baixara imagem centos:7, informando seu nome na caixa Name:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
300 16. EXTRA: CONFIGURAÇÃO RBAC NO DOCKER UCP
Fig. 16.28: UCP - Pull Image
Perceba que agora o usuário analista, possui permissão de baixar imagens no Docker UCP:
Fig. 16.29: UCP - Pull Realizado com Sucesso
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
17
Extra: Docker Security
Competências do conteúdo
Este material possui conteúdo que atende aos objetivos das seguintes certificações:
Certificação Objetivos
DCA (Docker Certified Associate) Security (15% of exam)
Áreas principais na segurança do Docker
Conceito
Recursos de segurança que podemos configurar e usar na instalação do Docker Engine:
• É possível de configurar os recursos de confiança do Docker, para que seus usuários
possam enviar e receber imagens confiáveis;
• Proteja o socket do daemon Docker e assegurar apenas conexões confiáveis do cliente
do Docker;
• Também é possível pode utilizar a autenticação cliente-servidor, baseada em certificado,
para verificar se um daemon do Docker possui os direitos para acessar imagens em um
registro;
• Poderá configurar as políticas do modo de computação seguro (Seccomp), para proteger
as chamadas do sistema em um container;
• Use um perfil do AppArmor para o Docker, que é instalado com os pacotes .deb oficiais.
301
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
302 17. EXTRA: DOCKER SECURITY
Por isso devemos manter atenção nos seguintes componentes:
• Kernel namespaces
Os namespaces fornecem a primeira e mais direta forma de isolamento. Os processos em
execução dentro de um container, não podem ver e nem afetar os processos em execução em
outro container ou sistema host.
• Grupos de controle
Grupos de controle (control groups), é outro componente importante dos containers Linux.
Eles implementam a contabilidade e a limitação de recursos; Também fornecem muitas métri-
cas úteis e ajudam a garantir que cada container receba seu quinhão de memória, CPU e E/S
de disco. E o mais importante: um único container não pode reduzir o sistema, esgotando
um desses recursos.
• Superfície de ataque do daemon do Docker
A execução de containers e aplicativos com o Docker, implica em executar o daemon do
Docker. Esse daemon atualmente, requer privilégios de root; Portanto, você precisa estar
ciente de que somente usuários confiáveis, devem ter permissão para controlar seu daemon do
Docker.
• Capabilities do kernel Linux
Por padrão, o Docker inicia containers com um conjunto restrito de recursos. O que isso
significa? As capabilities transformam a dicotomia binária “root/non-root” em um sistema de
controle de acesso refinado. Processos (servidores web) que só precisam ligar em uma porta
menor que 1024, não precisam ser executados como root, eles podem receber apenas o recurso
net_bind_service. Há muitos outros recursos para quase todas as áreas específicas, de forma
que os privilégios do usuário root sejam realmente necessários.
Saiba mais executando o comando: man 7 capabilities
• Verificação de assinatura de confiança de conteúdo do Docker
O Docker Engine pode ser configurado para executar apenas imagens assinadas. O recurso
de verificação de assinatura do Docker Content Trust, é construído diretamente no binário
dockerd. Isso é configurado no arquivo de configuração do Dockerd;
Para ativar esse recurso, o trustpinning pode ser configurado no daemon.json, segundo o
qual apenas os repositórios assinados com uma chave raiz especificada pelo usuário, podem
ser extraídos e executados.
• Docker Content Trust (DCT)
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
303 17. EXTRA: DOCKER SECURITY
O Docker Content Trust fornece fortes garantias criptográficas, sobre qual o código e as
versões de software estão sendo executados em sua infraestrutura; O DCT integra o Update
Framework (TUF) ao Docker, usando o Notary, uma ferramenta de software livre que fornece
confiança sobre qualquer conteúdo.
LAB 14.1 – Gerenciar imagens com Docker Content Trust
Neste laboratório vamos aprender como realizar download e upload de imagens com o recurso
Docker Content Trust ativado.
Para começar acesse a pasta 4540 que você obteve do Github da 4Linux. Para iniciar as
máquinas virtuais, utilize o subcomando up do Vagrant, em seguida, acesse a máquina virtual
Manager, através do vagrant ssh e alterne para a conta do usuário suporte.
Realizar o download
Ative a confiança de conteúdo do Docker:
1 export DOCKER_CONTENT_TRUST=1
Tente baixar uma imagem do Docker HUB:
1 docker pull jpetazzo/clock
Resultado do comando:
1 Using default tag: latest
2 Error: remote trust data does not exist for docker.io/jpetazzo/clock: notary.
docker.io does not have trust data for docker.io/jpetazzo/clock
Desative a confiança de conteúdo do Docker e tente baixar uma imagem do Docker HUB:
1 export DOCKER_CONTENT_TRUST=0
1 docker pull jpetazzo/clock
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
304 17. EXTRA: DOCKER SECURITY
1 Using default tag: latest
2 latest: Pulling from jpetazzo/clock
3 0f8c40e1270f: Pull complete
4 Digest: sha256:ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26
5 Status: Downloaded newer image for jpetazzo/clock:latest
6 docker.io/jpetazzo/clock:latest
Realizar o upload
Logue com o usuário suporte e execute o comando para logar no DockerHub:
1 docker login
Resultado do comando:
1 Username: <USUARIO_DOCKER_HUB>
2 Password: <SENHA_DOCKER_HUB>
Defina uma tag para a imagem clock:latest:
1 docker tag jpetazzo/clock:latest USUARIO_DOCKER_HUB/clock:latest
Faça o upload da imagem clock ao Docker Trusted Repository :
1 docker push USUARIO_DOCKER_HUB/clock:latest
Resultado do comando:
1 The push refers to repository [docker.io/cursodocker4linux/clock]
2 1da8e4c8d307: Mounted from jpetazzo/clock
3 latest: digest: sha256:
ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26 size: 527
Antes de continuar, ative novamente a confiança de conteúdo do Docker:
1 export DOCKER_CONTENT_TRUST=1
Tente enviar novamente a imagem ao Docker HUB. Você precisará informar um senha para a
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
305 17. EXTRA: DOCKER SECURITY
chave do usuário root e a chave do novo repositório:
1 docker push USUARIO_DOCKER_HUB/clock:latest
Resultado do comando:
1 The push refers to repository [docker.io/cursodocker4linux/clock]
2
3 1da8e4c8d307: Layer already exists
4 latest: digest: sha256:
ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26 size: 527
5 Signing and pushing trust metadata
6 You are about to create a new root signing key passphrase. This passphrase
7 will be used to protect the most sensitive key in your signing system. Please
8 choose a long, complex passphrase and be careful to keep the password and the
9 key file itself secure and backed up. It is highly recommended that you use a
10 password manager to generate the passphrase and keep it safe. There will be no
11 way to recover this key. You can find the key in your config directory.
1 Enter passphrase for new root key with ID 120758b: INFORME_A_CHAVE_DE_ROOT
2 Repeat passphrase for new root key with ID 120758b: INFORME_A_CHAVE_DE_ROOT
3 Enter passphrase for new repository key with ID 6e56494:
INFORME_A_CHAVE_DE_REPOSITORIO
4 Repeat passphrase for new repository key with ID 6e56494:
INFORME_A_CHAVE_DE_REPOSITORIO
1 Finished initializing "docker.io/cursodocker4linux/clock"
2 Successfully signed docker.io/cursodocker4linux/clock:latest
Em seguida, acesse a máquina virtual Worker 01, através do vagrant ssh e alterne para a
conta do usuário suporte.
Ative a confiança de conteúdo do Docker:
1 export DOCKER_CONTENT_TRUST=1
Tente baixar uma imagem do Docker HUB de sua conta:
1 docker pull USUARIO_DOCKER_HUB/clock:latest
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
306 17. EXTRA: DOCKER SECURITY
Resultado do comando:
1 Pull (1 of 1): cursodocker4linux/clock:latest@sha256:ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26
2 sha256:ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26: Pulling
from cursodocker4linux/clock
3 0f8c40e1270f: Pull complete
4 Digest: sha256:ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26
5 Status: Downloaded newer image for cursodocker4linux/clock@sha256:
ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26
6 Tagging cursodocker4linux/clock@sha256:
ace75dda37174abb563799a8b9b2043505619559fe1120a26a63363dc48bcd26 as
cursodocker4linux/clock:latest
7 docker.io/cursodocker4linux/clock:latest
Agora foi possível realizar o download com o o fator de confiança de conteúdo ativado,
porque a imagem possui uma chave de root e um repositório confiável verificado.
Certificados
Conceitos
Todos os serviços UCP são expostos usando HTTPS, para garantir que todas as comunicações
entre clientes e UCP sejam criptografadas. Por padrão, isso é feito usando certificados TLS
autoassinados que não são confiáveis por ferramentas do cliente, como navegadores web;
Ao tentar acessar o UCP, seu navegador avisa que ele não confia no UCP ou que o UCP tem
um certificado inválido.
É possível configurar o UCP para usar seus próprios certificados TLS, para que este seja
confiável automaticamente pelo seu navegador e pelas ferramentas do cliente.
Para garantir um impacto mínimo no seu negócio, você deve planejar que essa alteração ocorra
fora dos horários de pico do negócio. Seus aplicativos continuarão funcionando normalmente,
mas os certificados de cliente UCP existentes serão invalidados, portanto, os usuários terão
que baixar novos para acessar o UCP, a partir do terminal em linha de comando.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
307 17. EXTRA: DOCKER SECURITY
LAB 14.2 – Utilizar certificados externos no Docker UCP
Neste laboratório vamos aprender como realizar upload de certificados esterno no painel do
Docker UCP.
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
443. Logue com o usuário admin e informe sua senha:
• Acesso: https://172.16.0.100
Fig. 17.1: Docker UCP - Tela de Login
Em seguida clique na opção Skip for now> para acessar o painel do Docker UCP sem
licença.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
308 17. EXTRA: DOCKER SECURITY
Fig. 17.2: Docker UCP - Tela de Login
Para adquirir uma licença do Docker UCP, entre em contato com a empresa Mirantis através
do formulário de contato presente no site.
Clique em admin e em Admin Settings e ao lado esquerdo da tela em Certificates:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
309 17. EXTRA: DOCKER SECURITY
Fig. 17.3: UCP - Certificados
Para enviar sua chave de certificado, clique no link Upload Key:
Fig. 17.4: UCP - Upload Key
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
310 17. EXTRA: DOCKER SECURITY
Através do link Private Upload Key em Private Key, é possível enviar um arquivo com
chave privada TLS. Verifique se ele não está criptografado com uma senha. Chaves
criptografadas devem ter o termo ENCRYPTED na primeira linha.
Para enviar seu certificado de servidor, clique no link Upload Certicate:
Fig. 17.5: UCP - Upload Certicate
Através do link Upload Certificate em Server Certificate, é possível enviar um arquivo
com certificado TLS para seu domínio e qualquer certificado público intermediário.
Para enviar seu certificado CA, clique no link Upload CA Certicate:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
311 17. EXTRA: DOCKER SECURITY
Fig. 17.6: UCP - Upload CA Certificate
Através do link Upload CA Certificate em CA Certificate, é possível enviar um arquivo
com certificado público da CA.
Client Bundle
Um pacote de cliente (Client Bundle) contém um par de chaves privada e pública que autoriza
suas solicitações no UCP. Ele também contém scripts de utilitário, que podem ser utilizadas
para configurar as ferramentas do cliente do Docker e do kubectl, para conversar com a
implantação do UCP;
Os pacotes de cliente fornecem acesso UCP, por meio da CLI do Docker e do kubectl, usando
a autenticação mútua TLS (mTLS).
LAB 14.3 – Criar pacote para clientes no Docker UCP
Neste laboratório vamos aprender como permitir que uma máquina cliente externa tenha acesso
ao Docker UCP através de um pacote.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
312 17. EXTRA: DOCKER SECURITY
Gerar pacote via download no painel
Acesse no navegador web do seu computador, o IP da máquina virtual Manager na porta
443. Logue com o usuário admin e informe sua senha:
• Acesso: https://172.16.0.100
Fig. 17.7: UCP - Tela de Login
Em seguida clique na opção Skip for now> para acessar o painel do Docker UCP sem
licença.
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
313 17. EXTRA: DOCKER SECURITY
Fig. 17.8: Docker UCP - Tela de Login
Clique em admin My Profile:
Fig. 17.9: UCP - My Profile
Clique em Client Bundles:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
314 17. EXTRA: DOCKER SECURITY
Fig. 17.10: UCP - Novo Client Bundle
Client em New Client Bundle Generate Client Bundle:
Fig. 17.11: UCP - Gerando o Client Bundle
O download do arquivo Client Bundle, será iniciado e deve ser enviado ao cliente.
Gerar pacote via download no terminal
Acesse a máquina virtual Registry, através do vagrant ssh e alterne para a conta do usuário
suporte.
Em seguida instale os pacotes necessários
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
315 17. EXTRA: DOCKER SECURITY
1 sudo apt install curl jq unzip elinks -y
Crie e acesse o diretório client onde vamos armazenar os arquivos do pacote:
1 mkdir client ; cd client
Armazene em uma variável o nome do usuário e uma senha válida no Docker UCP:
1 AUTHTOKEN=$(curl -sk -d ’{"username":"analista","password":"4LinuxCursoDocker"}’
https://172.16.0.100/auth/login | jq -r .auth_token)
Para baixar o pacote do Client Bundle, utilize o comando curl com as credenciais contidas na
variável AUTHTOKEN:
1 curl -sk -H "Authorization: Bearer $AUTHTOKEN" https://172.16.0.100/api/
clientbundle -o bundle.zip
Descompacte o arquivo do Client Bundle e execute o script env.sh:
1 unzip bundle.zip
2 eval "$(<env.sh)"
Verifique se a máquina virtual Registry está utilizando o ambiente do Docker UCP:
1 docker version --format ’{{.Server.Version}}’
Resultado do comando:
1 ucp/3.1.13
Execute um service no ambiente do Docker UCP:
1 docker service create --name webserver-cliente --publish target=80,published=80
nginx
Resultado do comando:
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
316 17. EXTRA: DOCKER SECURITY
1 7s6w3a6nyz4ozl7okzu25c96d
2 overall progress: 1 out of 1 tasks
3 1/1: running [==================================================>]
4 verify: Service converged
Logue no painel do Docker UCP com o usuário analista para confirmar se o serviço foi criado
pelo cliente:
Fig. 17.12: UCP - Tela de Login
Para lista os serviços clique no menu Swarm Services:
Fig. 17.13: UCP - Swarm Services
E
rik H
enrique P
inheiro / erikpinheiro@
gm
ail.com
317 17. EXTRA: DOCKER SECURITY
Retorne à máquina virtual Registry e remova o serviço webserver-cliente:
1 docker service rm webserver-cliente

Mais conteúdos dessa disciplina