Jorge Salamero - @bencerillo
Wordcamp Zaragoza 2019
Wordpress y Docker
de desarrollo a producción
Jorge Salamero
container gamer @ Sysdig
github.com/bencer
@bencerillo
OSS fan
Containers, DevOps, IoT/home-automation, motorsport
Sobre mi:
Agenda.
- Docker para dummies.
- Wordpress en Docker.
- Desarrollo.
- Mudanza a producción.
¿Qué es Docker?.
Contenedores y Docker.
- Contenedor: virtualización ligera.
- Portabilidad.
- Automatización.
- Seguridad.
- Nuevos procesos.
Instalar Docker.
¿Cómo funciona?
Comandos.
$ docker start <container name>
$ docker stop <container name>
$ docker rm <container name>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
14649c5b7e9a mariadb:latest "/docker-entrypoint.s" 12 seconds ago Up 12 seconds
3306/tcp wordpressdb
$ docker exec -ti <container name> /bin/bash
$ (I’m inside!)
Dockerfile.
FROM php:5.6.30-fpm-alpine
RUN apk update && apk add build-base
RUN docker-php-ext-configure mysql
RUN curl -o wordpress.tar.gz http://wordpress.org/latest.tar.gz
RUN tar -xzvf wordpress.tar.gz --strip-components=1 --directory /var/www/html/
RUN rm wordpress.tar.gz
Docker build y run.
$ ls Dockerfile
Dockerfile
$ docker build -t "wordpress" .
...
Successfully built 0b388013905e
...
$ docker run -d -p 8080:80 -t wordpress
6da59c864d35bb0bb6043c09eb8b1128b2c1cb91f7fa456156df4a0a22f271b0
Wordpress en Docker.
Wordpress en Docker.
$ docker run -e MYSQL_ROOT_PASSWORD=<password> -e
MYSQL_DATABASE=wordpress --name wordpressdb -v
"$PWD/database":/var/lib/mysql -d mariadb:latest
$ docker run -e WORDPRESS_DB_PASSWORD=<password> --name
wordpress --link wordpressdb:mysql -p 80:80 -v
"$PWD/html":/var/www/html -d wordpress
docker-compose.yml.
version: '3'
services:
db:
[...]
wordpress:
[...]
volumes:
db_data:
docker-compose: MySQL.
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: password
docker-compose: Wordpress.
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
volumes:
- ./wp-content/:/var/www/html/wp-content
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: password
Comandos.
$ docker-compose up -d
$ docker-compose ps
$ docker-compose kill <container name>
$ docker-compose logs <container name>
$ docker-compose exec <container name> /bin/bash
$ (I’m inside!)
wp-local-docker.
wp-local-docker: todo en 1.
- Wordpress y MSQL.
- Múltiples entornos.
- Extras: Memcached, Elasticsearch.
- Herramientas: wpsnapshots, wp-cli, phpmyadmin,
phpmemcachedadmin, mailcatcher.
wp-local-docker:
$ 10updocker create
What is the primary hostname for your site? (Ex: docker.test) meioliver.com
? Are there additional domains the site should respond to? No
? What version of PHP would you like to use? 7.2
? Do you need Elasticsearch No
? Do you want to install WordPress? Yes
? Select a WordPress installation type: Single Site
? Do you want to remove the default content? Yes
? Site Name meioliver.com
? Admin Username admin
? Admin Password password
? Admin Email admin@example.com
Ensuring global network exists
- Network exists
Ensuring global cache volume exists
- Creating Volume
Ensuring global services are running
Starting global_gateway_1 ... done
Starting global_mailcatcher_1 ... done
Starting global_dns_1 ... done
Starting global_mysql_1 ... done
Starting global_phpmyadmin_1 ... done
Waiting for mysql...
Copying required files...
Generating docker-compose.yml file...
done
Creating database
Locating project files for meioliver-com
Starting docker containers for meioliver-com
Creating network "meioliver-com_default" with the default driver
Creating meioliver-com_memcached_1 ... done
Creating meioliver-com_memcacheadmin_1 ... done
Creating meioliver-com_phpfpm_1 ... done
Creating meioliver-com_nginx_1 ... done
Downloading WordPress
Downloading WordPress 5.0.2 (en_US)...
Using cached file '/var/www/.wp-cli/cache/core/wordpress-5.0.2-en_US.tar.gz'...
Success: WordPress downloaded.
Configuring WordPress
Success: Generated 'wp-config.php' file.
Success: WordPress installed successfully.
Success: Rewrite rules flushed.
Success: Rewrite structure set.
Success: The site at 'http://meioliver.com' was emptied.
Deleted 'hello' plugin.
Deleted 'akismet' plugin.
Success: Deleted 2 of 2 plugins.
Warning: The 'twentyfifteen' theme could not be found.
Deleted 'twentysixteen' theme.
Success: Deleted 1 of 2 themes.
Success: Deleted 6 of 6 widgets.
Adding entry to hosts file
Added to hosts file successfully!
Successfully Created Site!
Comandos.
$ 10updocker delete <hostname>
$ 10updocker stop <hostname>
$ 10updocker start <hostname>
$ 10updocker restart <hostname>
$ 10updocker shell <service>
$ 10updocker logs <service>
Commandos de wp-cli:
$ 10updocker wp search-replace ‘meioliver.com' 'meioliver.es'
$ 10updocker wp site list
Mudanza a producción.
- Docker.
- docker-compose.
- Kubernetes.
Opciones:
Personalizando configs.
services:
mysql:
[...]
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/wallabag.cnf:/etc/mysql/mysql.conf.d/wordpress.cnf
Personalizando configs.
services:
wordpress:
[...]
volumes:
- ./wordpress/wp-content:/var/www/html/wp-content
- ./wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- ./wordpress/server-status.conf:/etc/apache2/conf-available/server-status.conf
- ./wordpress/htaccess:/var/www/html/.htaccess
Traefik: proxy, SSL, etc.
services:
wordpress:
[...]
labels:
- "traefik.enabled=true"
- "traefik.backend=wordpress"
- "traefik.frontend.rule=Host:meioliver.com,www.meioliver.com"
- "traefik.frontend.redirect.regex=^https?://www.meioliver.com/(.*)"
- "traefik.frontend.redirect.replacement=https://meioliver.com/$${1}"
- "traefik.docker.network=docker_traefiknet"
- "traefik.port=80"
networks:
- internal
- traefiknet
Despliegue de Traefik.
traefik:
container_name: traefik
image: traefik:latest
command: --docker
restart: always
networks:
- traefiknet
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./acme.json:/acme.json
Copias de seguridad :).
mysql-backup:
container_name: mysql-backup
image: deitch/mysql-backup
volumes:
- ./mysql-backup:/db
networks:
- internal
links:
- mysql:db
environment:
DB_DUMP_TARGET: /db
DB_SERVER: db
DB_USER: XXXX
DB_PASS: XXXX
RUN_ONCE: “true”
Kubernetes.
- Orquestación sobre contenedores.
- Más funcionalidad, más complejidad.
- Posiblemente standard de despliegue de
aplicaciones en un futuro.
- Capa nueva de infraestructura.
- Kubernetes no es para todos:
- Alta disponibilidad.
- Alta carga.
- Multi-usuario.
Dificultades.
¿Kubernetes fácil?.
- Kubernetes gestionado:
- GKE, EKS, AKS, DigitalOcean, etc.
- kompose, Helm facilitan el despliegue:
https://sysdig.com/blog/wordpress-kubernetes-perfect-setup/
Para casica...
- Docker mola y está de moda.
- Facilidad despliegue entornos desarrollo.
- Facilidad mudanza a producción.
- Buenas practicas.
Recordad.
¡Gracias! :)
Jorge Salamero - @bencerillo
Wordcamp Zaragoza 2019

