Desenvolvendo para WordPress
com Docker, Git e WP-CLI
Como construir um ambiente de desenvolvimento
inteligente para um workflow mais prático e ágil
Rudá Almeida
Integrante da equipe de Tecnologia da
Informação da UFRJ
Entusiasta do WordPress e integrante
da comunidade carioca
Já palestrei e ajudei a organizar
Meetups e WordCamps no Rio de Janeiro
WP-CLI
Um verdadeiro canivete suíço
para o WordPress
O que é
Gerencia o WordPress via linha de comando
Simplifica tarefas tediosas e repetitivas
Dispensa o uso do navegador
Automação e programabilidade
Vamos ver alguns exemplos?
Instalando o WordPress “do zero”
$ wp core download
$ wp core config --dbname=wordpress --dbuser=root --
dbpass=wordpress
$ wp db create
$ wp core install --url=localhost --title=WordCamp --
admin_user=admin --admin_password=admin --
admin_email=admin@example.com --skip-email
Gerenciando usuários
$ wp user list
$ wp user update <usuario> --user_pass=<senha>
$ wp user create <username> <email> --role=administrator --
user_pass=<senha>
$ wp user delete <user>
$ wp plugin list
$ wp plugin install advanced-custom-fields --activate
Instalando plugins
Atualizando o core e os plugins
$ wp core update
$ wp plugin update --all
$ wp theme update --all
Para saber mais sobre WP-CLI
“Dominando o WP-CLI”,
Gustavo Bordoni - WordPress
Meetup RJ de junho de 2016
“WP-CLI: o WordPress na linha
de comando”, Rodrigo Primo” -
InterConWP 2014
“Gerenciando o WordPress com
o WP-CLI”, Rodrigo Primo” -
WordCamp BH 2014
Git
git commit -m "#WCRJ16"
git push
O que é
Sistema de controle de versionamento
Guarda histórico das alterações nos arquivos
Permite “voltar no tempo” a pontos específicos
Permite colaboração entre um time
Descentralizado
Git é uma skill essencial para todo
desenvolvedor WordPress
Git é uma skill essencial para todo
desenvolvedor PHP
Git é uma skill essencial para todo
desenvolvedor back-end
Git é uma skill essencial para todo
desenvolvedor front-end
Git é uma skill essencial para todo
desenvolvedor
Exemplo (extremamente!) básico de Git
$ git init
$ git add .
$ git commit -m "initial commit"
(...algumas alterações aqui…)
$ git add .
$ git commit -m "descrição do que mudou"
$ git log
Github
Git Cheat Sheet
Git não é backup!
Git não é backup!
Git não é backup!
Para saber mais sobre Git
Uma das 76 mil questões com
a tag “Git” no Stack Overflow
O livro “Pro Git”, de Scott
Chacon e Ben Straub
O curso interativo “Try Git”,
parceria entre Code School e
Github (gratuito)
Docker
É igual uma máquina virtual, só
que é completamente diferente.
O que é
Plataforma de virtualização baseada em
contêineres
Extremamente rápido e leve em tamanho e uso
de recursos
Modular e extensível
Replicabilidade e comportamento previsível
Versatilidade: a configuração do ambiente de
desenvolvimento não fica mais presa à
configuração da máquina local
Garantia de que desenvolvimento e produção
possuem ambientes idênticos
Atualizações de pacotes na máquina local não
causam interferência no ambiente de
desenvolvimento.
Simplifica subir ambientes complexos em
poucos comandos.
Estrutura básica da plataforma Docker
Build? Pull? Run?
Imagem? Contêiner? Dockerfile?
Keep calm e lembre do bolo
Imagem => Bolo
Dockerfile => Receita do bolo
Contêiner => Fatia do bolo
Registry / Docker Hub => Padaria
Docker build => Fazer um bolo
Docker pull => Comprar pronto
Docker run => Cortar uma fatia
Imagem: Freepik
Docker Hub
Instanciando um WordPress em contêineres
$ docker pull mysql:5.7.14
$ docker pull wordpress:4.5.1
$ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e
MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql -p 80:80 -d
wordpress:4.5.1
Usando um tema na sua máquina local
$ docker pull mysql:5.7.14
$ docker pull wordpress:4.5.1
$ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e
MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql --volume
/home/user/tema:/var/www/html/wp-content/themes/meutema -p 80:80 -
d wordpress:4.5.1
Importando um projeto já existente
$ docker pull mysql:5.7.14
$ docker pull wordpress:4.5.1
$ docker run --name wp-db --
volume=/home/ruda/Projetos/wordcamp/database/import:/docker
-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=wordpress -e
MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql --
volume=/home/ruda/Projetos/wordcamp/wp-
content:/var/www/html/wp-content -p 80:80 -d
wordpress:4.5.1
...mas e o WP-CLI?
A peça que faltava
$ git clone git@github.com:DockerDemos/appstack-wpcli.git
$ docker build -t wpcli appstack-wpcli
$ docker run --rm --link wp-db:mysql --volumes-from wp -w
/var/www/html -it wpcli wp --allow-root <comando do wp-cli>
Vamos simplificar mais um pouco!
Um atalho para o WP-CLI dockerizado
#!/bin/bash
docker run --rm --link "${1}"-db:mysql --volumes-from "${1}" -
w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root
"${@:2}"
DICAS
A imagem oficial do WordPress vem com opcache ativado.
Alterações em arquivos PHP demoram até 60 segundos para ser
reconhecidas. Para desativar o opcache, edite o arquivo
/usr/local/etc/php/conf.d/opcache-recommended.ini
Contêineres perdem seus dados ao serem encerrados. Para
garantir a permanência dos dados, use contêineres de
volume, ou volumes da máquina hospedeira com --volume
Ao usar volumes, preste atenção às permissões das pastas e
arquivos do host. Se o host usar SELinux, use ":z" no final
dos caminhos.
Para rodar um contêiner em background, use -d
Para visualizar os logs de um contêiner em background, use:
docker logs -f <container>
Para ter acesso ao terminal dentro de um contêiner:
docker exec -it <container> bash
Deixe a porta do contêiner MySQL visível para o host, dessa
forma o MySQL WorkBench ou o adminer podem
manipular os dados diretamente
Contêineres não são apagados ao ter sua execução
interrompida (a menos que executados com a opção --rm),
e devem ser apagados manualmente.
Se já existir um contêiner com o mesmo nome, o Docker se
recusa a criar um novo contêiner.
Se um contêiner estiver em execução, deve ser parado
manualmente para poder ser excluído.
Se ocorrer um erro na criação do conteiner, ele deve ser
excluido manualmente assim mesmo
Docker
Compose
...ou: decorar comandos pra quê?
O que é
Controla e gerencia instâncias de contêineres com base em arquivos de
configuração.
Cuida das tarefas de iniciar, reiniciar, manter executando, parar a execução,
remover, e criar novamente cada contêiner
Detecta alterações nos arquivos de configuração e recria apenas o que for necessário
docker-compose up -d
Docker-compose down
docker-compose.yml
version: '2'
services:
database:
image: mysql:5.7.14
ports:
- "3306:3306"
volumes:
- "./database/import:/docker-entrypoint-
initdb.d:Z"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- database
image: wordpress:4.5.1
links:
- database:mysql
ports:
- "80:80"
volumes:
- "./tema:/var/www/html/wp-
content/themes/meutema:z"
- "./arquivos:/var/www/html/wp-content:z"
restart: always
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_PASSWORD: wordpress
Melhorando o atalho do WP-CLI
#!/bin/bash
docker run --rm --net="${1}"_default --link
"${1}"_database_1:mysql --volumes-from "${1}"_wordpress_1 -
w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root
"${@:2}"
Para saber mais sobre Docker
PERGUNTAS ?

