Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Rodando Symfony em Docker containers (SymfonyLi...

Rodando Symfony em Docker containers (SymfonyLive Brazil 2019)

Palestra apresentada dia 17 de maio de 2019 no SymfonyLive Brazil em São Paulo-SP (https://brasil2019.live.symfony.com/speakers). Mostramos o que é o Docker, como funciona e como tirar o melhor proveito dele montando um ambiente para programar aplicações Symfony, dicas do que fazer e o que não fazer.

Wellington F. Silva

May 17, 2019
Tweet

More Decks by Wellington F. Silva

Other Decks in Technology

Transcript

  1. Wellington F. Silva contato: @_wsilva nicks: wsilva, boina, tom, fisi*

    funções: pai, tec. telecom, programador, sysadmin, docker community leader, instrutor, escritor, zend certified engineer e docker certified associate * deprecation in favor of Well
  2. Agenda • O que é Docker • Como funciona •

    Fluxo de trabalho comum • Como usar com Symfony • Dicas
  3. Tipos de Virtualização • Full Virtualization • Partial Virtualization •

    Paravirtualization • OS Level Virtualization Docker
  4. OS Level Virtualization U nix / C hroot BSD FreeBSD

    Jails / Solaris Zones O penVZ Parallels C groups Process C ontainers AIX / W pars LXC D ocker, rkt, cloud foundry, 
 C ontainerD 1982 2000 2005 2006 2007 2008 >= 2013
  5. SERVIDOR SERVIDOR HOST OS HOST OS CONTAINER ENGINE HYPERVISOR BINS/LIBS

    GUEST OS APP GUEST OS BINS/LIBS BINS/LIBS APP APP APP VM VM Container Container Comparando
  6. Diferentes, não excludentes SERVIDOR XEN UBUNTU LINUX DOCKER ENGINE BINS/LIBS

    MYSQL DEBIAN LINUX BINS/LIBS NGINX BINS/LIBS PHP-FPM DOCKER ENGINE WINDOWS 2016 SERVER BINS/LIBS SQL SERVER
  7. Processos • Processo Linux tem ID atribuído (PID) • Podem

    ser listados (com comado ps) dentro do contêiner ou fora (no host)
  8. Processos • Processo Linux tem ID atribuído (PID) • Podem

    ser listados (com comado ps) dentro do contêiner ou fora, no host • Dentro do contêiner o PID=1, fora (no host) vai ter valor alto
  9. Kernel Namespaces • IPC - Interprocess communication • PID -

    Processos • NET- Rede • UTS - Unix timesharing system
  10. Kernel Namespaces • IPC - interprocess communication • PID -

    Processos • NET- rede • UTS - Unix timesharing system • USER - Usuários e grupos
  11. Kernel Namespaces • IPC - interprocess communication • PID -

    Processos • NET- rede • UTS - Unix timesharing system • USER - Usuários e grupos • MNT - Pontos de montagem
  12. CGroups • CPU • Memória • I/O em disco •

    Interface de rede • Hardwares periféricos 
 (pen drives, cameras, etc)
  13. Rootfs • Filesystem é uma hierarquia de diretórios • Rootfs

    é o filesystem base onde os demais sistemas de arquivos são montados
  14. Rootfs • Filesystem é uma hierarquia de diretórios • Rootfs

    é o filesystem base onde os demais sistemas de arquivos são montados • TLDR; é o / (barra) de uma distribuição Linux
  15. Resumo • Processo 
 (é o que roda a aplicação)

    • CGroups e Namespaces 
 (como o processo vai rodar) • Rootfs 
 (onde o processo vai rodar)
  16. Fluxo básico de trabalho com Docker Client Docker Host docker

    run redis docker daemon Contêineres Imagens Registry
  17. Fluxo básico de trabalho com Docker Client Docker Host docker

    run redis docker daemon Contêineres Imagens Registry
  18. Fluxo básico de trabalho com Docker Client Docker Host docker

    run redis docker daemon Contêineres Imagens Registry
  19. Fluxo básico de trabalho com Docker Client Docker Host docker

    run redis docker daemon Contêineres Imagens Registry
  20. Fluxo básico de trabalho com Docker Client Docker Host docker

    run redis docker daemon Contêineres Imagens Registry
  21. LINUX (DOCKER HOST) WINDOWS OSX VM LINUX
 (DOCKER HOST) DOCKER

    CLIENT DOCKER CLIENT VM LINUX
 (DOCKER HOST) DOCKER CLIENT DOCKER DAEMON DOCKER DAEMON DOCKER DAEMON Contêineres Linux
  22. WINDOWS (DOCKER HOST) LINUX OSX VM WINDOWS (DOCKER HOST) DOCKER

    CLIENT DOCKER CLIENT DOCKER CLIENT DOCKER DAEMON DOCKER DAEMON DOCKER DAEMON VM WINDOWS (DOCKER HOST) Contêineres Windows
  23. Imagens DEBIAN ID 9FB9899B593C INSTALL NGINX ID 4ZS73I39RU7Y ADD HTML

    FILES ID 0816EA01673A EXPOSE 80 ID A24C3183E910 ALPINE ID QF7T76UQGN97 INSTALL REDIS ID H932FE3ZF8NQ EXPOSE 6379 ID 7G4FA3T9T8PP
  24. Imagens DEBIAN ID 9FB9899B593C INSTALL NGINX ID 4ZS73I39RU7Y ADD HTML

    FILES ID 0816EA01673A EXPOSE 80 ID A24C3183E910 RUN NGINX ALPINE ID QF7T76UQGN97 INSTALL REDIS ID H932FE3ZF8NQ EXPOSE 6379 ID 7G4FA3T9T8PP RUN REDIS
  25. Imagens DEBIAN ID 9FB9899B593C INSTALL NGINX ID 4ZS73I39RU7Y ADD HTML

    FILES ID 0816EA01673A EXPOSE 80 ID A24C3183E910 RUN NGINX RUN NGINX RUN NGINX
  26. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  27. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  28. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  29. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  30. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  31. Dockerizando minha app Rodando o contêiner $ docker run \


    --name minha-loja \
 --interactive \
 --tty \
 --publish 80:80 \
 ubuntu:18.04 \
 bash
  32. Dockerizando minha app Rodando o contêiner Unable to find image

    'ubuntu:18.04' locally
 16.04: Pulling from library/ubuntu
 9fb6c798fa41: Pull complete
 3b61febd4aef: Pull complete
 9d99b9777eb0: Pull complete
 d010c8cf75d7: Pull complete
 7fac07fb303e: Pull complete
 Digest:sha256:d45655633486615d164808b724b29406c b88e23d9c40ac3aaaa2d69e79e3bd5d
 Status: Downloaded newer image for ubuntu:18.04
 root@8d6ae10736be:/#
  33. Dockerizando minha app Rodando o contêiner Unable to find image

    'ubuntu:18.04' locally
 16.04: Pulling from library/ubuntu
 9fb6c798fa41: Pull complete
 3b61febd4aef: Pull complete
 9d99b9777eb0: Pull complete
 d010c8cf75d7: Pull complete
 7fac07fb303e: Pull complete
 Digest:sha256:d45655633486615d164808b724b29406c b88e23d9c40ac3aaaa2d69e79e3bd5d
 Status: Downloaded newer image for ubuntu:18.04
 root@8d6ae10736be:/#
  34. Dockerizando minha app Rodando o contêiner Unable to find image

    'ubuntu:18.04' locally
 16.04: Pulling from library/ubuntu
 9fb6c798fa41: Pull complete
 3b61febd4aef: Pull complete
 9d99b9777eb0: Pull complete
 d010c8cf75d7: Pull complete
 7fac07fb303e: Pull complete
 Digest:sha256:d45655633486615d164808b724b29406c b88e23d9c40ac3aaaa2d69e79e3bd5d
 Status: Downloaded newer image for ubuntu:18.04
 root@8d6ae10736be:/#
  35. Dockerizando minha app Instalando minha stack root@8d6ae10736be:/# apt-get update \


    && apt-get install -y \
 nginx \
 php7.3 \
 mysql-server \
 redis-server \
 rabbitmq-server
  36. Contêineres • Efêmeros • São processos • Propósito único •

    Imagens leves • Efêmeros • Efêmeros • Efêmeros
  37. Contêineres • Efêmeros • São processos • Propósito único •

    Imagens leves • Efêmeros • Efêmeros • Efêmeros • EFÊMEROS
  38. Iniciando um projeto Com o composer instalado basta rodar o

    seguinte comando. $ composer create-project \
 symfony/skeleton \
 meu-projeto
  39. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  40. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  41. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  42. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  43. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  44. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  45. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  46. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  47. E com Docker? $ docker run --tty --interactive 
 --rm

    --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer \
 create-project \
 symfony/skeleton \
 meu-projeto
  48. E com Docker? • Não precisamos do composer instalado •

    Podemos trocar a versão só mudando a tag da imagem
  49. E com Docker? • Não precisamos do composer instalado •

    Podemos trocar a versão só mudando a tag da imagem • Versões/Tags disponíveis*: 1.8.5, 1.8, 1.7.3, 1.7, 1, 1.8.4, 1.8.3, 1.8.2, 1.8.0, 1.6, 1.6.5, 1.5, 1.5.6, 1.7.2, 1.7.1, 1.7.0, 1.4, 1.4.3, 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.5.5, 1.5.2, 1.5.1, 1.1, 1.1.3, 1.2, 1.2.4, 1.3, 1.3.3, 1.5.0, 1.4.2, 1.4.1, 1.3.2, 1.3.1, 1.3.0, 1.2.3, 1.2.2
 * em maio de 2019
  50. E com Docker? Para ver as tags disponíveis use um

    pouco de bash e jq:
 
 i=0
 while [ $? == 0 ]
 do 
 i=$((i+1))
 curl https://registry.hub.docker.com/v2/ repositories/library/composer/tags/?page=$i 2>/dev/null |jq '."results"[]["name"]'
 done
  51. E com Docker? • Podemos criar um alias e usar

    como comando * em maio de 2019
  52. E com Docker? Criando alias:
 
 $ alias composer='docker run

    --tty \
 --interactive --rm \
 --volume "$PWD":/app \
 --volume $SSH_AUTH_SOCK:/ssh-auth.sock \
 --env SSH_AUTH_SOCK=/ssh-auth.sock \
 --user $(id -u):$(id -g) \
 composer'
  53. E com Docker? Com o alias criado o comando para

    iniciar um novo projeto é o mesmo:
 
 $ composer create-project \
 symfony/skeleton \
 meu-projeto
  54. Suas Imagens Utilizar Dockerfile para construir imagens permite: • Controle

    de versões • Testes • Reutilização de camadas
  55. Suas Imagens Utilizar Dockerfile para construir imagens permite: • Controle

    de versões • Testes • Reutilização de camadas • Debug durante construção
  56. Suas Imagens Utilizar Dockerfile para construir imagens permite: • Controle

    de versões • Testes • Reutilização de camadas • Debug durante construção • Conectar a pipelines de entrega
  57. Suas Imagens Utilizar Dockerfile para construir imagens permite: • Controle

    de versões • Testes • Reutilização de camadas • Debug durante construção • Conectar a pipelines de entrega • Build automatizado
  58. Suas Imagens Boas práticas: • Simplificar, fácil para reconstruir •

    Evitar instalar pacotes que não serão utilizados
  59. Suas Imagens Boas práticas: • Simplificar, fácil para reconstruir •

    Evitar instalar pacotes que não serão utilizados • 1 processo por contêiner
  60. Suas Imagens Boas práticas: • Simplificar, fácil para reconstruir •

    Evitar instalar pacotes que não serão utilizados • 1 processo por contêiner • Quebrar instruções muito grandes em linhas escapando a quebra de linha
  61. Suas Imagens Boas práticas: • Simplificar, fácil para reconstruir •

    Evitar instalar pacotes que não serão utilizados • 1 processo por contêiner • Quebrar instruções muito grandes em linhas escapando a quebra de linha • Minimizar quantidade de camadas
  62. Suas Imagens Boas práticas: • Simplificar, fácil para reconstruir •

    Evitar instalar pacotes que não serão utilizados • 1 processo por contêiner • Quebrar instruções muito grandes em linhas escapando a quebra de linha • Minimizar quantidade de camadas • Manter Dockerfile legível
  63. Builds paralelos A partir da versão 18.09 podemos usar Buildkit

    para construir imagens:
 
 $ export DOCKER_BUILDKIT=1
 $ docker image build -t teste .
  64. Imagens mínimas Baixo footprint, menos vulnerabilidades e menos ataques.
 


    $ docker image ls \
 --format \
 '{{.Repository}} - {{.Size}}' \ 
 | egrep 'alpine|debian|ubuntu|fedora'
 
 debian - 101MB
 ubuntu - 102MB
 alpine - 5.53MB
 fedora - 275MB
  65. Imagens mínimas Baixo footprint, menos vulnerabilidades e menos ataques.
 


    $ docker image ls \
 --format \
 '{{.Repository}} - {{.Size}}' \ 
 | egrep 'alpine|debian|ubuntu|fedora'
 
 debian - 101MB
 ubuntu - 102MB
 alpine - 5.53MB
 fedora - 275MB
  66. Imagens mínimas Baixo footprint, menos vulnerabilidades e menos ataques.
 


    $ docker image ls \
 --format \
 '{{.Repository}} - {{.Size}}' \ 
 | egrep 'alpine|debian|ubuntu|fedora'
 
 debian - 101MB
 ubuntu - 102MB
 alpine - 5.53MB
 fedora - 275MB
  67. Imagens mínimas Baixo footprint, menos vulnerabilidades e menos ataques.
 


    $ docker image ls \
 --format \
 '{{.Repository}} - {{.Size}}' \ 
 | egrep 'alpine|debian|ubuntu|fedora'
 
 debian - 101MB
 ubuntu - 102MB
 alpine - 5.53MB
 fedora - 275MB
  68. Pacotes FROM alpine RUN apk add --update php-fpm RUN rm

    -rf /var/cache/apk/* CMD ["php-fpm7"]
  69. Pacotes FROM alpine RUN apk add --update php-fpm RUN rm

    -rf /var/cache/apk/* CMD ["php-fpm7"] 
 Remover arquivos indesejados na mesma camada onde são baixados / criados.
  70. Pacotes FROM alpine RUN apk add --update php-fpm RUN rm

    -rf /var/cache/apk/* CMD ["php-fpm7"] 
 Remover arquivos indesejados na mesma camada onde são baixados / criados. 
 FROM alpine RUN apk add --update php-fpm && \
 rm -rf /var/cache/apk/* CMD ["php-fpm7"]
  71. Pacotes FROM ALPINE 5.53MB RUN APK ADD --UPDATE PHP-FPM 10.6MB

    RUN RM -RF /VAR/CACHE/APK/* 0B CMD ["PHP-FPM7"] 0B Tamanho total 10.5MB
  72. Pacotes FROM ALPINE 5.53MB RUN APK ADD --UPDATE PHP-FPM &&


    RUN RM -RF /VAR/CACHE/APK/* 9.31MB CMD ["PHP-FPM7"] 0B Tamanho total 9.31MB
  73. Imagens Oficiais • São imagens mantidas pela comunidade testadas e

    aprovadas pela Docker • Possuem scan de vulnerabilidade
  74. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  75. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  76. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  77. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  78. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  79. Imagens Oficiais Rodando com Apache: 
 $ docker run \


    --detach \
 --publish 80:80 \
 --volume "$PWD/meu-projeto":/var/www/ html \
 --volume "$PWD/httpd.conf":/etc/ apache2/sites-enabled/000-default.conf \
 php:7.3-apache
  80. Imagens Oficiais Conteúdo do arquivo apache.conf: <VirtualHost *:80> ServerAdmin webmaster@localhost

    DocumentRoot /var/www/html/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
  81. Imagens Oficiais Conteúdo do arquivo apache.conf: <VirtualHost *:80> ServerAdmin webmaster@localhost

    DocumentRoot /var/www/html/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
  82. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  83. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  84. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  85. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  86. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  87. CLI Scripts Usando php no cli:
 
 $ docker run

    \
 --interactive \
 --tty \
 --rm \
 --volume "$PWD":/app \
 --workdir /app \
 php:7.3-cli \
 php info.php
  88. Built-in Server Usando o PHP built in server:
 
 $

    docker run \
 --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 81:81 \
 php:7.3-cli \
 php -S 0.0.0.0:81
  89. Built-in Server Usando o PHP built in server:
 
 $

    docker run \
 --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 81:81 \
 php:7.3-cli \
 php -S 0.0.0.0:81
  90. Built-in Server Usando o PHP built in server:
 
 $

    docker run \
 --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 81:81 \
 php:7.3-cli \
 php -S 0.0.0.0:81
  91. Built-in Server Usando o server do Symfony
 
 $ cd

    meu-projeto 
 $ composer require server --dev
 $ cd -
 $ docker run --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 8000:8000 \
 php:7.3-cli \
 ./bin/console server:run 0.0.0.0:8000

  92. Built-in Server Usando o server do Symfony
 
 $ cd

    meu-projeto 
 $ composer require server --dev
 $ cd -
 $ docker run --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 8000:8000 \
 php:7.3-cli \
 ./bin/console server:run 0.0.0.0:8000

  93. Built-in Server Usando o server do Symfony
 
 $ cd

    meu-projeto 
 $ composer require server --dev
 $ cd -
 $ docker run --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 8000:8000 \
 php:7.3-cli \
 ./bin/console server:run 0.0.0.0:8000

  94. Built-in Server Usando o server do Symfony
 
 $ cd

    meu-projeto 
 $ composer require server --dev
 $ cd -
 $ docker run --interactive --tty --rm \
 --volume "$PWD/meu-projeto":/app \
 --workdir /app/public \
 --publish 8000:8000 \
 php:7.3-cli \
 ./bin/console server:run 0.0.0.0:8000

  95. PHP-FPM • Podemos usar o web server que quisermos •

    Nginx • Apache • Caddy • Comunicação via socket
  96. PHP-FPM • Podemos usar o web server que quisermos •

    Nginx • Apache • Caddy • Comunicação via socket • TCP Socket • Socket file
  97. PHP-FPM (socket file) Com socket file, temos que montar o

    mesmo arquivo no web server e no php-fpm.
  98. PHP-FPM (socket file) Com socket file, temos que montar o

    mesmo arquivo no web server e no php-fpm. Exemplo de configuração fpm:
  99. PHP-FPM (socket file) [global] daemonize = no [www] listen =

    /var/run/php7-fpm.sock listen.mode = 0666
  100. PHP-FPM (socket file) [global] daemonize = no [www] listen =

    /var/run/php7-fpm.sock listen.mode = 0666
  101. PHP-FPM (socket file) Exemplo de configuração nginx: 
 server {


    root /app/public;
 location / {
 try_files $uri /index.php$is_args$args;
 }
 …
  102. PHP-FPM (socket file) Exemplo de configuração nginx: 
 server {


    root /app/public;
 location / {
 try_files $uri /index.php$is_args$args;
 }
 …
  103. PHP-FPM (socket file) …
 location ~ ^/index\.php(/|$) {
 fastcgi_pass unix:/var/run/php7-fpm.sock;


    fastcgi_split_path_info ^(.+\.php)(/.*)$;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 }
 …
  104. PHP-FPM (socket file) …
 location ~ ^/index\.php(/|$) {
 fastcgi_pass unix:/var/run/php7-fpm.sock;


    fastcgi_split_path_info ^(.+\.php)(/.*)$;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 }
 …
  105. PHP-FPM (socket file) …
 location ~ \.php$ {
 return 404;


    }
 error_log /proc/self/fd/2;
 access_log /proc/self/fd/1;
 }
  106. PHP-FPM (socket file) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  107. PHP-FPM (socket file) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  108. PHP-FPM (socket file) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  109. PHP-FPM (socket file) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  110. PHP-FPM (socket file) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 82:80 \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  111. PHP-FPM (socket file) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 82:80 \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  112. PHP-FPM (socket file) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 82:80 \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  113. PHP-FPM (socket file) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 82:80 \
 --volume "$PWD/meu-projeto":/app \
 --volume phpsocket:/var/run \
 --volume "$PWD/sock-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  114. PHP-FPM (TCP socket) Com tcp socket não precisamos ter o

    arquivo de socket montado em ambos contêineres.
  115. PHP-FPM (TCP socket) Com tcp socket não precisamos ter o

    arquivo de socket montado em ambos contêineres. 
 Mas precisamos nomear o contêiner do PHP-FPM e colocá-lo na mesma rede que o do Nginx
  116. PHP-FPM (TCP socket) Com tcp socket não precisamos ter o

    arquivo de socket montado em ambos contêineres. 
 Mas precisamos nomear o contêiner do PHP-FPM e colocá-lo na mesma rede que o do Nginx
 Exemplo de configuração fpm:
 

  117. PHP-FPM (TCP socket) Exemplo de configuração Nginx: 
 server {


    root /app/public;
 location / {
 try_files $uri /index.php$is_args$args;
 }
 …
  118. PHP-FPM (TCP socket) Exemplo de configuração Nginx: 
 server {


    root /app/public;
 location / {
 try_files $uri /index.php$is_args$args;
 }
 …
  119. PHP-FPM (TCP socket) …
 location ~ ^/index\.php(/|$) {
 fastcgi_pass phpfpm:9000;


    fastcgi_split_path_info ^(.+\.php)(/.*) $;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 }
 …
  120. PHP-FPM (TCP socket) …
 location ~ ^/index\.php(/|$) {
 fastcgi_pass phpfpm:9000;


    fastcgi_split_path_info ^(.+\.php)(/.*) $;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 }
 …
  121. PHP-FPM (TCP socket) …
 location ~ \.php$ {
 return 404;


    }
 error_log /proc/self/fd/2;
 access_log /proc/self/fd/1;
 }
  122. PHP-FPM (TCP socket) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --name phpfpm \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  123. PHP-FPM (TCP socket) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --name phpfpm \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  124. PHP-FPM (TCP socket) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --name phpfpm \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  125. PHP-FPM (TCP socket) Rodando o contêiner do php-fpm:
 $ docker

    run -d \
 --name phpfpm \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-fpm.conf":/usr/ local/etc/php-fpm.d/zz-docker.conf \
 php:7.3-fpm
  126. PHP-FPM (TCP socket) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 83:80 \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  127. PHP-FPM (TCP socket) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 83:80 \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  128. PHP-FPM (TCP socket) Rodando o contêiner do Nginx:
 $ docker

    run -d -p 83:80 \
 --network phpsocket \
 --volume "$PWD/meu-projeto":/app \
 --volume "$PWD/tcp-nginx.conf":/etc/ nginx/conf.d/default.conf \
 nginx
  129. Rootless Podemos adicionar um usuário: 
 FROM alpine RUN addgroup

    -g 82 -S www-data \ && adduser -u 82 -D -S -G www-data \ www-data RUN apk add --update php-fpm \ && rm -rf /var/cache/apk/* ADD rootless.conf /etc/php7/php-fpm.d/www.conf USER www-data CMD ["php-fpm7"]
  130. Rootless Podemos adicionar um usuário. 
 FROM alpine RUN addgroup

    -g 82 -S www-data \ && adduser -u 82 -D -S -G www-data \ www-data RUN apk add --update php-fpm \ && rm -rf /var/cache/apk/* ADD rootless.conf /etc/php7/php-fpm.d/www.conf USER www-data CMD ["php-fpm7"]
  131. Rootless Ou podemos rodar como nobody. FROM alpine RUN apk

    add --update php-fpm \ && rm -rf /var/cache/apk/* ADD rootless.conf /etc/php7/php-fpm.d/ www.conf USER nobody CMD ["php-fpm7"]
  132. Rootless Ou podemos rodar como nobody. FROM alpine RUN apk

    add --update php-fpm \ && rm -rf /var/cache/apk/* ADD rootless.conf /etc/php7/php-fpm.d/ www.conf USER nobody CMD ["php-fpm7"]
  133. Rootless Atenção a problemas com permissão e ownership por causa

    dos usuários sem privilégios. Sugestão de arquivo de configuração (rootless.conf):
  134. Rootless [global] daemonize = no error_log = /proc/self/fd/2 [www] listen

    = 9000 access.log = /proc/self/fd/1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 catch_workers_output = yes
  135. Rootless [global] daemonize = no error_log = /proc/self/fd/2 [www] listen

    = 9000 access.log = /proc/self/fd/1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 catch_workers_output = yes
  136. Rootless [global] daemonize = no error_log = /proc/self/fd/2 [www] listen

    = 9000 access.log = /proc/self/fd/1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 catch_workers_output = yes
  137. Rootless [global] daemonize = no error_log = /proc/self/fd/2 [www] listen

    = 9000 access.log = /proc/self/fd/1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 catch_workers_output = yes
  138. Rootless [global] daemonize = no error_log = /proc/self/fd/2 [www] listen

    = 9000 access.log = /proc/self/fd/1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 catch_workers_output = yes
  139. Adicionando extensões Para extensões do core • instalamos as dependências

    • usamos os scripts de ajuda (docker-php-ext- configure e docker-php-ext-install)
  140. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libbz2-dev \
 libmysqlclient-dev libsasl2-dev

    \
 curl git libfreetype6-dev libicu-dev \
 libjpeg-dev libmcrypt-dev \
 libpng12-dev \
 libpq-dev libxml2-dev" \ ...
  141. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libbz2-dev \
 libmysqlclient-dev libsasl2-dev

    \
 curl git libfreetype6-dev libicu-dev \
 libjpeg-dev libmcrypt-dev \
 libpng12-dev \
 libpq-dev libxml2-dev" \ ...
  142. Suas Imagens ... && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \


    && apt-get install -y $deps \
 && docker-php-ext-install -j$(nproc) \
 bcmath bz2 calendar iconv intl \
 mbstring mcrypt mysqli opcache \
 pdo_mysql pdo_pgsql pgsql soap zip \
 && docker-php-ext-configure gd \
 --with-freetype-dir=/usr/include/ \ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ ...
  143. Suas Imagens ... && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \


    && apt-get install -y $deps \
 && docker-php-ext-install -j$(nproc) \
 bcmath bz2 calendar iconv intl \
 mbstring mcrypt mysqli opcache \
 pdo_mysql pdo_pgsql pgsql soap zip \
 && docker-php-ext-configure gd \
 --with-freetype-dir=/usr/include/ \ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ ...
  144. Suas Imagens ... && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \


    && apt-get install -y $deps \
 && docker-php-ext-install -j$(nproc) \
 bcmath bz2 calendar iconv intl \
 mbstring mcrypt mysqli opcache \
 pdo_mysql pdo_pgsql pgsql soap zip \
 && docker-php-ext-configure gd \
 --with-freetype-dir=/usr/include/ \ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ ...
  145. Suas Imagens ... && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \


    && apt-get install -y $deps \
 && docker-php-ext-install -j$(nproc) \
 bcmath bz2 calendar iconv intl \
 mbstring mcrypt mysqli opcache \
 pdo_mysql pdo_pgsql pgsql soap zip \
 && docker-php-ext-configure gd \
 --with-freetype-dir=/usr/include/ \ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ ...
  146. Suas Imagens Para extensões PECL • instalamos as dependências •

    instalamos o pacote via PECL • habilitamos com o script de ajuda (docker-php- ext-enable)
  147. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libmemcached-dev \
 libmemcachedutil2 zlib1g-dev"

    \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
 && apt-get install -y $deps \ && pecl install igbinary redis \
 memcached xdebug \
 ...
  148. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libmemcached-dev \
 libmemcachedutil2 zlib1g-dev"

    \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
 && apt-get install -y $deps \ && pecl install igbinary redis \
 memcached xdebug \
 ...
  149. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libmemcached-dev \
 libmemcachedutil2 zlib1g-dev"

    \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
 && apt-get install -y $deps \ && pecl install igbinary redis \
 memcached xdebug \
 ...
  150. Suas Imagens Ex.: FROM php:7.3-fpm RUN deps="libmemcached-dev \
 libmemcachedutil2 zlib1g-dev"

    \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
 && apt-get install -y $deps \ && pecl install igbinary redis \
 memcached xdebug \
 ...
  151. Suas Imagens ...
 && docker-php-ext-enable igbinary \
 redis memcached xdebug

    \
 && apt-get purge -y \
 --auto-remove $deps \
 && rm -r /var/lib/apt/lists/*
  152. Suas Imagens ...
 && docker-php-ext-enable igbinary \
 redis memcached xdebug

    \
 && apt-get purge -y \
 --auto-remove $deps \
 && rm -r /var/lib/apt/lists/*
  153. Suas Imagens Demais extensões é melhor fazer manualmente: • wget

    ou curl pacote • phpize • ./configure • make j$(nproc) • make install E depois utilizar o docker-php-ext-enable para habilitar a extensão.
  154. Configurando XDebug Gotchas: • O XDebug precisa conectar na porta

    9000 do host (contêiner => host) • Se estiver utilizando TCP Socket a porta 9000 (padrão) do php-fpm já vai estar sendo usada
  155. Configurando XDebug Gotchas: • O XDebug precisa conectar na porta

    9000 do host (contêiner => host) • Se estiver utilizando TCP Socket a porta 9000 (padrão) do php-fpm já vai estar sendo usada • Podemos mudar para socket file ou utilizar outra porta para o fpm (ie. 9009)
  156. Configurando XDebug Gotchas: • O XDebug precisa conectar na porta

    9000 do host (contêiner => host) • Se estiver utilizando TCP Socket a porta 9000 (padrão) do php-fpm já vai estar sendo usada • Podemos mudar para socket file ou utilizar outra porta para o fpm (ie. 9009) • Devemos configurar o path remoto em nosso IDE
  157. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1

  158. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp

  159. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
 xdebug.remote_port=9000
  160. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
  161. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
 xdebug.remote_connect_back=0
  162. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
 xdebug.remote_connect_back=0
 xdebug.idekey=docker
  163. Configurando XDebug Para habilitar devemos colocar as seguintes configs no

    xdebug.ini zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
 xdebug.remote_connect_back=0
 xdebug.idekey=docker
 xdebug.remote_host=host.docker.internal
  164. Configurando XDebug Sublime Text • Instalar o package XDebug Client

    • Gravar pasta como projeto • Abrir arquivo gerado (nome.sublime-project) • Adicionar xdebug settings conforme modelo:

  165. Configurando XDebug "folders": [ ... ], "settings": { "xdebug": {

    "url": "http://localhost:8080/", "path_mapping": { "/app" : ".", }
 }
 }
  166. Configurando XDebug Visual Code • Instalar extensão php-debug • Acionar

    menu Debug => Open configurations • Adicionar as seguintes linhas abaixo da definição da porta 9000
  167. Configurando XDebug "configurations": [ { "name": "Listen for "type": "php",

    "request": "launch", "port": 9000, "serverSourceRoot": "/app", "localSourceRoot": "${workspaceRoot}" },
  168. Configurando XDebug "configurations": [ { "name": "Listen for "type": "php",

    "request": "launch", "port": 9000, "serverSourceRoot": "/app", "localSourceRoot": "${workspaceRoot}" },
  169. Configurando XDebug "folders": [ { "path": "." } ], "settings":

    { "xdebug": { "url": "http://localhost:8080/",
 }
 }
  170. Configurando XDebug PHP Storm • Em Preferences => Languages&Frameworks =>

    PHP => Servers, criar novo server • Definir o host, a porta e o debugger (XDebug) • Ativar path mapping • Mapear a pasta raiz do projeto para a pasta dentro do contêiner (/app)
  171. Configurando XDebug PHP Storm • Em Run => Edit configurations

    criar novo PHP Remote Debug • Usar o server criado anteriormente e definir o ide key como Docker
  172. Configurando XDebug PHP Storm • Ir em Run => Debug

    Docker • Abrir página no navegador e debugar
  173. Multi-Stage Build • A partir da versão 17.05 • Permite

    construir imagem com base em estágios
  174. Multi-Stage Build • A partir da versão 17.05 • Permite

    construir imagem com base em estágios • Podemos reutilizar arquivos entre estágios
  175. Multi-Stage Build • A partir da versão 17.05 • Permite

    construir imagem com base em estágios • Podemos reutilizar arquivos entre estágios • Podemos escolher parar o build em um estágio específico
  176. Multi-Stage Build FROM php:7-alpine as dev
 COPY --from=composer /usr/bin/composer /usr/bin/

    composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --dev
 
 FROM php:7-alpine as prod
 COPY --from=composer /usr/bin/composer /usr/bin/ composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --no-ansi --no-dev --no- interaction --no-progress --no-scripts --optimize- autoloader
  177. Multi-Stage Build FROM php:7-alpine as dev
 COPY --from=composer /usr/bin/composer /usr/bin/

    composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --dev
 
 FROM php:7-alpine as prod
 COPY --from=composer /usr/bin/composer /usr/bin/ composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --no-ansi --no-dev --no- interaction --no-progress --no-scripts --optimize- autoloader
  178. Multi-Stage Build FROM php:7-alpine as dev
 COPY --from=composer /usr/bin/composer /usr/bin/

    composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --dev
 
 FROM php:7-alpine as prod
 COPY --from=composer /usr/bin/composer /usr/bin/ composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --no-ansi --no-dev --no- interaction --no-progress --no-scripts --optimize- autoloader
  179. Multi-Stage Build FROM php:7-alpine as dev
 COPY --from=composer /usr/bin/composer /usr/bin/

    composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --dev
 
 FROM php:7-alpine as prod
 COPY --from=composer /usr/bin/composer /usr/bin/ composer
 ADD . /app/
 WORKDIR /app
 RUN composer install --no-ansi --no-dev --no- interaction --no-progress --no-scripts --optimize- autoloader
  180. Multi-Stage Build Mesmo Dockerfile podemos gerar 2 imagens $ docker

    image build -t dev --target dev .
 $ docker image build -t prod .
  181. Multi-Stage Build Mesmo Dockerfile podemos gerar 2 imagens $ docker

    image build -t dev --target dev .
 $ docker image build -t prod .
  182. Docker Compose nginx:
 image: nginx:latest
 ports:
 - "8080:80"
 volumes:
 -

    .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 links:
 - php php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  183. Docker Compose nginx:
 image: nginx:latest
 ports:
 - "8080:80"
 volumes:
 -

    .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 links:
 - php php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  184. Docker Compose nginx:
 image: nginx:latest
 ports:
 - "8080:80"
 volumes:
 -

    .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 links:
 - php php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  185. Docker Compose server { index index.php index.html; server_name localhost; error_log

    /proc/self/fd/2; access_log /proc/self/fd/1; root /app; location ~ \.php$ { ... } }
  186. Docker Compose server { index index.php index.html; server_name localhost; error_log

    /proc/self/fd/2; access_log /proc/self/fd/1; root /app; location ~ \.php$ { ... } }
  187. Docker Compose server { index index.php index.html; server_name localhost; error_log

    /proc/self/fd/2; access_log /proc/self/fd/1; root /app; location ~ \.php$ { ... } }
  188. Docker Compose server { index index.php index.html; server_name localhost; error_log

    /proc/self/fd/2; access_log /proc/self/fd/1; root /app; location ~ \.php$ { ... } }
  189. Docker Compose try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+) $; fastcgi_pass php:9000;

    fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info;
  190. Docker Compose try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+) $; fastcgi_pass php:9000;

    fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info;
  191. Docker Compose Dicas • Definindo uma rede não é necessário

    o link • Versões mais atuais do compose file cria uma rede default
  192. Docker Compose version: "3.3"
 services:
 nginx:
 image: nginx:latest
 ports:
 -

    "8080:80"
 volumes:
 - .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  193. Docker Compose version: "3.3"
 services:
 nginx:
 image: nginx:latest
 ports:
 -

    "8080:80"
 volumes:
 - .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  194. Docker Compose version: "3.3"
 services:
 nginx:
 image: nginx:latest
 ports:
 -

    "8080:80"
 volumes:
 - .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  195. Docker Compose version: "3.3"
 services:
 nginx:
 image: nginx:latest
 ports:
 -

    "8080:80"
 volumes:
 - .:/app
 - ./site.conf:/etc/nginx/conf.d/ default.conf
 php:
 image: php:7.3-fpm
 volumes:
 - .:/app
  196. Docker Compose $ docker-compose up -d
 Creating network "meu-projeto_default" with

    the default driver
 Creating meu-projeto_php_1 ...
 Creating meu-projeto_nginx_1 ...
 Creating meu-projeto_php_1 
 Creating meu-projeto_nginx_1 ... done
  197. Docker Compose version: "3.3"
 services:
 ...
 mysql:
 image: mysql
 ports:


    - "3306:3306" environment:
 MYSQL_ROOT_PASSWORD: senha
  198. Docker Compose version: "3.3"
 services:
 ...
 redis:
 image: redis
 deploy:

    replicas: 7 update_config:
 parallelism: 2
 replay: 10s
  199. Docker Compose Num cluster Swarm usamos o mesmo docker- compose.yml:

    $ docker stack deploy \ --compose-file docker-compose.yml \ meu-projeto
  200. Grato • Telegrams: 
 https://t.me/SymfonyBrasil
 https://t.me/dockerbr • Slacks:
 http://bit.ly/docker-slack
 http://dockr.ly/community


    https://bit.ly/ vemproslackphpsp • Meetup:
 http://bit.ly/meetup- docker-sp
 https://www.meetup.com/ pt-BR/php-sp/