Docker

Tá todo mundo usando isso, será que é moda? Eu testei e realmente... o negócio ajuda muito a instalar e manter programas de servidor no Linux.

Minha visão de leigo sobre o Docker é que ele é uma máquina virtual sem ser uma máquina virtual. Ele te permite criar um ou vários ambientes virtuais isolados no seu computador chamado contêineres. E aí dentro do contêiner você pode instalar o que quiser, sem que isso entre em conflito com outros softwares no seu computador instalados fora do contêiner.

Mas você precisa ficar instalando coisas dentro do contêiner na mão? Não! As empresas que desenvolvem softwares já criam "imagens" prontas e atualizadas do Docker pra você baixar e sair usando. Essas imagens te dão a garantia de que nada vai entrar em conflito ou bugar.

Essas "imagens" prontas você acha no Docker Hub.

Por experiência pessoal, é muito mais fácil usar contêiners do Docker do que instalar manualmente um software no seu servidor Linux. Por que?

Você quer instalar uma versão atualizada de certo software e só existe uma super antiga no repositório da sua distribuição Linux. Aí você decide instalar manualmente mas as coisas não funcionam direito porque você precisa instalar também dependências. Você faz tudo seguindo o tutorial e mesmo assim não funciona...

Você quer rodar duas instâncias de um mesmo software no mesmo servidor. Isso é impossível/trabalhosíssimo de se fazer!

Vamos instalar o Docker então oras.

Essa figura sensacional explica muito bem como o Docker surgiu, e por quê ele é tão usado.

Fonte: artigo interessante no Medium https://harshityadav95.medium.com/

Como instalar o Docker?

Parece que todos os tutoriais são pra Linux x64, então leve isso em conta.

Em modo superusuário:

apt install lsb-release &&apt update &&apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common &&# Inicio dos comandos específicos por distribuição linux# Comandos para o Debian# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - &&# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" &&# Comandos para o Ubuntucurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" &&# Fim dos comandos específicos# Início dos comandos geraisapt update &&apt install docker-ce &&systemctl status docker

Criando um contêiner

Com esse comando você irá baixar uma imagem do conteiner,

docker run -d --hostname nome-do-pc-virtual --name nome-do-conteiner --restart unless-stopped -p 80:80 -p 123:123 conteiner_a_baixar:versao_do_software

Liberando o acesso de rede para o contêiner

Basta usar o comando -p porta_real_do_seu_pc:porta_virtual_do_docker

Por padrão o Docker impede todos os acessos de rede para dentro do contêiner recém criado. Isso é ruim (se você precisar se comunicar com seu contêiner pela rede).

O contêiner é uma caixinha fechada, ele tem suas própria rede e suas próprias portas, totalmente independentes do computador que o está servindo, isso permite que vários contêineres utilizem uma mesma porta, mas essa porta não estará acessível.

Para liberar acesso a porta você precisa fazer um port forwarding ou port mapping. Dentro do comando docker run você pode informar:

-p porta_real_do_seu_pc:porta_virtual_do_docker

Assim tudo que chegar na porta_real_do_pc será encaminhada para a porta_virtual_do_docker do respectivo contêiner docker.

Exemplo:

-p 1234:80

No seu pc normal, ao interagir com a porta 1234 você irá interagir com a porta 80 de dentro do conteiner.

Criando um contêiner com todas as portas já mapeadas aleatoriamente

Basta usar o comando -P

# Note para o -Pdocker run -d --hostname minha-maquina --name minha-maquina -P conteiner

Criando um contêiner com as portas padrão já mapeadas (sem usar NAT)

Basta usar o comando --network host

docker run -d --hostname meu-conteiner --name meu-conteiner --network host conteiner

Criando um contêiner em um arquivo visivel pelo computador

Basta usar o comando -v /pasta/fora/do/conteiner:/pasta/dentro/do/conteiner

docker run -d --name nginx --hostname nginx -v ~/nginxlogs:/var/log/nginx nginx

Entrando em um contêiner

docker exec -it id-do-conteiner /bin/bash

Acessando arquivos dentro de um conteiner

Copiando arquivo de dentro do conteiner para fora

# docker cp CONTAINER:FILEPATH LOCALFILEPATHdocker cp id-conteiner:/pasta-docker/arquivo /pasta-local/arquivo

Copiando arquivo de fora do conteiner para dentro

# docker cp LOCALFILEPATH CONTAINER:FILEPATHdocker cp /past-local/arquivo id-conteiner:/pasta-docker/arquivo

Alterando configurações de um contêiner depois dele ser criado

Isso é um hack, não é muito recomendado fazer isso, as vezes é melhor apagar o conteiner e criar ele novamente, mas aqui vai:

As configurações de um contêiner ficam guardadas na pasta
/var/lib/docker/containers/hash_do_conteiner/

Dentro desta pasta você pode alterar o mapeamento de portas (port forwarding) editando o arquivo hostconfig.json

Caso tenha feito alguma mudança, reinicie o serviço do docker com:

sudo systemctl restart docker

Mapeando logs de dentro do contêiner para o log do linux (journald)

--log-driver journald

Acessando os logs

sudo journalctl -f CONTAINER_NAME=nome_do_conteiner

Referências

Como instalar o Docker no Ubuntu 18.04 x64
https://www.digitalocean.com/community/tutorials/como-instalar-e-usar-o-docker-no-ubuntu-18-04-pt

Como instalar o Docker no Debian 9 x64
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-9

Compartilhando arquivos entre docker e host
https://www.digitalocean.com/community/tutorials/how-to-share-data-between-the-docker-container-and-the-host

Mudando portas em um contêiner já criado
https://stackoverflow.com/a/38783433

Gerenciando rede no Docker
https://runnable.com/docker/basic-docker-networking
https://docs.docker.com/v17.09/engine/userguide/networking/

Documentação Docker - Gerenciando Logs
https://docs.docker.com/config/containers/logging/

Documentação Docker - Pós instalação Linux
https://docs.docker.com/install/linux/linux-postinstall/

You should also read: