{"id":407,"date":"2019-09-25T13:44:56","date_gmt":"2019-09-25T16:44:56","guid":{"rendered":"http:\/\/www.fabianocouto.com.br\/blog\/?p=407"},"modified":"2019-09-26T12:37:56","modified_gmt":"2019-09-26T15:37:56","slug":"docker-instalacao-e-execucao-de-php-e-mysql","status":"publish","type":"post","link":"https:\/\/www.fabianocouto.com.br\/blog\/docker-instalacao-e-execucao-de-php-e-mysql\/","title":{"rendered":"Docker: Instala\u00e7\u00e3o e execu\u00e7\u00e3o de PHP e MySQL"},"content":{"rendered":"<p>Quando comecei a pesquisar sobre <strong>Docker<\/strong>, n\u00e3o consegui encontrar um tutorial que fosse direto ao ponto, para que eu pudesse utilizar em meus projetos.<\/p>\n<p>Ent\u00e3o n\u00e3o vou me aprofundar em conceitos, caso queira adquirir um conhecimento mais aprofundado sobre Docker, recomendo que leia a documenta\u00e7\u00e3o oficial no <strong>Docker Hub<\/strong>.<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/docker-hub\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/docker-hub\/<\/a><\/p>\n<p>Sem mais delongas, vamos p\u00f4r a m\u00e3o na massa.<\/p>\n<h3><strong>Instalando Docker e Docker Compose<\/strong><\/h3>\n<p>Eu utilizo <strong>Linux Ubuntu 18.04 LTS<\/strong> para desenvolvimento, ent\u00e3o este tutorial ser\u00e1 feito considerando este sistema operacional, mas se voc\u00ea utiliza <strong>Windows<\/strong> a instala\u00e7\u00e3o tamb\u00e9m \u00e9 muito simples, e voc\u00ea pode encontrar mais informa\u00e7\u00f5es na documenta\u00e7\u00e3o oficial.<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/docker-for-windows\/install\/<\/a><\/p>\n<p>Para instalar o Docker, execute o seguinte comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ sudo apt install docker.io<\/pre>\n<p>Somente a instala\u00e7\u00e3o do Docker j\u00e1 seria o suficiente, mas isso s\u00f3 faria sentido se fossemos trabalhar com apenas uma instancia. Uma vez que o nosso objetivo aqui \u00e9 ter um servidor web com PHP e MySQL, ou seja, duas instancias, vamos utilizar tamb\u00e9m o <strong>Docker Compose<\/strong> para agilizar o processo na hora de iniciar e interromper a execu\u00e7\u00e3o das instancias.<\/p>\n<p>Para instalar o Docker Compose, execute o seguinte comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ sudo apt install docker-compose<\/pre>\n<p>Parece mentira, mas neste momento j\u00e1 temos instalado tudo que \u00e9 necess\u00e1rio, ent\u00e3o execute o seguinte comando para testar a instala\u00e7\u00e3o:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker run hello-world<\/pre>\n<p>Se n\u00e3o tiver nenhum problema, o Docker vai fazer o download da imagem e executar, tudo automaticamente, e o resultado deve ser algo como a seguir.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker run hello-world\r\nUnable to find image 'hello-world:latest' locally\r\nlatest: Pulling from library\/hello-world\r\n1b930d010525: Pull complete \r\nDigest: sha256:b8ba256769a0ac28dd126d584e0a2011cd2877f3f76e093a7ae560f2a5301c00\r\nStatus: Downloaded newer image for hello-world:latest\r\n\r\nHello from Docker!\r\nThis message shows that your installation appears to be working correctly.\r\n\r\nTo generate this message, Docker took the following steps:\r\n 1. The Docker client contacted the Docker daemon.\r\n 2. The Docker daemon pulled the \"hello-world\" image from the Docker Hub.\r\n    (amd64)\r\n 3. The Docker daemon created a new container from that image which runs the\r\n    executable that produces the output you are currently reading.\r\n 4. The Docker daemon streamed that output to the Docker client, which sent it\r\n    to your terminal.\r\n\r\nTo try something more ambitious, you can run an Ubuntu container with:\r\n $ docker run -it ubuntu bash\r\n\r\nShare images, automate workflows, and more with a free Docker ID:\r\n https:\/\/hub.docker.com\/\r\n\r\nFor more examples and ideas, visit:\r\n https:\/\/docs.docker.com\/get-started\/\r\n<\/pre>\n<p>Caso tenha algum problema, \u00e9 comum este estar relacionado a permiss\u00f5es do sistema operacional, e para resolver execute os seguintes comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ sudo groupadd docker\r\n$ sudo usermod -aG docker $USER\r\n$ sudo chmod 666 \/var\/run\/docker.sock<\/pre>\n<p>A primeira linha cria um grupo de usu\u00e1rios chamado &#8220;docker&#8221;, a segunda adiciona o usu\u00e1rio que voc\u00ea est\u00e1 utilizando a este grupo, e a terceira linha modifica permiss\u00f5es do arquivo de conex\u00e3o do Docker.\u00a0 Agora execute o comando &#8220;docker run hello-world&#8221; novamente e veja se resolveu o problema.<\/p>\n<h3><strong>Criando Arquivos<\/strong><\/h3>\n<p>Como dito, vamos usar o Docker Compose para iniciar as instancias do PHP e do MySQL, para isso vamos precisar criar dois arquivos, &#8220;<strong>docker-compose.yml<\/strong>&#8221; e &#8220;<strong>php.Dockerfile<\/strong>&#8220;.<\/p>\n<p>Se quiser saber mais sobre o Docker Compose, leia a documenta\u00e7\u00e3o oficial:<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/compose\/<\/a><\/p>\n<p>Crie o arquivo &#8220;docker-compose.yml&#8221; com o seguinte conte\u00fado:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">version: '3'\r\n\r\nservices:\r\n\r\n  mysql:\r\n    container_name: mysql-local\r\n    image: mysql:5.6.35\r\n    network_mode: host\r\n    restart: 'no'\r\n    tty: true\r\n    expose:\r\n      - 3306\r\n    environment:\r\n      MYSQL_ROOT_PASSWORD: root\r\n      MYSQL_DATABASE: dbname\r\n      MYSQL_USER: dbuser\r\n      MYSQL_PASSWORD: dbpass\r\n    volumes:\r\n      - mysql:\/var\/lib\/mysql\r\n\r\n  php:\r\n    container_name: php-local\r\n    image: php:7.2-apache\r\n    network_mode: host\r\n    build:\r\n      context: .\/\r\n      dockerfile: .\/php.Dockerfile\r\n    expose:\r\n      - 80\r\n    volumes:\r\n      - .\/:\/var\/www\/html\r\n\r\nvolumes:\r\n  mysql:\r\n  html:<\/pre>\n<p>Explicando rapidamente, este arquivo contem as configura\u00e7\u00f5es b\u00e1sicas das instancias, e acredito que n\u00e3o seja dif\u00edcil entender quais par\u00e2metros devem ser alterados para definir a senha do usu\u00e1rio root (MYSQL_ROOT_PASSWORD) do MySQL, ou o nome do banco de dados (MYSQL_DATABASE) que ser\u00e1 criado, por exemplo.<\/p>\n<p>Agora crie o arquivo &#8220;php.Dockerfile&#8221; com o seguinte conte\u00fado:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">FROM php:7.2-apache\r\n\r\n# INSTALL PHP EXTENSIONS\r\nRUN docker-php-ext-install pdo_mysql\r\n\r\n# ANABLE APACHE MOD REWRITE\r\nRUN a2enmod rewrite\r\n\r\n# ANABLE APACHE MOD HEADER\r\nRUN a2enmod headers\r\n\r\n# UPDATE APT-GET AND INSTALL LIBS\r\nRUN apt-get update -y\r\nRUN apt-get install -y openssl zip unzip git libnss3 libpng-dev\r\n\r\n# INSTALL NODE\r\nRUN curl -sL https:\/\/deb.nodesource.com\/setup_8.x | bash -\r\nRUN apt-get install -y nodejs build-essential\r\nRUN ln -s \/usr\/local\/bin\/node \/usr\/local\/bin\/nodejs\r\n\r\n# INSTALL COMPOSER\r\nRUN apt-get install -y openssl zip unzip git libnss3\r\nRUN curl -sS https:\/\/getcomposer.org\/installer | php -- --install-dir=\/usr\/local\/bin --filename=composer\r\n\r\n# Change www-data user to match the host system UID and GID and chown www directory\r\nRUN usermod --non-unique --uid 1000 www-data \\\r\n  &amp;&amp; groupmod --non-unique --gid 1000 www-data \\\r\n  &amp;&amp; chown -R www-data:www-data \/var\/www\r\n\r\n# Defines that the image will have port 80 to expose\r\nEXPOSE 80\r\n\r\nWORKDIR \/var\/www\/html<\/pre>\n<p>Voc\u00ea deve ter percebido que este arquivo funciona como se fosse um bash script do linux, ele executa basicamente comandos de shell, instala extens\u00f5es do PHP, Node, Composer, configura Apache, e o que mais voc\u00ea precisar.<\/p>\n<p>Se quiser saber mais sobre <strong>Dockerfile<\/strong>, leia a documenta\u00e7\u00e3o oficial:<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/engine\/reference\/builder\/<\/a><\/p>\n<p>Agora, somente para efeitos de teste do servidor, vamos criar o arquivo &#8220;index.php&#8221;.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\nphpinfo();<\/pre>\n<h3><strong>Criando e Executando as Inst\u00e2ncias<\/strong><\/h3>\n<p>J\u00e1 instalamos, j\u00e1 criamos os arquivos, agora s\u00f3 falta fazer a m\u00e1gica acontecer.<\/p>\n<p>Na raiz da pasta onde foram criados os arquivos, execute o comando abaixo para criar uma build das inst\u00e2ncias do MySQL e do PHP:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker-compose build<\/pre>\n<p>Esse comando faz com que o Docker baixe as imagens e execute os comandos do Dockerfile.<\/p>\n<p>Agora, para iniciar as inst\u00e2ncias, execute:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker-compose start<\/pre>\n<p>Isso faz com que o Docker inicie todas as inst\u00e2ncias, e para testar, abra o seu navegador e digite &#8220;localhost&#8221; na barra de endere\u00e7o. Voc\u00ea deve ver uma p\u00e1gina com as configura\u00e7\u00f5es do PHP.<\/p>\n<p>Para interromper todas as inst\u00e2ncias, execute o comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker-compose stop<\/pre>\n<p>Para acessar uma inst\u00e2ncia via <strong>SSH<\/strong>, caso precise fazer configura\u00e7\u00f5es extras, execute o seguinte comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker exec -it php-local bash<\/pre>\n<p>Repare que &#8220;php-local&#8221; \u00e9 o par\u00e2metro &#8220;container_name&#8221; que definimos no arquivo &#8220;docker-compose.yml&#8221;, ent\u00e3o se quiser acessar a inst\u00e2ncia do MySQL, execute:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"atomic\">$ docker exec -it mysql-local bash<\/pre>\n<p>Estas s\u00e3o informa\u00e7\u00f5es absurdamente superficiais sobre a utiliza\u00e7\u00e3o do Docker. Aprender sobre os conceitos e a necessidade de utiliz\u00e1-lo \u00e9 muito importante caso queira seguir como programador, e a minha intens\u00e3o aqui n\u00e3o \u00e9 torn\u00e1-lo um especialista, mas motiv\u00e1-lo a estudar e adquirir este conhecimento.<\/p>\n<p>Espero ter ajudado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando comecei a pesquisar sobre Docker, n\u00e3o consegui encontrar um tutorial que fosse direto ao ponto, para que eu pudesse utilizar em meus projetos. Ent\u00e3o n\u00e3o vou me aprofundar em conceitos, caso queira adquirir um conhecimento mais aprofundado sobre Docker, recomendo que leia a documenta\u00e7\u00e3o oficial no Docker Hub. https:\/\/docs.docker.com\/docker-hub\/ &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[25,1,2],"tags":[],"_links":{"self":[{"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/posts\/407"}],"collection":[{"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/comments?post=407"}],"version-history":[{"count":43,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/posts\/407\/revisions"}],"predecessor-version":[{"id":458,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/posts\/407\/revisions\/458"}],"wp:attachment":[{"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/media?parent=407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/categories?post=407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabianocouto.com.br\/blog\/wp-json\/wp\/v2\/tags?post=407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}