- Docker é uma plataforma Open Source escrito em Go, que é uma linguagem de programação de alto desempenho desenvolvida dentro do Google, que facilita a criação e administração de ambientes isolados.
- O Docker possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um container, e a partir desse momento o ambiente inteiro torna-se portável para qualquer outro Host que contenha o Docker instalado.
- Isso reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente é sempre o mesmo, configure-o uma vez e replique-o quantas vezes quiser.
- Outra facilidade do Docker é poder criar suas imagens (containers prontos para deploy) a partir de arquivos de definição chamados Dockerfiles.
- Não podemos nos esquecer também de que o Docker utiliza como backend default o LXC, com isso é possível definir limitações de recursos por container (memória, cpu, I/O, etc.).
- Veja a versão do seu kernel, já que o Docker só funciona em kernels acima de 3.8
$ uname -r
- Com o kernel > 3.8, instale o docker
$ curl -fsSL https://get.docker.com/ | sh
- Finalizado o download, confira a versão usando:
$ docker --version
- Para visualizar os containers ativos (em execução) use:
$ docker ps
Obs.: Para usar o docker sem
sudo
use o comando abaixo, após isso deslogue e logue novamente (explicação)
$ sudo usermod -aG docker $USER
- Start o primeirio container
$ docker run hello-world
Obs.: Sempre que uma imagem não estiver no seu pc o Docker irá fazer o download no DockerHub
- Para saber quais imagens você já fez download use:
$ docker images
- Para visualizar todos os containers da sua máquina use:
$ docker ps -a
- Startando o primeiro container, real
$ docker run -ti ubuntu /bin/bash
Obs.:
-ti
indica terminal interativo,ubuntu
é a imagem a ser utilizada e/bin/bash
é o comando a ser utilizado; Obs2.: Utilizando o-d
o container rodará em background; Obs3.: Com--name
você pode dar um nome ao seu container; Obs4.: É possível especificar a versão da imagem a ser utilizada:
$ docker run -ti ubuntu:16.04 /bin/bash
- Para sair do container e finalizar o processo use
Ctrl+D
; - Para sair do container sem finalizar o processo use
Ctrl+P+Q
; - Para voltar para o container ativo pegue o
CONTAINER ID
usando:
$ docker ps
- E utilize no lugar do
CONTAINER_ID/NAMES
o id ou o nome abaixo:
$ docker attach CONTAINER_ID/NAMES
- Para criar um container sem deixá-lo ativo:
$ docker create --name new_cont ubuntu
- Para parar um container em execução sem entrar nele, use:
$ docker stop CONTAINER_ID
- Se arrependeu de parar um container? Ou quer entrar num container inativo? Use:
$ docker start CONTAINER_ID
- Para pausar um container:
$ docker pause CONTAINER_ID
- Para despausar um container:
$ docker unpause CONTAINER_ID
- Para saber quanto seu container esta consumindo:
$ docker stats CONTAINER_ID
- Para saber como os processos estão consumindo os recursos do seu container:
$ docker top CONTAINER_ID
Retorna os processos dentro do container
- Para ver os logs do container:
$ docker logs CONTAINER_ID
- Para remover um container:
$ docker rm CONTAINER_ID
$ docker rm -f CONTAINER_ID
Use
-f
para remover forçadamente containers que estão em execução. Para containers parados, basta usar o primeiro comando. As imagens continuam intactas.
- Para remover uma imagem:
$ docker rmi IMAGEM_ID
É possível utilizar o
-f
para forçar uma remoção.
- Se é um container é criado sem especificações ele ficará limitado ao uso total da máquina (host), podendo comprometer outros containers;
- Com docker inspect você consegue visualizar detalhes do seu container em execução;
$ docker inspect CONTAINER_ID
- Para saber o máximo de memória que seu container pode utilizar (0 indica sem limite):
$ docker inspect CONTAINER_ID | grep -i mem
- Para limitar a memória a ser utilizada:
$ docker run -ti --memory 512m --name novo ubuntu
ou
-m
- Para limitar a memória do container em execução:
$ docker update -m 256m CONTAINER_ID
Em vez de
CONTAINER_ID
pode usar oname
- Para limitar o uso de CPU do meu container:
$ docker run -ti --cpu-shares 1024 --name container1 ubuntu
Para verificar se foi atribuido corretamente:
$ docker inspect container1 | grep -i cpu
- Para limitar o uso de CPU de um container em execução:
$ docker update --cpu-shares 512 container1
- Volumes são compartilhamentos entre o container e o host
$ docker run -ti -v /volume ubuntu /bin/bash
- Quando não espeficificado a pasta do volume, use
inspect
para detectar a pasta
$ docker inspect CONTAINER_NAME_OR_ID -f {{.Mounts}}
- Para criar um container com volume mapeado:
$ docker run -ti -v /path/to/my/host/volume:/volume ubuntu
- Container data-only possui apenas volumes para compartilhar com outros containers
$ docker create -v /data --name dbdados ubuntu
- Para criar um container que importe os volumes de outro container (dbdados), use
--volumes-from
:
$ docker run -d -p 5433:5432 --name pgsql1 --volumes-from dbdados -e POSTGRESQL_USER=docker -e POSTGRESQL_PASS=docker -e POSTGRESQL_DB=docker kamui/postgresql
Obs.:
-e
passa uma variable de ambiente para o container;-p
conecta a porta do hosta com uma porta do container.
- Parecido com Makefiles, então são arquivos com instruções para construir a sua imagem do docker.
FROM
é a primeira linha obrigatoriamente porque indica a imagem que está sendo usada para buildar a sua imagem;MAINTAINER
indica a pessoa que escrever o Dockerfile;ADD
joga um arquivo da pasta host onde está o Dockerfile para o container;CMD
são os parâmetros para oENTRYPOINT
;
Se o
ENTRYPOINT
não for passado ele se torna o bash, sendo o array doCMD
relacionado ao bash.
- Em
LABEL
se põe metadata, como versão, fabriacante, descrição, o que achar interessante (comentário); COPY
copia arquivos e diretórios do host para o container, não copía arquivos.tar
(Quem faz isso é oADD
);ENTRYPOINT
indica o principal processo dentro do container, se ele parar o container cai também;ENV
determina variáveis de ambiente para o container;EXPOSE
mostra a porta do container disponível;RUN
é utilizado para rodar comandos, muito ultilizado para instalação de pacotes (Quanto menosRUN
menos camadas no container, para diminuir a quantidade de comandos tente concatenar com o&&
);USER
indica o usário default, que se não for dado será oroot
;WORKDIR
indica o diretório de trabalho que se entra assim que o container for aberto;VOLUME
indica a pasta que será compartilhada com o container.
- Para construir um container a partir de um Dockerfile, o primeiro comando se estiver na pasta do
Dockerfile
ou passar o caminho para a pasta onde está oDockerfile
:
$ docker build .
$ docker build /path/para/o/dir/onde/esta/o/dockerfile/
- Para tagear uma imagem:
$ docker build -t image_name:1.0 .
.
no final se estiver rodando da pasta onde está oDockerfile
- Para confirmar:
$ docker images
- Para criar o container a partir da imagem criada:
$ docker run -ti image_name:1.0
- Para ver as camadas do container:
$ docker history image_name:1.0
- Para renomear uma imagem:
$ docker tag IMAGE_ID new_name:1.0
- Fazer login no Dockerhub
$ docker login
- Subir uma imagem local para o seu Dockerhub
$ docker push new_name:1.0
- Para confirmar e saber quais îmagens você possui em seu repositório:
$ docker search user_name
- Para fazer pull de uma imagem:
$ docker pull user_name/image_name
- Para utilizar a imagem do pull anterior:
$ docker run -ti user_name/image_name
- Um distribution local
$ docker run -d -p 5000:5000 --restart=always --name new_name image_name
-d
para rodar como um daemon;-p
linkar a porta do docker host com a do container;--restart
caso o container morra, assim que o docker voltar o container sobe;--name
dar nome ao container
- Para confirmar:
$ docker ps
$ docker images | grep new_name
- Passando um servidor de DNS para responder suas requisições
$ docker run -ti --dns 8.8.8.8 debian
$ cat /etc/resolv.conf
- Dar hostname ao docker
$ docker run -ti --hostname catota debian
$ cat /etc/hostname
- Como linkar um container a outro
$ docker run -ti --name container1 debian
$ docker run -ti --link container1 --name container2 debian
$ ping container1
$ cat /etc/resolv.conf
$ cat /etc/hosts
- Como expor a porta do container
$ docker run -ti --expose 80 debian
- Linkar IP do host com o IP do container
$ docker run -ti --publish 8080:80 debian
$ iptables -t nat -L -n
Mostra o redirect da 8080 para a porta 80 do docker que pode estar rodando o apache por exemplo.
- Passando um
mac adress
específico para o container
$ docker run -ti --mac-adress 12:34:de:b0:6b:61 debian
$ ip addr
- Mudando o conjunto de network (IP e outras infos de rede) do container para o host
$ docker run -ti --net=host debian