Wordpress y Docker, de desarrollo a produccion

  • 1.
    Jorge Salamero -@bencerillo Wordcamp Zaragoza 2019 Wordpress y Docker de desarrollo a producción
  • 2.
    Jorge Salamero container gamer@ Sysdig github.com/bencer @bencerillo OSS fan Containers, DevOps, IoT/home-automation, motorsport Sobre mi:
  • 3.
    Agenda. - Docker paradummies. - Wordpress en Docker. - Desarrollo. - Mudanza a producción.
  • 4.
  • 5.
    Contenedores y Docker. -Contenedor: virtualización ligera. - Portabilidad. - Automatización. - Seguridad. - Nuevos procesos.
  • 6.
  • 7.
  • 8.
    Comandos. $ docker start<container name> $ docker stop <container name> $ docker rm <container name> $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14649c5b7e9a mariadb:latest "/docker-entrypoint.s" 12 seconds ago Up 12 seconds 3306/tcp wordpressdb $ docker exec -ti <container name> /bin/bash $ (I’m inside!)
  • 9.
    Dockerfile. FROM php:5.6.30-fpm-alpine RUN apkupdate && apk add build-base RUN docker-php-ext-configure mysql RUN curl -o wordpress.tar.gz http://wordpress.org/latest.tar.gz RUN tar -xzvf wordpress.tar.gz --strip-components=1 --directory /var/www/html/ RUN rm wordpress.tar.gz
  • 10.
    Docker build yrun. $ ls Dockerfile Dockerfile $ docker build -t "wordpress" . ... Successfully built 0b388013905e ... $ docker run -d -p 8080:80 -t wordpress 6da59c864d35bb0bb6043c09eb8b1128b2c1cb91f7fa456156df4a0a22f271b0
  • 11.
  • 12.
    Wordpress en Docker. $docker run -e MYSQL_ROOT_PASSWORD=<password> -e MYSQL_DATABASE=wordpress --name wordpressdb -v "$PWD/database":/var/lib/mysql -d mariadb:latest $ docker run -e WORDPRESS_DB_PASSWORD=<password> --name wordpress --link wordpressdb:mysql -p 80:80 -v "$PWD/html":/var/www/html -d wordpress
  • 13.
  • 14.
    docker-compose: MySQL. db: image: mysql:5.7 volumes: -db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: wordpress MYSQL_USER: user MYSQL_PASSWORD: password
  • 15.
    docker-compose: Wordpress. wordpress: depends_on: - db image:wordpress:latest ports: - "8000:80" restart: always volumes: - ./wp-content/:/var/www/html/wp-content environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: user WORDPRESS_DB_PASSWORD: password
  • 16.
    Comandos. $ docker-compose up-d $ docker-compose ps $ docker-compose kill <container name> $ docker-compose logs <container name> $ docker-compose exec <container name> /bin/bash $ (I’m inside!)
  • 17.
  • 18.
    wp-local-docker: todo en1. - Wordpress y MSQL. - Múltiples entornos. - Extras: Memcached, Elasticsearch. - Herramientas: wpsnapshots, wp-cli, phpmyadmin, phpmemcachedadmin, mailcatcher.
  • 19.
    wp-local-docker: $ 10updocker create Whatis the primary hostname for your site? (Ex: docker.test) meioliver.com ? Are there additional domains the site should respond to? No ? What version of PHP would you like to use? 7.2 ? Do you need Elasticsearch No ? Do you want to install WordPress? Yes ? Select a WordPress installation type: Single Site ? Do you want to remove the default content? Yes ? Site Name meioliver.com ? Admin Username admin ? Admin Password password ? Admin Email admin@example.com
  • 20.
    Ensuring global networkexists - Network exists Ensuring global cache volume exists - Creating Volume Ensuring global services are running Starting global_gateway_1 ... done Starting global_mailcatcher_1 ... done Starting global_dns_1 ... done Starting global_mysql_1 ... done Starting global_phpmyadmin_1 ... done Waiting for mysql... Copying required files... Generating docker-compose.yml file... done Creating database Locating project files for meioliver-com Starting docker containers for meioliver-com Creating network "meioliver-com_default" with the default driver Creating meioliver-com_memcached_1 ... done Creating meioliver-com_memcacheadmin_1 ... done Creating meioliver-com_phpfpm_1 ... done Creating meioliver-com_nginx_1 ... done
  • 21.
    Downloading WordPress Downloading WordPress5.0.2 (en_US)... Using cached file '/var/www/.wp-cli/cache/core/wordpress-5.0.2-en_US.tar.gz'... Success: WordPress downloaded. Configuring WordPress Success: Generated 'wp-config.php' file. Success: WordPress installed successfully. Success: Rewrite rules flushed. Success: Rewrite structure set. Success: The site at 'http://meioliver.com' was emptied. Deleted 'hello' plugin. Deleted 'akismet' plugin. Success: Deleted 2 of 2 plugins. Warning: The 'twentyfifteen' theme could not be found. Deleted 'twentysixteen' theme. Success: Deleted 1 of 2 themes. Success: Deleted 6 of 6 widgets. Adding entry to hosts file Added to hosts file successfully! Successfully Created Site!
  • 22.
    Comandos. $ 10updocker delete<hostname> $ 10updocker stop <hostname> $ 10updocker start <hostname> $ 10updocker restart <hostname> $ 10updocker shell <service> $ 10updocker logs <service> Commandos de wp-cli: $ 10updocker wp search-replace ‘meioliver.com' 'meioliver.es' $ 10updocker wp site list
  • 23.
  • 24.
    - Docker. - docker-compose. -Kubernetes. Opciones:
  • 25.
    Personalizando configs. services: mysql: [...] volumes: - ./mysql/data:/var/lib/mysql -./mysql/wallabag.cnf:/etc/mysql/mysql.conf.d/wordpress.cnf
  • 26.
    Personalizando configs. services: wordpress: [...] volumes: - ./wordpress/wp-content:/var/www/html/wp-content -./wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini - ./wordpress/server-status.conf:/etc/apache2/conf-available/server-status.conf - ./wordpress/htaccess:/var/www/html/.htaccess
  • 27.
    Traefik: proxy, SSL,etc. services: wordpress: [...] labels: - "traefik.enabled=true" - "traefik.backend=wordpress" - "traefik.frontend.rule=Host:meioliver.com,www.meioliver.com" - "traefik.frontend.redirect.regex=^https?://www.meioliver.com/(.*)" - "traefik.frontend.redirect.replacement=https://meioliver.com/$${1}" - "traefik.docker.network=docker_traefiknet" - "traefik.port=80" networks: - internal - traefiknet
  • 28.
    Despliegue de Traefik. traefik: container_name:traefik image: traefik:latest command: --docker restart: always networks: - traefiknet ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./traefik.toml:/traefik.toml - ./acme.json:/acme.json
  • 29.
    Copias de seguridad:). mysql-backup: container_name: mysql-backup image: deitch/mysql-backup volumes: - ./mysql-backup:/db networks: - internal links: - mysql:db environment: DB_DUMP_TARGET: /db DB_SERVER: db DB_USER: XXXX DB_PASS: XXXX RUN_ONCE: “true”
  • 30.
    Kubernetes. - Orquestación sobrecontenedores. - Más funcionalidad, más complejidad. - Posiblemente standard de despliegue de aplicaciones en un futuro.
  • 31.
    - Capa nuevade infraestructura. - Kubernetes no es para todos: - Alta disponibilidad. - Alta carga. - Multi-usuario. Dificultades.
  • 32.
    ¿Kubernetes fácil?. - Kubernetesgestionado: - GKE, EKS, AKS, DigitalOcean, etc. - kompose, Helm facilitan el despliegue: https://sysdig.com/blog/wordpress-kubernetes-perfect-setup/
  • 33.
  • 34.
    - Docker molay está de moda. - Facilidad despliegue entornos desarrollo. - Facilidad mudanza a producción. - Buenas practicas. Recordad.
  • 35.
    ¡Gracias! :) Jorge Salamero- @bencerillo Wordcamp Zaragoza 2019