XCP-ng 8.0 + Debian10 + Docker
===
Para efeitos de didática considerarei a VM Debian10 já instalada e com rede configurada em um servidor XCP-ng 8.0, tendo em vista que são procedimento bastante normais e com vasto material disponível.
Instalação do Docker
==
**Logue-se como root na VM Debian 10**
Proxy
=
Caso seu servidor esteja atrás de um proxy será necessário configurá-lo, do contrário, ignore esta etapa e vá direto para os Pacotes necessários
```javascript
vim /etc/apt/apt.conf
```
Insira as linhas
```javascript
Acquire::http::Proxy "http://<ip-do-proxy>:<porta>/";
Acquire::https::Proxy "http://<ip-do-proxy>:<porta>/";
```
Exporte o proxy no sistema com os comandos
```javascript
export http_proxy=http://<ip-do-proxy>:<porta>/
```
```javascript
export https_proxy=http://<ip-do-proxy>:<porta>/
```
Para que o docker consiga baixar as imagens configure as entradas de proxy da seguinte maneira
Crie o diretório
```javascript
mkdir /etc/systemd/system/docker.service.d
```
Crie o seguinte arquivo
```javascript
vim /etc/systemd/system/docker.service.d/http-proxy.conf
```
Adicione o seguinte conteúdo
```javascript
[Service]
Environment="HTTP_PROXY=http://<ip-do-proxy>:<porta>/"
Environment="HTTPS_PROXY=http://<ip-do-proxy>:<porta>/"
```
Se quiser que o docker não utilize proxy para determinado endereço interno acrescente uma linha com os endereços como no exemplo abaixo
```javascript
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com, endereço-que-vcquiser"
```
Reinicie o daemon para validar:
```javascript
sudo systemctl daemon-reload
```
Verifique se a configuração foi carregada:
```javascript
sudo systemctl show --property Environment docker
```
A saída esperada é algo como
```javascript
Environment=HTTP_PROXY=http://<ip-do-proxy>:<porta>/ HTTPS_PROXY=http://<ip-do-proxy>:<porta>/
```
Pacotes necessários
=
Atualizando e instalando os pacotes e dependências no Debian 10
```javascript
apt-get update && apt-get upgrade -y && apt-get install curl openssh-server nmap ncat sudo -y
```
Instalando o Docker
=
Instale o docker com o comando
```javascript
curl -fsSl https://get.docker.com/ | sh
```
Habilite o usuario comum do seu sistema para o grupo do docker, neste exemplo, o usuário **info** criado na instalação do Debian10 (utilize o sudo mesmo como root)
```javascript
sudo usermod -aG docker info
```
Testando o docker
=
Para verificar se o docker está rodando na vm execute
```javascript
docker --version
```
Será exibido algo como
```javascript
Docker version 19.03.2, build 6a30dfc
```
**Não nos aprofundaremos no tema docker por não ser o foco deste tutorial.**
Gerenciando pelo XCP-ng
==
Instalando o xen guest tootls (VMs Linux)
=
Pelo XOCE/XOA
```javascript
Home > VMs > Clicar no nome da VM > Aba Disks > No final da página aparecerá um menu tipo Drop Down (Select disks...), selecione "guest-tools.iso - XCP-ng Tools " para inserir a imagem no drive de CD da VM.
```
Pelo XCP-ng Center
```javascript
Selecionar a VM > Menu VM > Instalar XCP-ng Tootls
```
Estes processos acima correspondem a inserir um CD/DVD com as ferramentas na VM
No console da VM, monte e execute o script,
Vamos também exportar temporariamente o PATH /usr/sbin (PARA DEBIAN10)
```javascript
export PATH=$PATH:/usr/sbin
```
```javascript
mount /dev/cdrom /mnt
```
```javascript
bash /mnt/Linux/install.sh
```
```javascript
reboot (ou systemctl reboot)
```
Se tudo correu bem, na listagem de VMs do XOA/XOCE, na frente do nome da VM aparecerá o símbolo do Debian
PS: Após o reboot, não se esqueça de ejetar a imagem guest-tools.iso do drive de CD da VM
Via XCP-ng
```javascript
xe vm-cd-eject vm=NOME_DA_VM
```
Instalando o xscontainer no XEN
=
No console do XCP-ng, instale o xscontainer
```javascript
yum update -y
```
```javascript
yum install xscontainer
```
liste as vms pra pegar o uuid da vm docker
```javascript
xe vm-list
```
Copie o uuid da vm
Habilitando a VM docker no XEN
=
Habilitei a vm docker para gerenciamento de containers
```javascript
xscontainer-prepare-vm -v dae033fe-80fb-c4f5-f198-be2a603756b2 -u info
```
Consirede que para o comanda acima:
- dae033fe-80fb-c4f5-f198-be2a603756b2: UUID da VM
- info: Usuário da VM docker que habilitamos acima:
Responda yes em todas as perguntas para importar as chaves ssl e insira a senha do usuário info quando solicitado
Finalizando
=
Para validar a instalação e integração você **deve reiniciar** o seu servidor (host) XCP-ng, **se este servidor estiver em um pool comece reiniciando o MASTER e depois os outros hosts do pool**
Será abilitado no XCP-ng center, na aba geral da vm as informações do docker, e nas propriedades da vm será habilitado o container management.
No XOA/XOCE, na visualização da VM, será habilitada a aba Container
Os containers criados ficarão aninhados abaixo da vm docker.
Testando o docker
==
Vamos criar um ambiente LAMP dentro da VM docker para validar a instalação, **obviamente esta VM deve ter acesso à internet para baixar as imagens dos containers**
Docker-compose
=
O docker-compose é uma forma de se orquestrar seu ambiente, sendo isso possível utilizando um único arquivo yml para gerenciar vários componentes da sua solução.
Com ele é possível criar e gerenciar vários containers em um único arquivo facilitando a escabilidade da aplicação.
Resumidamente, ele "orquestra" seus containers
Instalando o docker-compose
=
Acesse **como root** a VM docker e baixe o docker-compose, aqui a versão 1.24.1 (altere a URL se quiser outra versão)
```javascript
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```
Ajuste as permissões
```javascript
chmod +x /usr/local/bin/docker-compose
```
Verifique se foi instalado corretamente
```javascript
docker-compose --version
```
Uma saída como esta deve ser exibida
```javascript
docker-compose version 1.24.1, build 4667896b
```
Crie um diretório para o exemplo e acesse-o
```javascript
mkdir /home/lamp && cd /home/lamp
```
Crie um diretório para armazernar o Dockerfile de criação do PHP
```javascript
mkdir /home/lamp/php
```
Crie um diretório para usarmos como volume compartilhado entre o host e o container, nele guardaremos os arquivos php
```javascript
mkdir /home/lamp/php/www
```
Crie também um diretório compartilhado para ser usado como volume de armazenamento dos arquivos do mysql
```javascript
mkdir /home/lamp/mysql
```
Crie um arquivo yml
```javascript
vim /home/lamp/docker-compose.yml
```
Utilize o seguinte conteúdo
**IMPORTANTÍSSIMO:** Respeite a concatenação deste arquivo, o aninhamento de cada linha é interpretado pelo docker-compose, portanto sugiro que, caso dê algum erro, digite manualmente linha por linha pois alguma quebra de linha ou caracter pode ter sido inserido durante o Crtl+c Ctrl+v. Altere **as senhas** e o nome do banco no arquivo para uma de seu conhecimento
```javascript=
php:
build: ./php
ports:
- "80:80"
- "443:443"
volumes:
- "/home/lamp/php/www:/var/www/html"
links:
- mysql
environment:
- MYSQL_USER=root
- MYSQL_PASS=senha123
mysql:
image: mysql:5.7
volumes:
- "./mysql:/var/lib/mysql"
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=senha123
- MYSQL_DATABASE=meubanco
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
links:
- mysql
ports:
- "8888:80"
environment:
- PMA_ARBITRARY=1
```
Traduzindo o arquivo yml
=
Neste arquivo estamos dizendo:
- Existem 3 seções neste projeto, 3 containers diferentes que irão interagir, o container chamado **php**, o container **mysql** e o container **phpmyadmin**
- o build (construtor) usará o arquivo Dockerfile dentro da pasta php local para construir o container php
- as portas 80 e 443 do host estarão direcionadas para as portas 80 e 443 do container php
- o diretório /home/lamp/php/www do host será montada como volume no diretório /var/www/html do container, portando compartilhada entre eles, qualquer arquivo ou diretório criado em um estará disponível para o outro, esta é uma forma de se colocar ou tirar arquivos de dentro de um container.
- o container php estará linkado, ou seja, conhece o container mysql
- foram passadas duas variáveis de ambiente php para conexão com o banco, que são o usuário e senha do root
- no container mysql será utilizada a versão 5.7 do banco
- a pasta mysql local será compartilhada como volume em /var/lib/mysql no container
- a porta 3306 do host será direcionada par a porta 3306 do container
- foram passadas as variaveis de ambiente PASSWORD e DATABASE para a criação do banco
- o container phpmyadmin usará a última versão disponível do programa (latest)
- o container phpmyadmin conhecerá o container mysql
- a porta **8888** do host será direcionada para a porta 80 do container phpmyadmin
- uma variável que informa ao PHPMyAdmin para exibir o endereço de conexão do seu servidor caso você queira conectar em vários servidores do MySQL a partir de uma única instalação do PHPMyAdmin.
Criando o arquivo Dockerfile
=
O Dockerfile é o arquivo responsavel pela criação do container, nele serão inseridas as informações que serão utilizadas durante a instalação de pacotes dentre outras, já que não é possível iteragir com o container durante sua criação. Por exemplo, durante a instalação do php normalmente são solicitadas algumas informações e ou confirmações, no caso do docker isso é passado ao instalador pelo Dockerfile
Importante: Tanto o Dockerfile quanto o docker-compose.yml devem manter **EXATAMENTE este nome**, **Dockerfile** com D maiúsculo e **docker-compose.yml** tudo minusculo.
Crie o arquivo Dockerfile
=
```javascript
vim /home/lamp/php/Dockerfile
```
Conteúdo: As mesmar orientações valem para o Ctrl+c e o Ctrl+v deste conteúdo
```javascript=
FROM php:7.2-apache
RUN apt-get update
RUN apt-get install -y apt-utils vim curl
RUN docker-php-ext-install mysqli pdo_mysql
RUN a2enmod rewrite
```
Traduzindo o arquivo Dockerfile
=
- Será utilizada a versão 7.2 do php com apache
- Executará uma série de comandos de instalação de pacutes
- Instalará algumas dependências necessárias
- Habilitará o módulo rewrite do apache
Subindo os containers
=
Estando no diretório /home/lamp execute
```javascript
docker-compose -f "docker-compose.yml" up -d --build
```
O docker buscará no docker-hub as imagens indicadas no arquivo e subira automaticamente os containers
Descendo os containers (desligando)
```javascript
docker-compose -f "docker-compose.yml" down
```
Conclusão
=
- Acessando o ip do host na porta 80 você será direcionado para o site dentro do apache do container (www)
- Para colocar arquivos na pasta www do container basta colocá-los na pasta /home/lamp/php/www
- Acessando o ip do host na porta **8888** você será direcionado para o container phpmyadmin
- Para acessar o phpmyadmin, no campo servidor, coloque o nome do container que contém o banco de dados, no caso, **mysql**
- Utilize o usuário root e a senha informada no arquivo .yml
**Enjoy**
by @pedrosa2004
Grupo Telegram : [https://t.me/xcpng](https://t.me/xcpng)