Como criar uma pilha de lâmpadas à base de docker usando o Docker no Ubuntu 20.04

Como criar uma pilha de lâmpadas à base de docker usando o Docker no Ubuntu 20.04

A pilha da lâmpada

Lâmpada é a pilha de software na qual provavelmente a maioria dos sites é executada. Linux representa a base da pilha, e a implementação tradicional inclui o Apache como servidor da web, o banco de dados MySQL e o PHP como a linguagem de programação do lado do servidor. No entanto, existem muitas variações possíveis: o mariadb, por exemplo, é frequentemente usado no lugar do MySQL, do qual é um garfo e outras linguagens de programação, pois Python ou Perl podem ser usados ​​em vez de PHP. Neste artigo, veremos como implementar uma pilha de lâmpadas básicas usando o Docker e o utilitário Docker-Compose.

Neste tutorial, você aprenderá:

  • Como instalar o Docker e o Docker-Compose no Ubuntu 20.04
  • Como definir serviços e volumes usando o Docker-Compõe
  • Como mapear as portas host para as portas de contêiner no arquivo de configuração do docker-composição
  • Como usar montagens de ligação e volumes nomeados
  • Como construir um projeto com o Docker-Compose
Como criar uma pilha de lâmpadas à base de docker usando o Docker no Ubuntu 20.04

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Ubuntu instalado 20.04 ou Ubuntu atualizado para 20.04 Fossa focal
Programas Docker, Docker-Compose
Outro Permissões radiculares para criar recipientes do Docker e iniciar o serviço do Docker
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular
  1. Instalando pacotes e iniciando o serviço do Docker

    Para criar uma pilha de lâmpadas à base de docker no Ubuntu 20.04 Fossa focal, a primeira coisa que temos que fazer é instalar o software de que precisamos: Docker por si só, e Docker-Compose, que é um utilitário que nos vamos organizar facilmente aplicativos de múltiplas contadores usando Yaml Arquivos de configuração. Ambos os pacotes estão disponíveis nos repositórios oficiais do Ubuntu. Podemos instalá -los via apt:

    $ sudo apt install docker docker-compose 

    Depois que a instalação é executada, devemos iniciar o Docker serviço e habilitá -lo na inicialização. Podemos executar as duas operações com um único comando:

    $ Systemctl Ativar -Now Docker 
  2. Configuração do projeto

    O primeiro passo em nossa jornada consiste na criação do diretório que usaremos como raiz do nosso projeto. Para o bem deste artigo, chamaremos de LinuxConfig. Dentro deste diretório, criaremos outro, Documentroot, que hospedará os arquivos do nosso site. Podemos criar os dois diretórios ao mesmo tempo usando o -p opção do mkdir comando:

    $ mkdir -p linuxconfig/documentroot 


    Dentro de LinuxConfig Diretório, definimos a configuração do Docker-Compose para o nosso projeto dentro de um arquivo YAML, que por padrão deve ser chamado Docker-Compose.yml. Existem três estrofes principais que podemos usar no arquivo de configuração: Serviços, volumes e redes.

    Cada seção é usada para configurar o aspecto correspondente de um projeto. Neste tutorial, usaremos apenas os dois primeiros. Implementaremos os componentes da pilha de lâmpadas como serviços dentro de seus próprios contêineres separados.

    Os contêineres criados com o Docker-Compose serão membros da mesma rede e, portanto, poderão conversar um com o outro por padrão. Na rede, cada contêiner poderá fazer referência aos outros por um nome de host idêntico ao seu nome ou pelo nome usado para definir o serviço implementado pelo contêiner.

    Por padrão, os contêineres serão nomeados usando o nome do diretório que contém o arquivo de configuração como prefixo. Nesse caso, por exemplo, o contêiner usado para um serviço chamado php-httpd, será nomeado LinuxConfig_php-httpd_1.

  3. Definindo o serviço PHP + HTTPD

    O primeiro serviço que definiremos no arquivo de configuração incluirá Php Como o módulo de servidor da web apache. Usaremos uma das imagens oficiais do PHP disponíveis em DockerHub como base para o nosso contêiner, especificamente aquele com o -apache Sufixo, que fornece a configuração que mencionamos acima. Vamos começar a escrever nossa configuração:

    Versão: '3.7 'Serviços: Php-Httpd: Imagem: PHP: 7.Portas de 3 apache: - 80:80 Volumes: - "./Documentroot:/var/www/html " 
    cópia de

    A primeira coisa que especificamos no arquivo de configuração é versão. Com esta instrução, declaramos que versão específica do arquivo de composição usaremos. No momento da redação, versão 3.7 é o mais recente e recomendado.

  4. Depois de declarar a versão do arquivo de composição, começamos a escrever o serviço estrofe; dentro dele, definimos os serviços que comporão nossa pilha de lâmpadas. Nós chamamos o primeiro serviço php-httpd. O nome do serviço é completamente arbitrário, mas é sempre um bom hábito de usar um que seja significativo no contexto do projeto.

    O imagem A instrução é usada para especificar em qual imagem o contêiner deve se basear, neste caso PHP: 7.3-Apache.

    O portas As instruções são usadas para expor as portas no contêiner e para criar um mapa entre portas host e portas de contêiner. Esse mapa é definido separando as portas com um :. No lado esquerdo, especificamos a porta do host e, à direita, a porta dentro do contêiner deve ser mapeada. Nesse caso, mapeamos a porta 80 no host a Port 80 No contêiner, pois é a porta padrão usada pelo servidor da Web Apache.

    A última instrução que usamos é volumes: com ele, podemos especificar um mapeamento entre um Volume nomeado ou a caminho (relativa ou absoluta) no sistema hospedeiro para um caminho no recipiente, no qual será montado.

    Em nossa configuração, o ./Documentroot diretório hospedará os arquivos do site: ele será montado no /var/www/html Diretório dentro do contêiner, porque o último é a raiz do documento usada pelo Apache VirtualHost padrão. Essa configuração é chamada de montagem em ligação e é especialmente útil durante o desenvolvimento, porque as mudanças que fazemos nos arquivos do projeto são imediatamente refletidas dentro do contêiner. A desvantagem dessa configuração é que ela estabelece uma dependência entre o contêiner e a estrutura do arquivo da máquina host, diminuindo uma das principais vantagens do uso do Docker: Portabilidade.

    O diretório a ser montado dentro do recipiente será criado automaticamente se não existir quando o Docker-compor O comando é lançado: nesse caso, será de propriedade da raiz, se não for especificado de outra forma.

    Dentro de Documentroot Diretório agora podemos criar um arquivo de índice e tentar construir nosso projeto para verificar se a configuração está funcionando:

    $ echo "documentroot/index.php $ sudo docker -compose up -d 

    Depois de executar o comando, as imagens do Docker necessárias serão baixadas do DockerHub e os contêineres que serão criados com as configurações que fornecemos e executamos em segundo plano (eles não bloquearão o terminal), devido ao -d opção que fornecemos ao Docker-Compose comando. Com o projeto em funcionamento, se navegarmos para LocalHost Com o nosso navegador, devemos ver a seguinte página:



    A página Phpinfo

    Para parar o projeto, do diretório que hospeda o Docker-Compose.yml Arquivo, podemos executar:

    $ sudo docker-compose stop 

    Definindo o serviço MariaDB

    Uma parte essencial da pilha de lâmpadas é a camada de banco de dados. Em nossa configuração, usaremos Mariadb e sua imagem oficial do Docker disponível no DockerHub:

    Versão: '3.7 'Serviços: Php-Httpd: Imagem: PHP: 7.Portas de 3 apache: - 80:80 Volumes: - "./Documentroot:/var/www/html "mariadb: imagem: mariadb: 10.5.2 Volumes: - MARIADB -VOLUME:/var/lib/mysql Ambiente: TZ: "Europa/Roma" mysql_allow_empty_password: "não" mysql_root_password: "rootpwd" mysql_user: 'testUser' mySql_password: 'TestSpass:' Testpass. Mariadb-Volume: 
    cópia de

    Dentro de Serviços Stanza, definimos outro serviço e chamamos Mariadb e com o imagem Instrução que especificamos que queremos usar o 10.5.2 Versão da imagem oficial.

    Na definição anterior de serviço, usamos um suporte de ligação. Desta vez, em vez disso, usamos um Docker adequado Volume nomeado, para ser montado em /var/lib/mysql Dentro do contêiner (é o diretório de dados padrão usado pelo mariadb). Ao contrário de uma montagem de ligação, os volumes nomeados não criam dependências do contêiner na estrutura do sistema de arquivos host. Completamente gerenciado pelo Docker, eles são o método recomendado de dados persistentes que de outra forma seriam perdidos quando os contêineres são destruídos.

    Os volumes nomeados podem ser definidos no principal volumes estrofe do arquivo de configuração e pode ser referenciado do volumes subseção de cada serviço definido. Nesse caso, chamamos nosso volume Volume Mariadb.

    Como próximo passo, definimos o valor de alguns variáveis ​​ambientais usado para influenciar o comportamento do contêiner. As variáveis ​​de ambiente são definidas no ambiente Seção de uma definição de serviço. As variáveis ​​que definimos neste caso têm o seguinte efeito:

    Variável Efeito
    Tz Defina o fuso horário usado pelo servidor mariadb
    Mysql_allow_empty_password Ativar ou desativar o uso de senha em branco para o usuário do db root
    Mysql_root_password Esta é uma variável obrigatória e é usada para definir a senha do usuário raiz de banco de dados
    Mysql_database Opcionalmente usado para especificar o nome do banco de dados a ser criado na inicialização da imagem
    Mysql_user Opcionalmente usado para especificar o nome de um usuário que será criado com permissões de superusuário para o banco de dados especificado com mysql_database
    Mysql_password Usado para especificar a senha para o usuário criado com o nome fornecido por mysql_user

    Neste ponto, devemos ter um servidor da web em funcionamento capaz de trabalhar com PHP e um banco de dados para armazenar nossos dados.

    Bônus - Phpmyadmin

    Nossa pilha básica de lâmpadas deve agora estar completa. Como bônus, podemos querer adicionar phpmyadmin Para isso, para controlar facilmente nosso banco de dados MariaDB de uma interface da web fácil de usar. Vamos adicionar a definição de serviço relacionada à nossa configuração do Docker-Compose:

    Versão: '3.7 'Serviços: Php-Httpd: Imagem: PHP: 7.Portas de 3 apache: - 80:80 Volumes: - "./Documentroot:/var/www/html "mariadb: imagem: mariadb: 10.5.2 Volumes: - MARIADB -VOLUME:/var/lib/mysql Ambiente: TZ: "Europa/Roma" mysql_allow_empty_password: "não" mysql_root_password: "rootpwd" mysql_user: 'testser' mysql_password: 'TestSpass:' Testpass: 'STRAPT:'sQL). Imagem: links phpmyadmin/phpmyadmin: - 'mariadb: db' portas: - 8081: 80 volumes: mariadb -volume: 
    cópia de

    Nomeamos nosso serviço phpmyadmin e configurou -o para usar o phpmyadmin/phpmyadmin Imagem do DockerHub. Nós também usamos o links palavra -chave pela primeira vez; Para que serve isso? Como já sabemos, por padrão, e sem configurações especiais necessárias, todos os contêineres criados na mesma configuração do Docker-Compose são capazes de conversar um com o outro. A imagem phpmyadmin está configurada para referenciar um contêiner em execução de banco de dados pelo dB Nome, portanto, precisamos criar um pseudônimo com o mesmo nome para o nosso serviço Mariadb. Isso é exatamente o que links é usado para: para definir aliases extras para alcançar um serviço de outro.

    Dentro da definição de serviço, também mapeamos a porta 8081 da nossa máquina host, para porto 80 Dentro do recipiente (a porta 80 já está mapeada para a mesma porta dentro do contêiner php-httpd). A interface phpmyadmin será, portanto, acessível no Localhost: 8081 endereço. Vamos reconstruir nosso projeto e verificar:

    $ sudo docker -compose up -d - -build 


    A página de login phpmyadmin

    Podemos fazer login com as credenciais que definimos para o nosso serviço de banco de dados e verificar se o testdb O banco de dados foi criado:



    Página inicial de phpmyadmin

    Usando uma imagem personalizada para um serviço

    Nos exemplos acima, sempre usamos imagens de baunilha em nossa definição de serviços. Há casos em que podemos querer usar imagens personalizadas do docker com base nelas. Por exemplo, digamos que queremos construir o serviço php-httpd, mas inclua uma extensão php adicional: como podemos fazer isso? Na raiz do projeto, definimos um novo diretório e, por conveniência, nomeie -o após o serviço:

    $ mkdir php-httpd 

    Dentro deste diretório, criamos um Dockerfile, usado para estender a imagem base, com o seguinte conteúdo:

    De Php: 7.3-Apache Rótulo mantenedor = "[email protected] "run apt-get update && apt-get install -y libmcrypt-dev \ && pecl install mcrypt-1.0.2 \ && Docker-Php-EXT-ELLABLE MCRYPT 

    De volta ao nosso Docker-Compose.yml arquivo, modificamos a definição do php-httpd serviço. Não podemos fazer referência à imagem diretamente como fizemos antes. Em vez disso, especificamos o diretório que contém nosso Dockerfile personalizado como o contexto de construção:

    Versão: '3.7 'Serviços: PHP-HTTPD: Build: Context: ./php -httpd portas: - 80:80 Volumes: - "./Documentroot:/var/www/html "[…] 
    cópia de

    No construir Seção, definimos configurações aplicadas no horário de construção. Nesse caso, usamos contexto Para fazer referência ao diretório que contém o Dockerfile: o referido diretório é usado como contexto de compilação, e seu conteúdo é enviado ao daemon do docker quando o contêiner é construído. Para aplicar a modificação, devemos reconstruir o projeto.

    A propósito, para saber mais sobre extensões adicionais na imagem PHP Docker, você pode dar uma olhada na documentação oficial e especificamente no Extensões PECL seção.

    Conclusões

    Neste tutorial, vimos como construir uma pilha de lâmpadas básicas usando a tecnologia de contêineres com o Docker e o Docker-Composy. Vimos como definir os vários serviços dentro do Docker-Compose.Arquivo de configuração YML e como configurar montagens de ligação, volumes denominados e mapeamento de portas de contenção de host. Também vimos como usar imagens personalizadas. Você pode dar uma olhada na referência do docker-composição para a lista detalhada de instruções que podem ser usadas dentro do arquivo de configuração do Docker-Compose.

Tutoriais do Linux relacionados:

  • Ubuntu 20.04 WordPress com instalação do Apache
  • Coisas para instalar no Ubuntu 20.04
  • Instalação do Ampache Raspberry Pi
  • OpenLITESPEED WordPress Instalação
  • Como trabalhar com a API de Rest WooCommerce com Python
  • Como instalar a pilha de lâmpadas no Almalinux
  • Como configurar o Linux Apache Mysql Python Server
  • Ubuntu 20.04: WordPress com instalação nginx
  • Como alterar a senha do usuário do mariadb
  • Instale o MySQL no Ubuntu 20.04 LTS Linux