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.

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 Ubuntu curl -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 gerais apt 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/