Usando Docker no Windows 10 – Parte 2

Olá pessoal,

Esse é o segundo artigo da nossa série sobre como usar o Docker para realizar atividades de desenvolvimento no Windows 10. No primeiro artigo mostrei um passo a passo de como preparar o ambiente e também fizemos um breve tour em algumas funcionalidades do Docker através do uso da imagem docker/whalesay.

Já nesse artigo irei demonstrar como desenvolver aplicações usando containers Docker. E uma das principais vantagens disso é que você não precisará instalar várias ferramentas e softwares na sua própria máquina. Ao invés disso, você irá fazer o download (pull) de uma imagem, criar um container Docker a partir dessa imagem e então desenvolver usando esse container.

Pesquisando e usando Imagens Docker

Conforme vimos no artigo anterior, o Docker disponibiliza em seu site uma lista de imagens públicas que você pode baixar e usar:

docker_explore

Por exemplo, vamos buscar a imagem httpd (imagem do Apache Httpd). Ao clicar em detalhes da imagem httpd, vemos informações de como usar essa imagem tanto a partir de Dockerfile (que será explorado mais adiante) ou diretamente via linha de comando.

Vamos experimentar usar essa imagem para executar em container. Para isso, abra o Prompt de comando ou Powershell e execute o comando a seguir:

C:\>docker run -d -p 8080:80 --name meu-apache httpd:2.4

Onde:
1. -d define que o container irá rodar em segundo plano (-d).
2. -p 8080:80 mapeia a porta TCP 80 (porta default do Apache Httpd) do container para a porta 8080 da nossa máquina local.
3. --name permite a você dar um nome para o container.
4. httpd:2.4 define a imagem e versão que iremos usar. Se especificar apenas httpd, a última (latest) será baixada.

Para informações detalhadas do comando, execute docker run --help

Como resultado, o Docker irá verificar se a imagem httpd existe localmente e, se não existir, ele irá baixar a imagem. Depois disso ele irá rodar um container Docker usando essa imagem. Para verificar se o container está rodando, execute o comando docker ps

docker_run_httpd

Agora já podemos verificar o Apache Httpd rodando na porta TCP 8080 da nossa máquina. Podemos usar tanto o endereço http://172.0.0.1:8080/ como http://localhost:8080/:

docker_container_httpd_test

Compartilhamento de arquivos com o container

O container executado a pouco só fornece um servidor Apache Httpd a partir da imagem que baixamos. Porém, queremos usufruir do container publicando páginas Web. Para isso precisamos compartilhar com o container nossos arquivos de desenvolvimento local. Para fazer isso, precisamos primeiro configurar o Docker dando a ele permissão de compartilhar nosso drive onde estão os arquivos.

  1. Acesse as configurações do Docker clicando com o botão inverso do mouse na baleia que deve estar disponível nos ícones na sua barra de tarefas:
    docker_settings
  2. Na aba “Shared Drives” selecione o drive a ser compartilhado:
    docker_settings_2

Feito isso, vamos voltar para a linha de comando.

  1. Pare e remova o container que foi criado a pouco. Temos que fazer isso para criar outro container com a customização de compartilhamento de volume.

    C:\>docker stop meu-apache
    meu-apache

    C:\>docker rm meu-apache
    meu-apache

  2. Crie uma pasta onde serão colocados os arquivos HTML.
  3. Execute o novo container passando agora o parâmetro -v para fornecer volume que disponibiliza uma pasta local em um caminho dentro do container. Para o Httpd Apache, o caminho que nos interessa para publicar o HTML é o /usr/local/apache2/htdocs/

    C:\>docker run -d -p “8080:80” -v //C/dev/MeuSiteWeb/:/usr/local/apache2/htdocs/ --name meu-apache httpd:2.4

    Note que a notação para o caminho da pasta no Windows é definido como //C/dev/MeuSiteWeb/

    docker_container_httpd_volume

Se tentarmos agora acessar novamente o mesmo endereço Web no Browser, notem que é exibida mensagem de erro 404 Not Found:

docker_container_httpd_test_404

Isso acontece porque nossa pasta C:\dev\MeuSiteWeb está vazia. Precisamos então criar nossas páginas Web. No meu caso usarei o Visual Studio Code para abrir a pasta C:\dev\MeuSiteWeb e criar meu arquivo HTML.

docker_create_html

Segue código do arquivo HTML que criei usando o Bootstrap:

<!DOCTYPE html>
<html>
<head>
    <title>Meu Site Web no Container Docker</title>
    <meta charset="utf-8">
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
    <div class="container">
        <h1>Nova Pagina</h1>
        <p>Está página está sendo acessada via compartilhamento de volume.</p>
    </div>