Desenvolvendo para WordPress com Docker, Git e WP-CLI

  • 1.
    Desenvolvendo para WordPress comDocker, Git e WP-CLI Como construir um ambiente de desenvolvimento inteligente para um workflow mais prático e ágil
  • 2.
    Rudá Almeida Integrante daequipe de Tecnologia da Informação da UFRJ Entusiasta do WordPress e integrante da comunidade carioca Já palestrei e ajudei a organizar Meetups e WordCamps no Rio de Janeiro
  • 3.
    WP-CLI Um verdadeiro canivetesuíço para o WordPress
  • 4.
    O que é Gerenciao WordPress via linha de comando Simplifica tarefas tediosas e repetitivas Dispensa o uso do navegador Automação e programabilidade
  • 5.
  • 6.
    Instalando o WordPress“do zero” $ wp core download $ wp core config --dbname=wordpress --dbuser=root -- dbpass=wordpress $ wp db create $ wp core install --url=localhost --title=WordCamp -- admin_user=admin --admin_password=admin -- admin_email=admin@example.com --skip-email
  • 7.
    Gerenciando usuários $ wpuser list $ wp user update <usuario> --user_pass=<senha> $ wp user create <username> <email> --role=administrator -- user_pass=<senha> $ wp user delete <user>
  • 8.
    $ wp pluginlist $ wp plugin install advanced-custom-fields --activate Instalando plugins
  • 9.
    Atualizando o coree os plugins $ wp core update $ wp plugin update --all $ wp theme update --all
  • 10.
    Para saber maissobre WP-CLI “Dominando o WP-CLI”, Gustavo Bordoni - WordPress Meetup RJ de junho de 2016 “WP-CLI: o WordPress na linha de comando”, Rodrigo Primo” - InterConWP 2014 “Gerenciando o WordPress com o WP-CLI”, Rodrigo Primo” - WordCamp BH 2014
  • 11.
    Git git commit -m"#WCRJ16" git push
  • 12.
    O que é Sistemade controle de versionamento Guarda histórico das alterações nos arquivos Permite “voltar no tempo” a pontos específicos Permite colaboração entre um time Descentralizado
  • 13.
    Git é umaskill essencial para todo desenvolvedor WordPress
  • 14.
    Git é umaskill essencial para todo desenvolvedor PHP
  • 15.
    Git é umaskill essencial para todo desenvolvedor back-end
  • 16.
    Git é umaskill essencial para todo desenvolvedor front-end
  • 17.
    Git é umaskill essencial para todo desenvolvedor
  • 18.
    Exemplo (extremamente!) básicode Git $ git init $ git add . $ git commit -m "initial commit" (...algumas alterações aqui…) $ git add . $ git commit -m "descrição do que mudou" $ git log
  • 19.
  • 20.
  • 21.
    Git não ébackup!
  • 22.
    Git não ébackup!
  • 23.
    Git não ébackup!
  • 24.
    Para saber maissobre Git Uma das 76 mil questões com a tag “Git” no Stack Overflow O livro “Pro Git”, de Scott Chacon e Ben Straub O curso interativo “Try Git”, parceria entre Code School e Github (gratuito)
  • 25.
    Docker É igual umamáquina virtual, só que é completamente diferente.
  • 26.
    O que é Plataformade virtualização baseada em contêineres Extremamente rápido e leve em tamanho e uso de recursos Modular e extensível Replicabilidade e comportamento previsível Versatilidade: a configuração do ambiente de desenvolvimento não fica mais presa à configuração da máquina local Garantia de que desenvolvimento e produção possuem ambientes idênticos Atualizações de pacotes na máquina local não causam interferência no ambiente de desenvolvimento. Simplifica subir ambientes complexos em poucos comandos.
  • 27.
    Estrutura básica daplataforma Docker
  • 28.
    Build? Pull? Run? Imagem?Contêiner? Dockerfile?
  • 29.
    Keep calm elembre do bolo Imagem => Bolo Dockerfile => Receita do bolo Contêiner => Fatia do bolo Registry / Docker Hub => Padaria Docker build => Fazer um bolo Docker pull => Comprar pronto Docker run => Cortar uma fatia Imagem: Freepik
  • 30.
  • 31.
    Instanciando um WordPressem contêineres $ docker pull mysql:5.7.14 $ docker pull wordpress:4.5.1 $ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14 $ docker run --name wp --link wp-db:mysql -p 80:80 -d wordpress:4.5.1
  • 32.
    Usando um temana sua máquina local $ docker pull mysql:5.7.14 $ docker pull wordpress:4.5.1 $ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14 $ docker run --name wp --link wp-db:mysql --volume /home/user/tema:/var/www/html/wp-content/themes/meutema -p 80:80 - d wordpress:4.5.1
  • 33.
    Importando um projetojá existente $ docker pull mysql:5.7.14 $ docker pull wordpress:4.5.1 $ docker run --name wp-db -- volume=/home/ruda/Projetos/wordcamp/database/import:/docker -entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14 $ docker run --name wp --link wp-db:mysql -- volume=/home/ruda/Projetos/wordcamp/wp- content:/var/www/html/wp-content -p 80:80 -d wordpress:4.5.1
  • 34.
    ...mas e oWP-CLI?
  • 35.
    A peça quefaltava $ git clone git@github.com:DockerDemos/appstack-wpcli.git $ docker build -t wpcli appstack-wpcli $ docker run --rm --link wp-db:mysql --volumes-from wp -w /var/www/html -it wpcli wp --allow-root <comando do wp-cli>
  • 36.
  • 37.
    Um atalho parao WP-CLI dockerizado #!/bin/bash docker run --rm --link "${1}"-db:mysql --volumes-from "${1}" - w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root "${@:2}"
  • 38.
  • 39.
    A imagem oficialdo WordPress vem com opcache ativado. Alterações em arquivos PHP demoram até 60 segundos para ser reconhecidas. Para desativar o opcache, edite o arquivo /usr/local/etc/php/conf.d/opcache-recommended.ini
  • 40.
    Contêineres perdem seusdados ao serem encerrados. Para garantir a permanência dos dados, use contêineres de volume, ou volumes da máquina hospedeira com --volume Ao usar volumes, preste atenção às permissões das pastas e arquivos do host. Se o host usar SELinux, use ":z" no final dos caminhos.
  • 41.
    Para rodar umcontêiner em background, use -d Para visualizar os logs de um contêiner em background, use: docker logs -f <container>
  • 42.
    Para ter acessoao terminal dentro de um contêiner: docker exec -it <container> bash
  • 43.
    Deixe a portado contêiner MySQL visível para o host, dessa forma o MySQL WorkBench ou o adminer podem manipular os dados diretamente
  • 44.
    Contêineres não sãoapagados ao ter sua execução interrompida (a menos que executados com a opção --rm), e devem ser apagados manualmente.
  • 45.
    Se já existirum contêiner com o mesmo nome, o Docker se recusa a criar um novo contêiner. Se um contêiner estiver em execução, deve ser parado manualmente para poder ser excluído. Se ocorrer um erro na criação do conteiner, ele deve ser excluido manualmente assim mesmo
  • 46.
  • 47.
    O que é Controlae gerencia instâncias de contêineres com base em arquivos de configuração. Cuida das tarefas de iniciar, reiniciar, manter executando, parar a execução, remover, e criar novamente cada contêiner Detecta alterações nos arquivos de configuração e recria apenas o que for necessário docker-compose up -d Docker-compose down
  • 48.
    docker-compose.yml version: '2' services: database: image: mysql:5.7.14 ports: -"3306:3306" volumes: - "./database/import:/docker-entrypoint- initdb.d:Z" restart: always environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - database image: wordpress:4.5.1 links: - database:mysql ports: - "80:80" volumes: - "./tema:/var/www/html/wp- content/themes/meutema:z" - "./arquivos:/var/www/html/wp-content:z" restart: always environment: WORDPRESS_DB_HOST: database:3306 WORDPRESS_DB_PASSWORD: wordpress
  • 49.
    Melhorando o atalhodo WP-CLI #!/bin/bash docker run --rm --net="${1}"_default --link "${1}"_database_1:mysql --volumes-from "${1}"_wordpress_1 - w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root "${@:2}"
  • 50.
    Para saber maissobre Docker
  • 51.

Notas do Editor

  • #7 Com apenas quatro comandos, o WP-CLI: baixa e descompacta o core do WordPress, cria e popula o arquivo wp-config.php, cria o banco de dados no MySQL e preenche os dados de instalação. Não é preciso nem abrir o navegador: o WordPress já está instalado, com o seu famoso post de “Hello World”.
  • #9 Nos comandos ao lado, o WP-CLI lista os plugins, baixa o plugin “Advanced Custom Fields” do repositório oficial, instala este plugin, depois ativa e finalmente mostra o novo plugin na lista de plugins instalados.
  • #10 Nos comandos ao lado, o WP-CLI atualiza o core do WordPress e depois verifica entre os plugins instalados quais estão desatualizados e faz a sua atualização. Os downloads são feitos do repositório oficial.