docker,  How-to,  XCP-ng

XCP-ng 8.0 + Debian 10 + 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

vim /etc/apt/apt.conf

Insira as linhas

Acquire::http::Proxy "http://<ip-do-proxy>:<porta>/";
Acquire::https::Proxy "http://<ip-do-proxy>:<porta>/";

Exporte o proxy no sistema com os comandos

export http_proxy=http://<ip-do-proxy>:<porta>/
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

mkdir /etc/systemd/system/docker.service.d

Crie o seguinte arquivo

vim /etc/systemd/system/docker.service.d/http-proxy.conf

Adicione o seguinte conteúdo

[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

Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com, endereço-que-vcquiser"

Reinicie o daemon para validar:

sudo systemctl daemon-reload

Verifique se a configuração foi carregada:

sudo systemctl show --property Environment docker

A saída esperada é algo como

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

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

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)

sudo usermod -aG docker info

Testando o docker

Para verificar se o docker está rodando na vm execute

docker --version

Será exibido algo como

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

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

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)

export PATH=$PATH:/usr/sbin
mount /dev/cdrom /mnt
bash /mnt/Linux/install.sh
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

xe vm-cd-eject vm=NOME_DA_VM

Instalando o xscontainer no XEN

No console do XCP-ng, instale o xscontainer

yum update -y

yum install xscontainer

liste as vms pra pegar o uuid da vm docker

xe vm-list

Copie o uuid da vm

Habilitando a VM docker no XEN

Habilitei a vm docker para gerenciamento de containers

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)

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

chmod +x /usr/local/bin/docker-compose

Verifique se foi instalado corretamente

docker-compose --version

Uma saída como esta deve ser exibida

docker-compose version 1.24.1, build 4667896b

Crie um diretório para o exemplo e acesse-o

mkdir /home/lamp && cd /home/lamp

Crie um diretório para armazernar o Dockerfile de criação do PHP

mkdir /home/lamp/php

Crie um diretório para usarmos como volume compartilhado entre o host e o container, nele guardaremos os arquivos php

mkdir /home/lamp/php/www

Crie também um diretório compartilhado para ser usado como volume de armazenamento dos arquivos do mysql

mkdir /home/lamp/mysql

Crie um arquivo yml

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

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

vim /home/lamp/php/Dockerfile

Conteúdo: As mesmar orientações valem para o Ctrl+c e o Ctrl+v deste conteúdo

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

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)

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

Grupo Telegram : https://t.me/xcpng

Compartilhe este conhecimento:

Graduado em TI pela FATEC, Pós Graduado em Segurança da Informação pela UNISUL, CISCO CCNA4, Gerente de TI, Atuo na área Governamental desde 2009

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *