Usando Docker no Windows 10 – Parte 3

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.

docker_3_compose

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

  1. 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
  2. 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.
  3. 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.

    docker_3_vscode_extension

  4. Já no Visual Studio Code, podemos criar o arquivo docker-compose.yml e incluir as imagens que queremos usar. Segue exemplo de uma configuração docker-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 pasta log 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ão mysqli 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.
  5. Um aspecto importante na configuração acima é que para o container phpfm usamos o recurso Dockerfile 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 o Dockerfile.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.

  6. 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>

  7. Notas:

    • Com o docker-composer conseguimos executar comandos como up, stop e rm diretamente sobre todos os containers definidos no arquivo docker-compose.yml. Se alguma das definições de container no docker-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 comando docker-compose up -d.

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.

2 comentários

  1. 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>

    Curtir

Deixe um comentário