
Sobre o que é este artigo
Este artigo abordará nossa experiência no uso do Docker para configurar rapidamente um ambiente de desenvolvimento escalável para desenvolvimento na Web. Vou falar brevemente sobre as tarefas que nos confrontaram e as ferramentas que foram escolhidas para resolver esses problemas. O artigo está marcado com o ícone do tutorial, porque você encontrará instruções sobre a implantação do ambiente nele. Comparado a artigos semelhantes (links no final do artigo), haverá menos detalhes técnicos e mais exemplos ao vivo.
Que tarefas enfrentamos?
Acontece que um novo desenvolvedor se conecta a uma equipe existente. Para que ele possa começar a executar tarefas (em outras palavras, escrever código e verificar seu trabalho), não é suficiente obter a fonte. Você precisa de um ambiente que inclua um servidor web, compilador php e banco de dados. Este é o conjunto mínimo. Dependendo do projeto, o ambiente pode incluir:
- NoSQL
- Servidor de Filas
- Motor de busca de texto completo;
- Solução de cache;
- Catadores;
- Ferramentas úteis para desenvolvedores
Tudo isso deve ser instalado localmente no desenvolvedor e ter as mesmas versões que os demais membros da equipe. E aqui há dificuldades:
- Após a instalação, você precisa configurar;
- O software já está instalado, mas é uma versão diferente;
- Faz muito tempo;
E o fato de os desenvolvedores trabalharem em plataformas diferentes (Windows, Linux, OS X) torna as coisas ainda mais complicadas.
Para resolver o problema, o Docker foi escolhido. Talvez o principal motivo seja que ele se encaixa facilmente na infraestrutura existente. Funciona muito bem no Linux e na maioria dos nossos desenvolvedores neste sistema operacional.
AlternativaO Laravel fornece sua própria solução para organizar um ambiente local chamado Homestead. Este é um conjunto de configurações e scripts para o Vagrant, com a ajuda da qual o software necessário é implantado na máquina virtual VirtualBox. Mas uma descrição de Homestead está além do escopo deste artigo.
Projeto Laradock
No início, este projeto visava apenas o lançamento do Laravel no Docker, que se reflete em seu nome. Mas, à medida que a popularidade da comunidade php crescia, Laradock começou a apoiar outros projetos php: Symfony, CodeIgniter, WordPress, Drupal. O projeto é realmente popular, apoiado e desenvolvido ativamente:

O Laradock é um conjunto de imagens Docker independentes pré-configuradas que você pode montar com base nos requisitos do seu projeto. Bem documentado e extremamente fácil de usar. Para iniciar componentes, basta listá-los:
docker-compose up apache2 php-fpm mysql phpmyadmin
ou
docker-compose up nginx php-fpm mariadb adminer
Nota : não há necessidade de especificar explicitamente o php-fpm, porque quando o servidor da web do contêiner php-fpm é iniciado, o contêiner é iniciado automaticamente.
O repositório possui mais de 48 contêineres, incluindo:
- Bancos de dados : MySQL, MariaDB, Percona, MongoDB, MSSQL, PostgreSQL
- Gerenciamento de banco de dados : PhpMyAdmin, Adminer, PgAdmin
- Servidores da Web : nginx, Apache2, Caddy
- Compiladores PHP : PHP FPM, HHVM
- Diversos : Selênio, Jenkins, ElasticSearch, Kibana, Gitlab, Mailhog, MailDev, Laravel Echo, Phalcon
- Ferramentas : PHP CLI, Compositor, Git, Linuxbrew, Nó, V8JS, Gulp, SQLite, xDebug, Enviado, Distribuidor, Vim, Fio, Drush
Requisitos e condições iniciais
Você precisará de:
e o console no qual os comandos serão executados. O site docker possui documentação abrangente sobre a instalação em diferentes plataformas (os links também estão no final do artigo). Se você ainda não instalou o git, faça-o de acordo com as instruções do site oficial.
Arquitetura de repositório Git: projeto principal e Laradock
O Laradock pode ser usado em duas versões:
- Laradock separado para cada projeto
- Um laradock para muitos projetos
No primeiro caso, a estrutura de diretórios ficará assim:

