Sunteți pe pagina 1din 15

Apostila Complementar Disciplina

Tópicos Avançados - Docker


Prof. Esp. Alex Sandro Silva

Tópicos abordados durante as aulas

0 - Antes de começar…
Configurações de rede e conectividade com a internet
Verifica o endereço IP da máquina
$ ifconfig

Configura um endereço Ip e uma máscara de subrede para estação


Obs.: Considerar as classes de IP da sua rede
$ sudo ifconfig enp0s3 192.168.0.254 netmask 255.255.255.0

Define um gateway para estação


Obs.: Considerar as classes de IP da sua rede
$ sudo route add default gw 192.168.0.1

Configurar o DNS
Essa configuração é diferente pro Ubuntu Server
$ sudo nano /etc/resolvconf/resolv.conf.d/head
$ sudo resolvconf -u
$ cat /etc/resolv.conf

Testes de conectividade
$ ping google.com
$ ping 8.8.8.8
$ nslookup

Atualizar a base de dados de pacotes do sistema operacional através do gerenciador de


pacotes
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

1 - O que são Dockers e Containers?


Docker é uma plataforma aberta para o desenvolvimento, transporte e execução de
aplicativos e serviços. Projetado para oferecer seus aplicativos de forma rápida.
Com Docker você pode separar suas aplicações a partir de sua infra-estrutura e tratar a sua
infra- estrutura como um aplicativo gerenciado. Ajuda você a enviar código mais rápido,
fazer testes mais rápidos, deploys mais rápidos, e encurtar o ciclo entre o código escrito e
código de execução.
Quando estamos falando de docker, temos que imaginar as coisas um pouco diferentes do
que estamos acostumados, quando se comparado a virtualização. Não temos mais um linux
com nginx por exemplo, a partir de agora temos apenas o nginx.
Muito legal né? Mas o docker não foi o grande inventor disso tudo. O docker tem em suas
origens o LXC (LinuxContainers).

2 - LXC
LXC (LinuX Containers) é um tipo de virtualização em nível de sistema operacional que
proporciona a execução de vários sistemas Linux de forma isolada (containers) em um
único host de controle. Em outras palavras é uma alternativa para virtualização completa e
muito leve se comparada aos hypervisors KVM, Xen e Vmware.
O Kernel Linux possui o recurso Cgroups que é utilizado para limitar e isolar o uso de (CPU,
memória, disco, rede, etc) e também o isolamento de namespace que basicamente separa
grupos de processos de modo que eles não enxerguem os recursos de outros grupos, ou
seja:
3 - Namespaces
Namespaces foi adicionado no kernel Linux na versão 2.6.24 e é ele que permite o
isolamento de processos quando estamos utilizando o Docker.
Ele é o responsável por fazer com que cada container possua seu próprio environment, ou
seja, cada container terá a sua árvore de processos, interface de rede, pontos de
montagens, etc... Fazendo com que um container não interfira na execução de outro.
Vamos saber um pouco mais sobre alguns namespaces utilizados pelo Docker:

Namespace Constant Isolates

IPC CLONE_NEWIPC System V IPC, POSIX message

Network CLONE_NEWNET Network devices, stacks, ports,

Mount CLONE_NEWNS Mount points

PID CLONE_NEWPID Process IDs

User CLONE_NEWUSE User and group IDs

UTS CLONE_NEWUTS Hostname and NIS domain name


3.1 - O namespace “PID”
O PID namespace permite com que cada container tenha seus próprios identificadores de
processos, isso faz com que o container tenha um PID para um processo em execução e
quando você procurar por esse processo na máquina host o encontrará, porém com outra
identificação, ou seja, com outro PID. No container:

3.2 - O namespace “Network”


O net namespace permite com que cada container possua sua interface de rede e portas.
Para que seja possível a comunicação entre os containers, é necessário criar dois
diferentes Net Namespaces. Um responsável pela interface do containers onde
normalmente utilizamos o mesmo nome das interfaces convencionais do Linux, como por
exemplo a eth0, e a outra responsável por uma interface do host, normalmente chamada de
veth* (veth + um identificador aleatório). Essas duas interfaces estão linkadas através da
bridge Docker0 no host, que permite a comunicação entre os containers através de
roteamento de pacotes.