</body>
</html>

Se atualizarmos de novo a página no browser, notem que será exibido o conteúdo que acabamos de criar na nossa máquina local. Isso sem precisarmos reiniciar o container ou fazer qualquer outra intervenção.

docker_container_httpd_test_after_create

Próximos Passos

Apresentei nesse artigo como rodar um container Apache e como fazer compartilhamento de pastas locais para dentro do container. Os outros artigos da série exploram outras possibilidades do Docker, como:
Criar uma infraestrutura de containers Nginx, PHP e MySQL para desenvolver aplicação Web PHP, demonstrando como realizar comunicação entre diferentes containers.
– Criar imagens personalizadas e subir no nosso Docker Registry (registro de imagens Docker) para posteriormente compartilhar com outras pessoas.
– Criar imagens personalizadas e subir no nosso Docker Registry (registro de imagens Docker) para posteriormente compartilhar com outras pessoas.

E fiquem a vontade para sugerir exemplos para demonstrarmos aqui. Abraços e até a próxima.

4 comentários

  1. Muito bom. Quase não se encontra material do docker para o windows, alguns que encontrei foi sem a integração com hyper-v. Porém ainda estou com dificuldades. Instalei o apache e funcionaou mas quando fiz o mapeamento para minha própria pasta ele não encontra o meu index.html, acredito estar direcionando para outro lugar. Já conferi várias vezes: docker run -d -p 8080:80 -v //c/dev/app/:/usr/local/apache2/htdocs/ –name meu-apache httpd:2.4 meu arquivo index.html está na pasta C:/dev/app pode me ajudar??

    Curtir

    • Olá Elsio, tudo bem?

      Eu executei o comando que você passou e funcionou aqui. Então acredito que esse problema é porque faltou configurar compartilhamento de drives no Docker. Tente aplicar novamente as mudanças referentes ao compartilhamento do drive C conforme descrevi no tópico “Compartilhamento de arquivos com o container”. Se mesmo assim não funcionar, me avise para vermos como resolver.

      Abraços,
      João

      Curtir

  2. João obrigado pelo retorno. Já havia feito o compartilhamento no docker e não funcionou, digitei então o comando no powershell (docker run –rm -v c:/Users:/data alpine ls /data) e aí sim passou a funcionar. Pelo que entendi então para fazer este compartilhamento tenho que antes de mais nada rodar este comando para concluir o mapeamento? Serve para todos os containers? Este alpine seria um container para compartilhamento? Como posso alterar o arquivo de configuração do apache?
    Estava utilizando também o gitbash mas este comando não tem o mesmo efeito depois de um bom tempo aparece a informação: ls: C:/Program Files/Git/data: No such file or directory.

    Grato!!

    Curtir

    • Olá Elsio, tudo bem?

      Na verdade a configuração do compartilhamento feita no Docker só indica que o seu Drive poderá ser compartilhado com o container quando ele for criado. Desse modo, quando for executado o comando “docker run”, você poderá compartilhar volumes do seu drive com o container. Você só precisará fornecer o argumento “-v”.

      Já sobre comando “docker run –rm -v c:/Users:/data alpine ls /data” que você mencionou, ele não é necessário para fazer o compartilhamento funcionar. Segue explicação sobre ele:
      –rm: indica que o container deverá ser excluído quando for finalizado. Por padrão ele não é excluído.
      -v c:/Users:/data: você está compartilhando sua pasta “c:/Users” no caminho “/data” do container. Este caminho deve estar definido no container.
      alpine: é uma imagem Docker que possui o Alpine Linux. Quando você especifica somente o nome da imagem, ele baixa a ultima versão disponível (equivamente a alpine/latest)
      ls /data: é o comando que você está executando no container. Neste caso você está listando a pasta /data

      Um detalhe: esse container será criado com base na imagem alpine/latest, executará o comando “ls /data” e depois finalizará, sendo excluído. Isso acontece porque o comando “ls /data” não se mantém ativo. Já um container com Apache se mantém ativo porque o servidor Apache se mantém em execução aguardando requisições HTTP.

      Por fim, para alterar o arquivo de configuração do Apache, você deve compartilhar o seu arquivo de configuração “httpd.conf” para substituir o arquivo de configuração padrão “/usr/local/apache2/conf/httpd.conf”. No meu outro artigo (https://talkitbr.com/2016/11/01/usando-docker-no-windows-10-parte-3/) eu explico como alterar a configuração de um servidor nginx. No caso do Apache seria o mesmo procedimento, mas para o arquivo httpd.conf

      Bom, espero ter ajudado. Mas fique a vontade para trazer mais perguntas. E obrigado pelo comentário!

      Abraços,
      João

      Curtir

Deixe um comentário