É, de forma resumida, uma instância de uma imagem executando como processo.
- É possível ter inúmeros contâiners executando a partir da mesma imagem;
- Containers são somente processos executando na máquina host, limitados aos recursos que podem acessar, acabam quando o processo para.
- Possui uma segregação de processos no mesmo Kernel (isolamento);
- A partir de um processo, permite criar subprocessos isolados da máquina host;
- Possui um sistema de arquivos criados a partir de uma imagem docker;
- Ambientes leves e portáteis no qual aplicações são executadas;
- Encapsula todos os binários e bibliotecas necessárias para execução de uma aplicação;
- Também é chamado como algo entre chroot e uma VM;
- chroot é uma forma de direcionar uma nova pasta raiz para um determinado processo, uma forma primitiva de "aprisionar" o processo à este escopo de arquivos/pastas;
- VM nível de isolamento máximo, novo O.S, binários, arquivos, kernel, libs, etc.
docker container run hello-world
Irá baixar esta imagem do Docker Hub e irá imprimir uma mensagem de "Hello World" no log do container.
- O docker procura pela imagem localmente no computador em um repositório chamado de "image cache".
- Se não encontrar, busca no repositório remoto (por padrão é o Docker Hub)
- Busca a última versão da imagem (padrão quando não é especificado versão. Ex
nginx:latest
) - Cria um novo container baseado na imagem e prepara para inicializar
- Atribui um IP virtual na rede privada do docker engine
- Quando específicado uma publicação (
--publish PORT:PORT
) expoe a porta na máquina host e direciona todo tráfego para a porta de dentro do container. - Inicializa o container usando o comando
CMD
no Dockerfile da imagem.
docker container run --publish 5000:80 nginx
- Baixa a última versão da imagem do
nginx
do Docker Hub - Cria um container com esta imagem em um novo processo.
- A flag
--publish PORTA_HOST:PORTA_CONTAINER
expõe a porta5000
do host e redireciona todo seu tráfego para a porta80
do container, direcionando todo tráfego do localhost para o container. Pode ser utilizada a abreviação-p
Um erro irá ser percebido caso a porta do host já esteja sendo utilizada por outro processo ou até mesmo outro container.
docker container run -p 80:80 --detach nginx
A flag --detach
permite a execução do container em background, liberando a linha de comando. Pode ser utilizada a abreviação -d
docker container start/stop/restart CONTAINER_NAME
docker container start/stop/restart CONTAINER_ID
Observação É necessário somente os 3 primeiros dígitos do CONTAINER_ID
para ser único e docker conseguir identificar qual container está sendo referenciado.
Pode ser utilizado nos subcomandos de container
, image
, volume
e network
.
docker container ls
docker container ps
docker container list
- Por padrão lista somente containers rodando, com a flag
-a
lista histórico de containers criados. - Em adição a flag anterior se colocado
q
irá listar somente os ids dos containers.
docker container logs CONTAINER_NAME
- Pode ser utilizado a
-f
para seguir automaticamente o log, e-t
para exibir timestamp nas mensagens
docker container top CONTAINER_NAME
docker container run IMAGE
docker container start CONTAINER_ID
run
sempre cria um novo container.start
inicializa um container que já existe e que foi parado.
docker container run --publish 80:80 --detach --name CONTAINER_NAME nginx
Curiosidade: O nome de um container deve ser sempre único, e se não especifícarmos na criação, o docker cria automaticamente um nome aleatório para o container com base em uma lista open-source de nomes e sobrenomes de hackers e cientistas famosos.
docker run --name mysqldb -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run --name mysqldb -e MYSQL_RANDOM_ROOT_PASSWORD=yes -d mysql
-e
ou-env
pode ser utilizada para definir variáveis de ambientes para a imagem do container.
docker container rm CONTAINER_ID
docker container rm $(docker container ls -aq)
Dica: Na segunda linha do snippet acima, temos um agregado de comandos que facilitam a exclusão de containers, no caso em questão, um comando para listar todos os container ids criados e utiliza-los como argumentos na execução do comando de remover.
Observação: O docker não permite remover containers que estão ativos como medida de segurança, logo é preciso parar o container para posteriormente removê-lo. Entretanto, o comando docker container rm
permite a flag -f
ou --force
para forçar a remoção dos containers, o que permite remover containers que estão rodando.
Baixar imagem e inicializar container em modo interativo -it
, visualizando os processos através de ps aux
ou filtrando por uma saída específica ps aux | grep mongo
docker run -it --rm --privileged --pid=host justincormack/nsenter1
Listar os processos de um container específico:
docker container top CONTAINER_NAME
Inspecionar informações (metadados: startup, config, volumes, networking, etc) de um container específico:
docker container inspect CONTAINER_NAME
Obter estatísticas de performance de todos os containers
docker container stats
Inicializar um novo container no modo interativo
docker container run -it IMAGE
Executar comandos adicionais em um container existente
docker container exec -it CONTAINER_ID bash
docker container run -it --name proxy nginx bash
Importante: No acima foi sobrescrito o comando inicial da imagem do nginx para executar o bash
para podermos listar os arquivos que estão dentro do container no modo interativo. Entretanto, ao sair do bash, o container exitou, Por quê? Isso ocorre devido ao ciclo de vida dos containers serem baseados no ciclo de vida do comando que o inicializa.
docker container run -it ubuntu
A imagem do ubuntu já tem por padrão no seu comando de inicialização o bash
, após exitar o container é exitado também. Vale ressaltar que, para inicializar este container novamente não é com a flag -it
, e sim com -ai
, exemplo: docker container start -ai ubuntu
Com este comando é possível executar um outro comando e inicializar um outro processo dentro de um container específico, e contráriando o run
não afeta o processo root/ciclo de vida do container.
Exemplo:
docker container exec -it CONTAINER_NAME bash
Para os containers criados via docker run, é possível utilizar este comando para atualizar propriedades de limites de recursos utilizados pelo container, como memória, processamento, etc, sem necessáriamente reiniciaro container.
É possível consultar todas as propriedades disponíveis através do comando docker container update --help
- É suportado no Dockerfile, Compose YAML, docker run, e Swarm Services.
- Docker engine irá executar através do
exec
o comando especificado no container alvo (Ex:curl localhost
)- A engine aguarda pelas seguintes respostas
exit 0
(OK) ouexit 1
(Error)
- A engine aguarda pelas seguintes respostas
- Existe somente 3 tipos de estados de container: starting, healthy e unhealthy.
- Os healthchecks em services, são executados em um intervalo de 30 segundos.
- O status do healthcheck aparece no comando
docker container ls
- Os ultimos 5 healthchecks aparecem no
docker container inspect
- O docker run considera somente o primeiro de healthcheck na inicialização
- Swarm Services irão substituir as tasks caso o healthcheck falhe, tentando novamente provavelmente em um novo host, dependendo do scheduler.
- Swarm Service updates aguardam os healthchecks antes de proceder.
Um exemplo de uso deste comando via docker run pode ser visto em samples/healthcheck-elasticsearch
É uma imagem muito pequena do linux (4MB, a do ubuntu é 84MB) bastante utilizada em imagens do Docker.
Nela não temos o bash
mas possui sh
e através dele é possível instalar o bash
utilizando o comando apk
que é o package manager desta distribuição.
Exemplo:
docker container run -it alpine sh
Subir 03 containers em modo detached conforme instruções abaixo:
- nginx na porta 80:80
- mysql 3306:3306
- httpd 8080:80
Ao criar o container do mysql deve ser usado deve ser definido a variável de ambiente MYSQL_RANDOM_ROOT_PASSOWORD com o valor yes
Usar o docker container logs
no container do mysql para achar a senha aleatória que foi gerada na inicialização do mysql
Lembrando: -d
é --detach
, -p
é --publish
, -e
é --env
docker container run -d --name db -p 3306:3306 -e MYSQL_RANDOM_ROOT_PASSWORD=yes mysql
docker container run -d --name webserver -p 8080:80 httpd
docker container run -d --name proxy -p 80:80 nginx