Olá pessoal,
Esse é o terceiro artigo da nossa série de como usar o Docker para realizar atividades de desenvolvimento no Windows 10. Nos artigos anteriores apresentei uma visão geral de como funciona o Docker no Windows e também de como usar imagem do Apache Httpd para publicar páginas Web em um container Docker.
Nesse terceiro artigo irei abordar outro recurso do Docker que é a composição de containers que interagem entre si para o desenvolvimento de aplicações mais complexas. E aqui temos várias possibilidades como, por exemplo, definição de um LEMP Stack (Linux/Nginx/MySQL/PHP) conforme descrito por YONGZHI HUANG que demonstra como criar LEMP stack no Docker.
A composição de containers é feita pelo docker-compose e permite definir e rodar aplicações que envolvem múltiplos containers, com compartilhamento de recursos entre eles além de outras funcionaldiades como a escalabilidade. E para definir a composição de containers temos um arquivo especial chamado docker-compose.yml
.
Por serem várias as possibilidades, estarei descrevendo aqui apenas a parte conceitual do docker-compose. Para o passo-a-passo e detalhes na montagem de ambientes como o LEMP Stack, acesse o nosso repositório DockerSamples da conta GitBuh do TalkitBR.
Para mais informações sobre o Docker compose, acesse a documentação oficial no site do Docker.
Definindo a composição de containers
- Para começar, é necessário ter uma pasta a parte onde serão colocadas as pastas, arquivos e configurações para nossa composição de containers. Por exemplo
C:\docker\lemp
- Abrir essa pasta em um editor de arquivos. Aqui irei usar o Visual Studio Code que extensões que permitem editar nosso arquivo docker-compose.yml.
- Para facilitar a edição, recomenda-se usar um editor de arquivos docker-compose. Aqui vou usar uma extensão do Visual Studio Code. Acesse as extensões e então busque por “docker compose”. Selecione a extensão “Dockerfile and Docker Compose File (yml)” e faça a instalação. Será solicitado o reinício do Visual Studio Code quando a instalação terminar.
- Já no Visual Studio Code, podemos criar o arquivo
docker-compose.yml
e incluir as imagens que queremos usar. Segue exemplo de uma configuraçãodocker-compose
que define 4 containers que compõe o LEMP Stack:nginx: image: tutum/nginx ports: - "8080:80" links: - phpfpm volumes: - ./logs/nginx-error.log:/var/log/nginx/error.log - ./logs/nginx-access.log:/var/log/nginx/access.log - ./nginx/default:/etc/nginx/sites-available/default - ./nginx/default:/etc/nginx/sites-enabled/default phpfpm: dockerfile: Dockerfile.mysql build: ./ ports: - "9000:9000" volumes: - ./public:/usr/share/nginx/html mysql: image: mariadb ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: admin phpmyadmin: image: phpmyadmin/phpmyadmin restart: always links: - mysql:db ports: - 8183:80 environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD: admin PMA_ARBITRARY: 0
Notas:
- nginx Container
nginx
que é o servidor Web. Para esse container estamos compartilhando os arquivos de log contidos na pastalog
e o arquivo de configuração./nginx/default
onde definimos como tratar os arquivos.php
que serão publicados no servidor. - phpfm É o PHP Engine para interpretar os arquivos PHP. Ele é usado pelo container
nginx
. Esse container é criado a partir de um Dockerfile pois precisamos construir uma imagem customizada que contenha a extensãomysqli
instalada. - mysql Container com o servidor de Banco de Dados MySQL. Usado para armazenar os dados a aplicação que iremos publicar no container nginx.
- phpmyadmin Container com um servidor Web onde temos publicado o PHPMyAdmin. Para acessar o banco de dados MySQL, definimos um link com o container mysql.
- nginx Container
- Um aspecto importante na configuração acima é que para o container
phpfm
usamos o recursoDockerfile
para para construir uma nova imagem customizada. Ela é necessária para incluirmos extensões no PHP que nos permitirão acessar o banco de dados MySQL. Segue oDockerfile.mysql
:FROM php:fpm RUN apt-get update && \ apt-get install vim git -y RUN docker-php-ext-install mysqli
Para mais informações sobre o Dockerfile, acesse a documentação oficial no site do Docker.
- Por fim, para executar o docker-compose executamos o seguinte comando em um terminal:
C:\docker\lemp>docker-compose up -d Starting lemp_mysql_1 Starting lemp_phpfpm_1 Starting lemp_phpmyadmin_1 Starting lemp_nginx_1 C:\docker\lemp>
- Com o docker-composer conseguimos executar comandos como
up
,stop
erm
diretamente sobre todos os containers definidos no arquivodocker-compose.yml
. Se alguma das definições de container nodocker-compose.yml
é modificada, o Docker é capaz de detectar essa mudança e recriar somente aquele container. - Ao publicarmos em um repositório o
docker-compose.yml
juntamente com o código do nosso projeto, outros membros do time conseguirão montar facilmente o ambiente através do comandodocker-compose up -d
.
Notas:
Próximos Passos
Apresentei nesse artigo uma visão geral sobre o docker-compose. Para os próximos artigos iremos explorar outras possibilidades do Docker, como:
– Criar imagens personalizadas e subir no nosso Docker Registry (registro de imagens Docker) para posteriormente compartilhar com outras pessoas.
– Explorar recursos Docker no Microsoft Azure.
Para mais informações sobre o Docker compose, acesse a documentação oficial no site do Docker.
Fiquem a vontade para sugerir exemplos para demonstrarmos aqui. Abraços e até a próxima.
Olá João, segui os passos, mas no final o phpfpm não conseguiu ler o dockerfile: Dockerfile.mysql
Digest: sha256:0d3eaec30b333ba90ff89eb529521236454714064a41ca80f23f9a37f9d75e60
Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest
Creating codigo_mysql_1 … done
Creating codigo_phpfpm_1 … error
Creating codigo_phpmyadmin_1 … done
ERROR: for codigo_phpfpm_1 Cannot create container for service phpfpm: b’Drive has not been shared’
ERROR: for phpfpm Cannot create container for service phpfpm: b’Drive has not been shared’
ERROR: Encountered errors while bringing up the project.
PS C:\Sistemas\SGD\codigo>
CurtirCurtir
Olá Hugo Leonardo, tudo bem?
É provável que tenha faltado compartilhar o drive (de acordo com o especificado no post https://wordpress.com/read/blogs/88353588/posts/9097)
Em alguns casos, mesmo ocorrendo erro, tentar desmarcar e marcar novamente o Share do drive na configuração do Docker.
Att,
João
CurtirCurtir