Docker: Instalação e execução de PHP e MySQL

Quando comecei a pesquisar sobre Docker, não consegui encontrar um tutorial que fosse direto ao ponto, para que eu pudesse utilizar em meus projetos.

Então não vou me aprofundar em conceitos, caso queira adquirir um conhecimento mais aprofundado sobre Docker, recomendo que leia a documentação oficial no Docker Hub.

https://docs.docker.com/docker-hub/

Sem mais delongas, vamos pôr a mão na massa.

Instalando Docker e Docker Compose

Eu utilizo Linux Ubuntu 18.04 LTS para desenvolvimento, então este tutorial será feito considerando este sistema operacional, mas se você utiliza Windows a instalação também é muito simples, e você pode encontrar mais informações na documentação oficial.

https://docs.docker.com/docker-for-windows/install/

Para instalar o Docker, execute o seguinte comando:

$ sudo apt install docker.io

Somente a instalação do Docker já seria o suficiente, mas isso só faria sentido se fossemos trabalhar com apenas uma instancia. Uma vez que o nosso objetivo aqui é ter um servidor web com PHP e MySQL, ou seja, duas instancias, vamos utilizar também o Docker Compose para agilizar o processo na hora de iniciar e interromper a execução das instancias.

Para instalar o Docker Compose, execute o seguinte comando:

$ sudo apt install docker-compose

Parece mentira, mas neste momento já temos instalado tudo que é necessário, então execute o seguinte comando para testar a instalação:

$ docker run hello-world

Se não tiver nenhum problema, o Docker vai fazer o download da imagem e executar, tudo automaticamente, e o resultado deve ser algo como a seguir.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:b8ba256769a0ac28dd126d584e0a2011cd2877f3f76e093a7ae560f2a5301c00
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Caso tenha algum problema, é comum este estar relacionado a permissões do sistema operacional, e para resolver execute os seguintes comandos:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ sudo chmod 666 /var/run/docker.sock

A primeira linha cria um grupo de usuários chamado “docker”, a segunda adiciona o usuário que você está utilizando a este grupo, e a terceira linha modifica permissões do arquivo de conexão do Docker.  Agora execute o comando “docker run hello-world” novamente e veja se resolveu o problema.

Criando Arquivos

Como dito, vamos usar o Docker Compose para iniciar as instancias do PHP e do MySQL, para isso vamos precisar criar dois arquivos, “docker-compose.yml” e “php.Dockerfile“.

Se quiser saber mais sobre o Docker Compose, leia a documentação oficial:

https://docs.docker.com/compose/

Crie o arquivo “docker-compose.yml” com o seguinte conteúdo:

version: '3'

services:

  mysql:
    container_name: mysql-local
    image: mysql:5.6.35
    network_mode: host
    restart: 'no'
    tty: true
    expose:
      - 3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dbname
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass
    volumes:
      - mysql:/var/lib/mysql

  php:
    container_name: php-local
    image: php:7.2-apache
    network_mode: host
    build:
      context: ./
      dockerfile: ./php.Dockerfile
    expose:
      - 80
    volumes:
      - ./:/var/www/html

volumes:
  mysql:
  html:

Explicando rapidamente, este arquivo contem as configurações básicas das instancias, e acredito que não seja difícil entender quais parâmetros devem ser alterados para definir a senha do usuário root (MYSQL_ROOT_PASSWORD) do MySQL, ou o nome do banco de dados (MYSQL_DATABASE) que será criado, por exemplo.

Agora crie o arquivo “php.Dockerfile” com o seguinte conteúdo:

FROM php:7.2-apache

# INSTALL PHP EXTENSIONS
RUN docker-php-ext-install pdo_mysql

# ANABLE APACHE MOD REWRITE
RUN a2enmod rewrite

# ANABLE APACHE MOD HEADER
RUN a2enmod headers

# UPDATE APT-GET AND INSTALL LIBS
RUN apt-get update -y
RUN apt-get install -y openssl zip unzip git libnss3 libpng-dev

# INSTALL NODE
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash -
RUN apt-get install -y nodejs build-essential
RUN ln -s /usr/local/bin/node /usr/local/bin/nodejs

# INSTALL COMPOSER
RUN apt-get install -y openssl zip unzip git libnss3
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Change www-data user to match the host system UID and GID and chown www directory
RUN usermod --non-unique --uid 1000 www-data \
  && groupmod --non-unique --gid 1000 www-data \
  && chown -R www-data:www-data /var/www

# Defines that the image will have port 80 to expose
EXPOSE 80

WORKDIR /var/www/html

Você deve ter percebido que este arquivo funciona como se fosse um bash script do linux, ele executa basicamente comandos de shell, instala extensões do PHP, Node, Composer, configura Apache, e o que mais você precisar.

Se quiser saber mais sobre Dockerfile, leia a documentação oficial:

https://docs.docker.com/engine/reference/builder/

Agora, somente para efeitos de teste do servidor, vamos criar o arquivo “index.php”.

<?php
phpinfo();

Criando e Executando as Instâncias

Já instalamos, já criamos os arquivos, agora só falta fazer a mágica acontecer.

Na raiz da pasta onde foram criados os arquivos, execute o comando abaixo para criar uma build das instâncias do MySQL e do PHP:

$ docker-compose build

Esse comando faz com que o Docker baixe as imagens e execute os comandos do Dockerfile.

Agora, para iniciar as instâncias, execute:

$ docker-compose start

Isso faz com que o Docker inicie todas as instâncias, e para testar, abra o seu navegador e digite “localhost” na barra de endereço. Você deve ver uma página com as configurações do PHP.

Para interromper todas as instâncias, execute o comando:

$ docker-compose stop

Para acessar uma instância via SSH, caso precise fazer configurações extras, execute o seguinte comando:

$ docker exec -it php-local bash

Repare que “php-local” é o parâmetro “container_name” que definimos no arquivo “docker-compose.yml”, então se quiser acessar a instância do MySQL, execute:

$ docker exec -it mysql-local bash

Estas são informações absurdamente superficiais sobre a utilização do Docker. Aprender sobre os conceitos e a necessidade de utilizá-lo é muito importante caso queira seguir como programador, e a minha intensão aqui não é torná-lo um especialista, mas motivá-lo a estudar e adquirir este conhecimento.

Espero ter ajudado.