4 - História
Solomon Hykes iniciou o desenvolvimento do docker em um projeto interno na dotCloud, um
provider de PAAS (Plataform as a service), com contribuições iniciais por outros
engenheiros da dotCloud incluindo Andrea Luzzardi e François-Xavier Bourlet. Jeff Lindsay
também se envolveu como um colaborador independente. Docker representa uma evolução
da tecnologia proprietária dotCloud, que é em si construída em projetos open-source
anteriores, como pequenas nuvens. Docker foi lançado como código aberto em março de
2013.

5 - Quem usa Docker?


Groupon, Paypal, ebay, NewRelic, Spotfy, Uber e etc. Vamos falar sobre um caso de
sucesso.

Spotfy
Spotify é um serviço sueco de streaming de música comercial, podcast, vídeo e que fornece
os direitos digitais conteúdo de gravadoras e empresas de mídia, incluindo a BBC, Sony,
EMI, Warner Music Group e Universal com restrição de gestão.

Desafio
Spotify tem dezenas de milhões de usuários, de modo que o seu apoio back-end precisa
apoiar escala e crescimento de sua base de usuários. Usando uma abordagem micro
serviços. A empresa tem 100 ou mais serviços de back-end distintos, Auth, streaming e
reprodução de música. Gerir todas estes serviços, gera um grande workload. Na verdade,
eles tinham cerca de 300 servidores diferentes para cada engenheiro. Eles precisavam
tornar mais fácil em sua área Ops teams.Uma em particular tornou-se um importante
exemplo, implantação. Antes do Docker, o dev, teste e processo de produção era
extremamente difícil. Para complicar as coisas, eles também sofreram um número frequente
de falhas de implantação.

Solução
Repetibilidade foi um enorme razão pela qual Spotify optou por utilizar Docker. Com Docker
eles podem construir uma imagem, testar essa imagem e, em seguida, usar a mesma
imagem em produção. Agora, a empresa pode garantir que todos os seus serviços
permanecem em funcionamento, proporcionando uma boa experiência para o usuário. Eles
também construíram uma nova plataforma chamada Helios baseado em Docker para
implantar e orquestrar seus servidores.

6 - Docker X Virtualização
É possível visualizar no diagrama abaixo como a questão do físico passa para a máquina
virtual e como a máquina virtual para para os containers.
7 - Instalação
Para realizar a instalação do Docker em máquinas Linux é bastante simples, precisamos
somente observar alguns pontos:
● O Docker não suporta processadores 32bits;
● O Docker é suportado somente nas versões do Kernel 3.8 ou superior;
● O kernel deve ter suporte aos sistemas de arquivos utilizados pelo Docker como o
AUFS, DeviceMapper, OverlayFS, etc…
● O kernel deverá ter suporte a cgroups e namespaces, o que normalmente já vem por
default habilitado na maioria das distros;

7.1 - Instalando e habilitando para iniciar com o sistema


# wget -qO- https://get.docker.com | sh
# systemctl status docker
# systemctl start docker
# systemctl enable docker
# docker run hello-world
Obs.: Para rodar o docker com outros usuários, será necessário adicionar o usuário ao
grupo do docker, conforme o comando abaixo:
# usermod -aG docker $usuario
É importante ressaltar também, que o docker pode ser instalado utilizando o apt-get e/ou o
yum, das distros que utilizam esses sistemas de instalações, no entanto, não será utilizada
a última versão disponível do docker, até mesmo por conta de um padrão utilizada das
distros.

8 - Iniciando os trabalhos
Após o processo de instalação ter ocorrido, precisamos iniciar os trabalhos no ambiente
com o docker instalado, na realidade, se faz necessário um planejamento, até mesmo por
sabermos que o ambiente precisa de continuidade, então planejar se faz estritamente
necessário.

8.1 - Comandos importantes


Verificando a versão do docker
docker --version

Listando containers em execução


docker ps

