Cuando planeé por primera vez en actualizar Traefik a la versión 2.0, de primeras pensé que iba a ser un montón de trabajo pero después de ojear la guía oficial para migrar de v1 a v2 me di cuenta de que tampoco eran tantos cambios.
Por si os interesa, la guía oficial para actualizar Traefik v1 a v2 es esta:
Official Guide: Traefik v1 to v2
La actualización de Traefik v1 a v2 se puede resumir en 4 pasos:
- Añadir la configuración vieja del fichero traefik.toml al fichero docker-compose de Traefik
- Actualizar la sintaxis de los labels
- Quitar el volumen del archivo traefik.toml que en la versión 2 no hace falta
- Actualizar a la nueva sintaxis los archivos docker-compose de los ficheros que trabajen con Traefik
Ahora os mostraré el cambio del archivo docker-compose.yml de la versión 1 a la dos:
Traefik 1.7 docker-compose.yml (old)
version: '3'
services:
traefik:
image: traefik:v1.7.26-alpine
restart: always
ports:
- 80:80
- 443:443
networks:
- web
labels:
- "traefik.frontend.rule=Host:traefik.mydomain.com"
- "traefik.frontend.entryPoints=http,https"
- "traefik.port=8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config/traefik.toml:/traefik.toml
- ./config/acme.json:/acme.json
container_name: traefik
networks:
web:
external: true
Traefik 2.0 docker-compose.yml (new)
version: '3'
services:
traefik:
image: traefik:v2.3.0
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entryPoints.web.address=:80"
- "--entryPoints.websecure.address=:443"
- "--certificatesResolvers.le.acme.email=my@email.com"
- "--certificatesResolvers.le.acme.storage=acme.json"
- "--certificatesResolvers.le.acme.tlsChallenge=true"
- "--certificatesResolvers.le.acme.httpChallenge=true"
- "--certificatesResolvers.le.acme.httpChallenge.entryPoint=web"
restart: always
ports:
- 80:80
- 443:443
networks:
- web
labels:
- traefik.http.routers.http_catchall.rule=HostRegexp(`{any:.+}`)
- traefik.http.routers.http_catchall.entrypoints=web
- traefik.http.routers.http_catchall.middlewares=https_redirect
- traefik.http.middlewares.https_redirect.redirectscheme.scheme=https
- traefik.http.middlewares.https_redirect.redirectscheme.permanent=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config/acme.json:/acme.json
container_name: traefik
networks:
web:
external: true
Una vez actualizado el fichero docker-compose.yml de Traefik, ya estaría listo para funcionar, pero todavía tenemos pendiente actualizar la sintaxis de TODOS los archivos docker-compose.yml que utilicen Traefik.
En este ejemplo os mostraré como he tenido que cambiar un proyecto que tenía en docker-compose para la nueva sintaxis de Traefik, el único cambio en el fichero docker-compose afectó al apartado labels.
Wordpress docker-compose.yml (viejo)
version: '3'
services:
wordpress:
image: wordpress
restart: unless-stopped
depends_on:
- wordpress_db
networks:
- web
- wordpress_net
env_file:
- wp_env
volumes:
- ./config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- wordpress:/var/www/html
links:
- wordpress_db:mysql
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:mywordpress.domain.com"
- "traefik.frontend.entryPoints=http,https"
- "traefik.port=80"
container_name: wordpress
wordpress_db:
image: mariadb
restart: unless-stopped
networks:
- web
- wordpress_net
env_file:
- wp_db_env
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
- wordpress_db:/var/lib/mysql
expose:
- 3306
container_name: wordpress_db
volumes:
wordpress:
wordpress_db:
networks:
web:
external: true
wordpress_net:
driver: bridge
Wordpress docker-compose.yml (nuevo)
version: '3'
services:
wordpress:
image: wordpress
restart: unless-stopped
depends_on:
- wordpress_db
networks:
- web
- wordpress_net
env_file:
- wp_env
volumes:
- ./config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- wordpress:/var/www/html
links:
- wordpress_db:mysql
labels:
- traefik.http.routers.wordpress.rule=Host(`mywordpress.domain.com`)
- traefik.http.routers.wordpress.tls=true
- traefik.http.routers.wordpress.tls.certresolver=le
- traefik.http.services.wordpress.loadbalancer.server.port=80
container_name: wordpress
wordpress_db:
image: mariadb
restart: unless-stopped
networks:
- web
- wordpress_net
env_file:
- wp_db_env
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
- wordpress_db:/var/lib/mysql
expose:
- 3306
container_name: wordpress_db
volumes:
wordpress:
wordpress_db:
networks:
web:
external: true
wordpress_net:
driver: bridge