Como usar o Docker para criar contêineres de PHP e Apache

Os contêineres do Docker tornam seu aplicativo portátil em todos os ambientes. Depois de obter uma imagem de contêiner, você pode usá-la em qualquer lugar que o Docker estiver disponível. Veja como colocar em contêiner um aplicativo da web PHP usando o servidor Apache.
Usaremos a imagem oficial do PHP Docker como nossa base. Variantes pré-configuradas com o Apache são fornecidas, então você não precisará instalar o servidor da web por conta própria. A imagem base do PHP também oferece utilitários convenientes para gerenciar extensões PHP.
Criando um Dockerfile
As imagens do Docker são criadas a partir de um Dockerfile. Este arquivo contém instruções que são usadas para construir a imagem. As instruções incluem COPY, para copiar arquivos e pastas no contêiner, e RUN, que executa um comando dentro do contêiner.
Você pode fazer um site PHP simples rodar simplesmente copiando seus arquivos em uma imagem baseada em php: 8.0-apache.
DE php: 8.0-apache WORKDIR / var / www / html COPY index. php index. php COPY src / src EXPOSE 80
Este Dockerfile pega index. php e src de nosso diretório de trabalho e os copia para a raiz do documento Apache. Agora você pode construir a imagem e iniciar um contêiner a partir dela. Você veria seu site sendo servido pelo Apache.
docker build -t my-php-site: o mais recente. docker run -d -p 80:80 my-php-site: mais recente
As imagens do PHP Docker têm a raiz do documento Apache no local Debian padrão de / var / www / html. A instrução WORKDIR no Dockerfile significa que os comandos subsequentes serão executados na raiz do documento.
O Apache se expõe na porta do servidor da web padrão de 80. A diretiva EXPOSE no Dockerfile indica isso. Ao expor explicitamente a porta, você pode usar o sinalizador -P com docker run para vincular automaticamente uma porta de host aleatória à porta 80 do contêiner.
Personalizando a configuração do Apache
As imagens oficiais do PHP / Apache são baseadas no Debian. Você pode usar o gerenciador de pacotes apt para adicionar o software extra de que precisa.
Você também tem acesso total às ferramentas integradas do Apache. Você pode usar a2enmod / a2dismod para gerenciar módulos e a2ensite / a2dissite para interagir com hosts virtuais.
O arquivo de configuração do Apache é padronizado como /etc/apache2/apache2. conf. Adicione linhas a este arquivo, ou substitua-o inteiramente, para estender a configuração do Apache.
Uma mudança que sempre vale a pena fazer é definir explicitamente o Apache ServerName. Isso impede que o “ não seja capaz de determinar com segurança o ServerName ” aviso que geralmente aparece nos registros do seu contêiner.
Normalmente, você também deseja adicionar seu próprio host virtual Apache. Isso permite que você defina uma configuração personalizada além do que o site padrão do Apache 000 fornece. Veja como fazer essas alterações.
COPIAR my-apache-site. conf /etc/apache2/sites-available/my-apache-site. conf RUN echo "ServerName localhost" > > /etc/apache2/apache2. conf & & \ a2enmod reescrever & & \ a2dissite 000-default & & \ a2ensite my-apache-site & & \ service apache2 restart
Este exemplo desabilita o site padrão, habilita o site personalizado e reinicia o Apache para aplicar as mudanças. O módulo mod_rewrite também está habilitado, permitindo o uso de diretivas Rewrite em arquivos . htaccess. Você também pode ativar outros módulos, como cabeçalhos, se sua configuração interagir com os cabeçalhos de resposta.
Adicionando extensões PHP
As imagens do PHP Docker vêm com utilitários de gerenciamento de extensão integrados. Algumas extensões são ativadas por padrão – você pode verificar o que está disponível executando php -m dentro de um contêiner em execução.
Muitas extensões comuns podem ser instaladas usando docker-php-ext-install:
docker-php-ext-install pdo_mysql
Algumas extensões precisam ser configuradas antes de serem instaladas. Você pode usar docker-php-ext-configure para realizar a configuração de pré-instalação. As opções disponíveis variam de acordo com a extensão. Leia a página de manual da extensão para determinar os sinalizadores que você pode fornecer.
EXECUTAR docker-php-ext-configure gd --with-jpeg = / usr / include / & & \ docker-php-ext-install gd
Você também pode usar extensões distribuídas via PECL. Essas extensões requerem um procedimento de instalação em duas etapas. Instale o pacote PECL primeiro e, em seguida, use docker-php-ext-enable para registrar a extensão com a instalação do PHP.
EXECUTE apt-get install -y libmcached-dev zlib1g-dev & & \ pecl install memcached-3.1.5 & & \ docker-php- ext-enable memcached
Configuração de PHP
As imagens Docker são pré-configuradas para carregar arquivos de configuração PHP encontrados em /usr/local/etc/php/conf.d. Adicione seu próprio arquivo . ini a este diretório. PHP incluirá seu conteúdo em tempo de execução, sobrescrevendo quaisquer valores existentes. Esta é a maneira recomendada de estender a configuração padrão.
O caminho do diretório de configuração pode mudar no futuro. Você pode obter sua localização atual usando a variável de ambiente $ PHP_INI_DIR. Atualmente está resolvido para /usr/local/etc/php/conf.d.
Usando o Composer
O Composer não está disponível por padrão. O Composer é um esforço da comunidade que existe independentemente do PHP. Você precisa instalá-lo manualmente se quiser usá-lo em um contêiner do Docker.
A melhor maneira de usar o Composer em suas compilações é referenciar a própria imagem do Docker da ferramenta por meio de uma compilação de vários estágios. Use COPY --from para trazer o binário do Composer para o seu contêiner de PHP; você pode usar o Composer normalmente para instalar as dependências do seu projeto.
COPY --from = composer: 2 / usr / bin / composer / usr / bin / composer COPY composer. json composer. json COPY composer. lock composer. lock RUN composer install --no-dev
Usar essa abordagem reduz a complexidade. Você não precisa baixar e executar o script de instalação do Composer. Fazendo referência ao composer: 2, o Docker extrairá a imagem e, em seguida, copiará o binário do Composer.
Scripts de pontos de entrada personalizados
Você pode precisar usar um script de ponto de entrada personalizado se quiser executar migrações de aplicativos antes do início do tempo de execução do servidor principal. Você pode substituir o contêiner ENTRYPOINT para usar sua própria sequência de inicialização.
Você pode fazer a execução do contêiner continuar normalmente executando apache2-foreground. Isso executará o Apache em primeiro plano, evitando que o contêiner saia após a conclusão do script do entrypoint.
ENTRYPOINT ["bash", "/Docker. sh"]
Conteúdo do Docker. sh:
php app. php my-migration-command # executar migrações serviço cron start # iniciar alguns serviços exec apache2-foreground # execução principal
Conclusão
Encaixar um serviço da web PHP é simples ao usar as imagens oficiais. Você pode configurar prontamente Apache e PHP com extensões e seus próprios arquivos de configuração.
É mais provável que você encontre dificuldades ao tentar usar complementos de comunidade de terceiros, como o Composer. Eles não são incluídos por padrão, então você precisará usar compilações do Docker em vários estágios ou procedimentos de instalação manual.
Usar o Docker oferece versatilidade ao seu aplicativo em como e onde ele é implantado. Com sua imagem, você pode ativar uma instalação funcional de seu site usando apenas docker build e docker run em seu terminal.
Nenhum comentário