No segundo, assim:
Sempre usamos a primeira opção: um projeto - um laradock. É essa abordagem que fornece flexibilidade e independência de um projeto em relação a outro.
A segunda questão importante é: criar um repositório comum ou dois separados? Em outras palavras, preciso adicionar arquivos laradock ao repositório principal do projeto? A resposta é necessária, mas na forma de um submódulo para o repositório principal. O ambiente do Docker é uma parte auxiliar do projeto e nem sempre é necessário. Por exemplo, em servidores de temporariedade e produção, não é necessário. Quando você implanta usando o git, os arquivos do ambiente não chegam lá.
O nome do diretório do ambiente
Por padrão, os nomes dos contêineres usam o nome do diretório atual como um sufixo: laradock_nginx_1, laradock_mysql_1 etc. Para evitar confundir dados em volumes, nomes de diretório exclusivos são necessários para seus ambientes. Isso é fácil de conseguir se seguirmos o esquema escolhido: adicione o nome do projeto ao nome do diretório com o ambiente, por exemplo:
- laradock-mysite
- laradock-proj1
- laradock-mobapp
isto é, o prefixo "laradock" e o nome do diretório com o projeto através de um hífen.
Lançamento de um site
Por onde começamos o lançamento do site?
Como mencionamos no terceiro capítulo, usamos o Laradoc para criar o ambiente.
O processo de inicialização consiste nas etapas para configurar o ambiente e o aplicativo laravel.
Configurações do projeto
O Laradoc inclui um exemplo de arquivo de configuração do ambiente. Criamos uma cópia para o nosso projeto.
cp env-example .env
As opções .env são bastante óbvias. Nos parâmetros, definimos o acesso ao banco de dados, parâmetros de email, acesso a serviços de terceiros, se o usarmos em nosso projeto.
Iniciar e parar aplicativos de ambiente são feitos por comandos docker-compose
docker-compose up
e
docker-compose stop
Se necessário, você pode chamar o download dos serviços necessários no comando start. Por exemplo, três serviços adicionais serão carregados desta maneira:
docker-compose up -d nginx percona adminer
Você pode remover este comando em um script de shell separado para não precisar inseri-lo manualmente a cada vez.
O script de inicialização pode ser chamado de "start.sh" ou o que você quiser:
O script de parada de serviço pode ser chamado de "stop.sh" ou "down.sh":

Inicialização do Projeto
A mudança para o ambiente do contêiner é realizada por
docker-compose exec --user=laradock workspace bash
Erros de implantação
Ao instalar o Laradoc em um ambiente Linux, pode ocorrer um problema de permissão de arquivo.
Nesse caso, os arquivos podem ter o proprietário errado ou direitos de acesso insuficientes.
Sintomas : ao tentar iniciar o ambiente com o comando docker-compose up ou ir para o contêiner com o comando docker-compose exec ..., como no exemplo acima, erros semelhantes aos
/ var / www / vendor não existe e não pôde ser criado
Não foi possível abrir o fluxo ou o arquivo "/var/www/storage/logs/laravel.log": falha ao abrir o fluxo: permissão negada
O motivo do erro é que, no exemplo de configuração do ambiente de docker, o ID do usuário e o grupo de usuários são codificados, por padrão 1000 e 1000, respectivamente.
Se em nosso sistema unix esses IDs já estiverem ocupados por outras entidades, você precisará editar manualmente a configuração.
Procedimento de correção de erros
Verifique o usuário e o grupo nos diretórios:
ls -la /var/www
Os proprietários de arquivos e diretórios (Usuário e Grupo de Usuários) devem ser laradock laradock.
Se, em vez de laradock: laradock, o proprietário e o grupo forem indicados por números (1001: 1001, 1001: 13002 e combinações semelhantes), será necessário fazer alterações nos arquivos de configurações.
Se seu ID do usuário e grupo de usuários (/ etc / passwd, / etc / group) não corresponderem aos especificados, para a operação correta, você precisará fazer alterações nos seguintes arquivos:
/ laradock / php-fpm / Dockerfile *, em linha
"
EXECUTAR usermod -u 1000 www-data "
substitua 1000 pelo ID do usuário
/laradock/.env em linhas
WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000
WORKSPACE_PUID - especifique seu ID do usuário, WORKSPACE_PGID - ID do grupo de usuários
/ laradock / workspace / Dockerfile *, em linhas
ARG PUID = 10315
ARG PGID = 10004
PUID - ID do usuário, PGID - ID do grupo de usuários
Após fazer as alterações, recrie o espaço de trabalho e o php-fpm novamente e inicie o contêiner:
docker-compose build workspace php-fpm
Se você encontrar esse problema, precisará verificar os direitos de acesso aos diretórios da estrutura do Laravel. Defina permissões para diretórios que exigem permissões de gravação:
sudo chgrp -R www-data storage bootstrap/cache; sudo chmod -R ug+rwx storage bootstrap/cache
Certificados SSL e https
Provavelmente, seu site em produção funcionará de acordo com um protocolo seguro. Faz sentido conduzir o desenvolvimento local em https. Isso não é muito difícil, é necessário um certificado SSL e pequenas configurações. Este artigo é descrito em mais detalhes em
Como emitir um certificado SSL autoassinado .
Executando vários sites
Portanto, todos os projetos funcionam de acordo com o esquema “One Laradock - one project”. Mas um projeto não é necessariamente um site. Às vezes, você precisa executar vários sites ao mesmo tempo, porque eles interagem entre si.
Nesse caso, dois laradock não podem ser iniciados ao mesmo tempo, porque em cada um deles é iniciado um servidor da Web que escuta a porta 80 - temos um conflito. Mas temos acesso aos arquivos de configuração do nginx, vamos configurá-lo.
Mas primeiro, uma observação sobre os repositórios de arquitetura e git. No caso de vários sites, usamos a estrutura de diretórios da segunda opção:

O repositório git com laradock não é mais um submódulo de outro repositório, mas se torna completamente independente.
A configuração do servidor da Web será mostrada usando o nginx como exemplo. No diretório laradock, acesse nginx / sites. Vemos default.conf e vários arquivos * .conf.example. Com base no arquivo default.conf ou de amostra, criamos configurações para sites.
Preste atenção à raiz do documento. Por padrão, a diretiva raiz fica assim:
root /var/www/public;
mas deve ser assim:
root /var/www/site-1/public; root /var/www/site-2/public;
Importante!
Dê uma olhada no conteúdo de .gitignore neste diretório. Todos os arquivos * .conf, exceto default.conf, são ignorados. É necessário adicionar arquivos criados a exceções, ou seja, não os ignore.
Configure o crontab para que o planejador laravel possa funcionar corretamente. Para fazer isso, adicione os caminhos no arquivo espaço de trabalho / crontab / laradock:
* * * * * laradock /usr/bin/php /var/www/site-1/artisan schedule:run >> /dev/null 2>&1 * * * * * laradock /usr/bin/php /var/www/site-2/artisan schedule:run >> /dev/null 2>&1
Para uma comunicação bem-sucedida de sites dentro de contêineres, adicione aliases. No arquivo docker-compose.yml, encontramos a seção
### NGINX Server ###
e adicione um alias para cada domínio:

É tudo o que você precisa fazer para executar um projeto com vários domínios. Fora do artigo, permanece a questão de organizar https para vários domínios. Tudo por analogia com a organização SSL para um domínio, descrito na seção acima. Adicione um comentário, se você tiver alguma dificuldade, responderei ou descreverei os recursos em um artigo separado.
Recursos adicionais
No ambiente do Docker, é possível configurar os aplicativos de que precisamos. A configuração básica do Laradoc já inclui pacotes de aplicativos:
Servidor de aplicativos da web | Apache2, Caddy |
Cache de aplicativo Web | Nginx, Verniz |
Bancos de dados e serviços de cache | Mongo, Redis, Mssql, Mysql, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike |
Interfaces da Web para bancos de dados | Administrador, PhpMyAdmin |
Balanceador de carga | Haproxy |
Programação, conchas e frameworks | Php, Python, Symfony, Laravel, Nó |
Utilitários | Php, Python, Symfony, Laravel, Nó |
Gerenciador de pacotes | Compositor de fios |
Ferramenta de teste | Jenkins |
Ferramenta de configuração de infraestrutura de aplicativos | Terraform |
Considere brevemente as aplicações mais mencionadas.
RabbitmqO mecanismo de mensagens entre aplicativos. O desenvolvedor deste pacote determina seu objetivo da seguinte maneira: “gerenciador de filas”, “intermediário de mensagens” ou “enfileiramento de mensagens”.
Uma mensagem pode conter qualquer conjunto de dados.
No cenário de trabalho com o gerenciador de filas, uma mensagem de um aplicativo - o remetente - é salva até que outro aplicativo (destinatário) se conecte e pegue (receba) a mensagem da fila.
RedisCriando um cache de dados na RAM. Também pode ser usado como um data warehouse junto com um servidor de banco de dados ou substituindo-o.
O Redis suporta seqüências de caracteres, listas, conjuntos, conjuntos ordenados e tabelas de hash.
A principal desvantagem dos rabanetes é a perda de dados no caso de limpeza da RAM, quando o sistema operacional é reiniciado ou quando o equipamento é desligado. Os desenvolvedores de rabanete imaginavam um cenário semelhante: no modo AOF (acrescentar somente arquivo), os dados são adicionados ao arquivo de disco a cada segundo.
A principal vantagem dos rabanetes é o acesso mais rápido aos dados com a velocidade de acesso à RAM.
Links materiais
LaravelDockerLaradockHerdade do Laravel“Como emitir um certificado SSL autoassinado e fazer seu navegador confiar nele”Docker + Laravel =Conclusão
Escolhendo o Laravel + Docker para desenvolvimento web, ganhamos o prêmio mais valioso: o tempo.
Seguindo o cenário de desenvolvimento no WAMP ou LAMP, tivemos que gastar tempo
inútil e em lugar nenhum.
Tanto o WAMP quanto o LAMP exigem que um desenvolvedor de php tenha um certo nível de habilidade em áreas que não estão diretamente relacionadas ao desenvolvimento web: configuração de um servidor web, configuração de parâmetros php etc.
O uso do Laradoc nos permite, depois de criar todo o ambiente do projeto, implantá-lo em um novo local de trabalho no menor tempo possível. E comece a trabalhar imediatamente.
Em conclusão, observamos os benefícios do uso do Laradoc:
- infraestrutura unificada em cada local de trabalho: servidor web, servidor sql, um conjunto de estruturas e bibliotecas;
- uso racional do tempo de trabalho;
- entrada rápida de um novo desenvolvedor no projeto.
Escreva nos comentários como sua equipe trabalha com o ambiente, quais ferramentas e abordagens você usa.