Listando todos os containers, mesmo os que não estão em execução


docker ps -a
Identificação dos campos
Campo Descrição

CONTAINER ID Identificação única do container

IMAGE Qual imagem de origem

COMMAND Comando em execução

CREATED Quando foi criado

STATUS Estado atual

PORTS Qual porta exposta

NAMES Nome do Container

Busca um container específico no repositório de containers oficial Docker Hub


$ docker search nome-container-ou-servico
Uma vez que se utiliza o comando acima, ele vai fazer uma pesquisa no dockerhub, e o que
é dockerhub ?
DockerHub (https://hub.docker.com/) é uma espécie de “GitHub” do Docker. Nele você pode
criar uma conta e armazenar suas imagens do Docker, assim como utilizar-se das imagens
de outros usuários. É importante mencionar que, no DockerHub, é possível ter imagens
oficiais e/ou não.
Por exemplo, a equipe dos desenvolvedores do Debian, criaram uma imagem padrão do
Debian e disponibilizaram no DockerHub de forma oficial, ou seja, os próprios
desenvolvedores do Debian fizeram isso e, dessa forma, a confiança, diga-se de passagem,
é muito maior do que pegar uma imagem não oficial.
Identificação dos campos
Campo Descrição

NAME Nome da imagem

DESCRIPTION Descrição da imagem


STARS Reputação

OFFICIAL Se é oficial dos desenvolvedores,


por exemplo das Distros

AUTOMATED Não oficial, enviado por qualquer


desenvolvedor

Após achar a imagem desejada, vamos ao processo de fazer a instalação de um container


ou, até mesmo, apenas fazer download da imagem desejada.
Instalando um container com base na imagem do Debian, oficial, que foi pesquisada com o
comando ​docker search debian​, por exemplo.
Criando um container simples
$ docker run -ti debian:latest
Nesse momento, o processo de download da imagem acontece de forma automática, sendo
que a imagem fica armazenada no /var/lib/docker nos diretórios específicos e o container
começa a ser criado.
Opções
❏ -t ​Disponibiliza TTY para o container.
❏ -i ​Mantem o STDIN aberto mesmo que não conectado no container.
❏ -d​ Roda o container em modo daemon.

Modo “Interativo”
Existem algumas maneiras de criar e executar containers. Nos primeiros casos, vamos criar
containers utilizando imagens “prontas”, como debian, centos, mysql, postgresql e etc. Mas
quando precisamos criar imagens personalizadas, ou então, alterar alguma imagens
existente, é preciso iniciar o container com modo iterativo. (Não obrigado, porém, mais fácil).

Modo “Daemon”
Com o parâmetro “-d” conseguimos daemonizar o container, fazendo com que ele seja
executado como um processo. Quando temos um container que não será necessário
acessar por “shell”, por exemplo um container de Mysql, crie o container “daemonzizado”.
Quando o processo finalizar, já é possível identificar que o container está instalado e já
estamos dentro do container, para saber disso, vamos utilizar os comandos abaixo para que
possamos confirmar que estamos dentro do container.
hostname
ip a
cat /etc/debian_version
Uma vez dentro do container e verificando com os comandos acima que realmente estamos
dentro dele, precisamos sair e voltar para o servidor hospedeiro, para isso, podemos utilizar
os seguintes comandos:
ctrl+d, exit ou logout
Problemas ? Sim né ? Ao sairmos do container, utilizando os comandos acima, o container
será desligado ! Porque ? Por estar rodando apenas o interpretador de comandos /bin/bash.
É possível ver com os comandos abaixo:
$ docker ps
Mas ao digitarmos o comando abaixo, é possível perceber que o container está criado e
apenas está desligado por não ter nenhum interpretador de comandos rodando.
$ docker ps -a
Dessa maneira, precisamos saber como sair do container sem desligar ele, deixando ele
funcionando e em possível produção.
Para sair do container sem que ele desligue, a forma correta seria:
ctrl+pq
Dessa forma, o container fica rodando e podemos fazer os devidos acessos, quer seja pela
rede ou acessando o container diretamente.

8.2. Gerenciando os containers


Uma vez o container ou os containers rodando, podemos obter informações sobre eles, por
exemplo, podemos saber como está o status do container ou dos containers, desligar um
container, ligar um container, entrar e sair do container e assim por diante.

Obtendo o status dos containers


docker stat id
docker stst
Os comandos acima, podem ser utilizados para verificarmos apenas o status de um
container ou de todos eles.
Informações do tipo, ID do Container, Percentual de CPU, Memória utilizada, Memória Total,
Percentual de memória, I/O de Network e PIDS.

Verificando se existem imagens que já baixadas


docker images
É importante ressaltar que esse comando irá mostrar as imagens que estão no dicso do
hospedeiro.

Campo Descrição

REPOSITORY Nome da Imagem

TAG Qual a TAG/ Release da Imagem

IMAGE ID Identificação única da imageM

CREATED Quando foi criada

VIRTUAL SIZE Tamanho

As imagens ficam dentro do diretório /var/lib/docker.

Baixando Imagens
docker pull debian
Com esse comando, apenas a imagem é baixada e não é criado nenhum container.

Parando e iniciando container


docker start
docker stop

Conectando em container
docker attach ID

Verificando os logs de um container


docker logs ID
docker logs –follow ID

Verificando se teve alteração dentro dos containers


docker diff ID

Copiando arquivos pro container


docker cp ID:/etc/hosts .
docker cp arquivo ID:/root

Verificando os processos
docker top ID

9 - Modo privilegiado e não privilegiado


O Docker por padrão roda em modo não privilegiado, o que quer dizer que o mesmo não
consegue manipular devices e/ou acessar certas partes do sistema. Por exemplo, sem
privilégios
docker run -ti –-name sem-privilegios debian mount -t tmpfs stuff /mnt
Agora, tente assim e veja a diferença
docker run -ti –-name com-privilegios –-privileged debian mount -t tmpfs stuff /mnt

10 - Gerenciando redes do container


Quando o Docker é executado, ele cria uma bridge virtual chamada docker0 para que possa
gerenciar a comunicação interna do container, entre o container e o host e também entre os
containers.
Vamos conhecer alguns parâmetros do comando "docker run" que irão nos ajudar em
relação a rede onde os containers irão se comunicar.

Campo Descrição

Dns indica o servidor DNS


hostname indica um hostname

link Cria um link entre os containers, sem a necessidade de se saber o ip um do


outro

Net Permite configurar qual o modo de rede que você usará com o
container. Temos 04 opções, porém a mais conhecida e utilizada é a "
net=host". Onde o container utilizará a rede do host para se comunicar
e não "containerizara" a rede do container

Expose Expõe a porta do container apenas

publish Expõe a porta do container e do host

defaultgateway Determina a rota padrão

macaddress Determina um mac address

11 - Trabalhando com imagens e Containers


Existem milhares de imagens prontas que você pode encontrar em https://hub.docker.com.
Existem as imagens oficiais e as não oficiais, que por exemplo, pode ser uma sua.
Posso criar minhas próprias imagens? Sim, vamos lá.
mkdir -p ~/Dockerfiles/apache
cd ~/Dockerfiles/apache
vim Dockerfile

# Qual imagem
FROM debian:latest
# Autor
MAINTAINER Prof. Esp. Alex Sandro Silva at alexhctp@gmail.com
# Update and install apache
RUN apt-get update -y && apt-get install -y apache2 && apt-get
clean

Campo Descrição

FROM Indica a imagem a servir como base

MAINTAINER Quem é o mantenedor desse Dockerfile/Imagem

RUN Lista de comandos que deseja executar na criação da imagem

Bem, por enquanto está bem básico, apenas indicando qual será a nossa imagem base,
nesse exemplo vamos utilizar o Debian. Também informamos quem é o autor da imagem e
por fim vamos instalar o Apache2 via apt-get. Agora vamos “buildar”.
docker build -t alexhctp/apache:1.0 .
Vamos criar um container a partir desta imagem que criamos.
docker run -ti alexhctp/apache:1.0 /bin/bash
docker attach $ID
ps aux
/etc/init.d/apache start
ps aux
Lindo, não?

Mais opções do dockerfile.


ADD: Copia novos arquivos, diretórios, arquivos TAR ou arquivos remotos e os adicionam
ao filesystem do container;
CMD: Executa um comando, diferente do RUN que executa o comando no momento em
que esta "buildando" a imagem, o CMD executa no início da execução do container;
LABEL:​ Adiciona metadados a imagem como versã o, descrição e fabricante;
COPY:​ Copia novos arquivos e diretórios e os adicionam ao filesystem do container;
ENTRYPOINT: Permite você configurar um container para rodar um executável, e quando
esse executável for finalizado, o container também será ;
ENV:​ Informa variáveis de ambiente ao container;
EXPOSE: ​Informa qual porta o container estará ouvindo;
FROM: Indica qual imagem será utilizada como base, ela precisa ser a primeira linha do
Dockerfile;
MAINTAINER:​ Autor da imagem;
RUN: Executa qualquer comando em uma nova camada no topo da imagem e "commita" as
alterações. Essas alterações você poderá utilizar nas próximas instruções de seu
Dockerfile;
USER:​ Determina qual o usuário será utilizado na imagem. Por default é o root;
VOLUME:​ Permite a criação de um ponto de montagem no container;
WORKDIR: ​Responsável por mudar do diretório / (raiz) para o especificado nele;

12 - Customizando uma imagem base


Vamos agora criar uma nova imagem, porém não vamos utilizar o Dockerfile. Vamos
executar um container com uma imagem base e realizar as modificações que desejarmos,
depois vamos salvar esse container como uma nova imagem!
Simples, rápido e fácil!
Bem, primeiro precisamos criar um container. Vamos dessa vez utilizar um container
Debian, somente para variar. :D
docker run -ti debian /bin/bash
apt-get update ; apt-get install apache2
docker commit -m “apache-seu-nome” containerID
docker tag ImagemID apache-seu-nome
docker run -ti apache-seu-nome /bin/bash
docker run -ti -p 8080:80 apache-seu-nome /bin/bash
13 - Subindo imagens pro docker hub
Crie uma conta em: https://hub.docker.com
docker login Digite seus dados
docker push apache-seu-nome
Atividade prática

1 - Liste todos os containers, mesmo o que não estão em execução:


docker ps -a

2 - Procure por um container no repositório e execute-o


docker search debian
docker run -ti debian:latest

3 - Saia do container em execução sem matá-lo, verifique todos os containers, mesmo os


parados e retorne para a interface do container logo em seguida
docker ps -a
docker attach bb73c3fee38d

4 - Mostre as estatisticas do container que está sendo executado


docker stats 34f3e5eca25b

docker top 34f3e5eca25b


docker images
docker stop 34f3e5eca25b
docker stats 34f3e5eca25b
docker ps -a
docker start 34f3e5eca25b
docker attach 34f3e5eca25b
docker ps -a
docker images
docker top 34f3e5eca25b
docker attach 34f3e5eca25b
docker ps -a
docker top 34f3e5eca25b
docker kill 2728
docker exec kill -9 2728
docker exec -it 34f3e5eca25b kill -9 2728
docker exec -it 34f3e5eca25b kill 2728
docker ps -a
docker exec -it 34f3e5eca25b kill 2728
docker attach 34f3e5eca25b
docker rm $(docker ps -qa)
docker stop 34f3e5eca25b
docker rm $(docker ps -qa)
docker images
docker rmi $(docker images -q)
docker images
docker search apache
docker run httpd
docker ps -a
docker run httpd
docker version
sudo halt

# Disponibilizando um serviço de Webserver sem um Dockerfile (processo manual)


# Para testar, basta acessar o IP do servidor seguido de :8080
docker run -dit --name meu-webserver-apache -p 8080:80 -v
"$PWD":/usr/local/apache2/htdocs/ httpd:2.4

# Subindo o nivel e iniciando um ambiente de desenvolvimento

# Disponibilizado um serviço de Webserver com um Dockerfile (processo automatizado)

S-ar putea să vă placă și