Day 8: Deploying with GitLab CI/CD & Docker Compose (WordPress + MySQL Stack)

Muhammad HassanMuhammad Hassan
3 min read

In today's blog, we automate deploying a WordPress and MySQL stack using Docker Compose through GitLab CI/CD. Additionally, weโ€™ll discuss an important issue if you later switch WordPress to run on port 80.


๐Ÿ“œ Docker Compose File โ€” docker-compose.yaml

Hereโ€™s the stack configuration:

version: '3.8'

services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80  # WordPress runs on port 8080
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

โœ… Access WordPress: http://<YOUR_VM_IP>:8080


๐Ÿค– GitLab CI/CD Pipeline โ€” .gitlab-ci.yml

stages:
  - deploy

deploy-job:
  stage: deploy
  image: alpine:latest

  before_script:
    - apk add --no-cache openssh sshpass

  script:
    - sshpass -p "$DOCKER_VM_PASSWORD" scp -o StrictHostKeyChecking=no docker-compose.yaml ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS}:/${DOCKER_VM_USERNAME}/docker-compose.yaml
    - sshpass -p "$DOCKER_VM_PASSWORD" ssh -o StrictHostKeyChecking=no ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS} "
        cd /${DOCKER_VM_USERNAME} && 
        docker compose -f docker-compose.yaml down &&
        docker compose -f docker-compose.yaml up -d
      "

  tags:
    - microk8s

โœ… Environment Variables Needed:

Variable NameDescription
DOCKER_VM_IP_ADDRESSRemote Docker server's IP
DOCKER_VM_USERNAMESSH username
DOCKER_VM_PASSWORDSSH password

โš  Running WordPress on Port 80 - Beware of Redirection Issues

If you decide to change 8080:80 to 80:80 in your docker-compose.yaml to run WordPress on port 80, you might face a redirection issue.


โŒ Reason for the Redirection

WordPress stores the site URL (with the port) in the database when it's first installed. For example, if you ran it on:

http://68.183.86.22:8080

WordPress stores this URL inside the wp_options table (fields: siteurl and home). So, when you shift to port 80, WordPress still tries to redirect to the old port.


๐Ÿ” How to Check Stored URL in WordPress

  1. Connect to the MySQL container:
docker exec -it <db-container-name> mysql -u exampleuser -pexamplepass

Example:

docker exec -it root-db-1 mysql -u exampleuser -pexamplepass
  1. Run these SQL commands:
USE exampledb;
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');

Youโ€™ll likely see:

http://68.183.86.22:8080

โœ… How to Fix the Redirect

Update the siteurl and home directly in the database:

UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'home';

docker restart <wordpress-container-name>

Example:

docker restart root-wordpress-1

๐ŸŒ Final Step:

  • Clear browser cache or try incognito mode.

  • Access your WordPress on:

http://68.183.86.22

๐ŸŽฏ Summary

โœ… GitLab CI/CD deploys your WordPress stack automatically
โœ… Docker Compose makes multi-container deployment simple
โœ… WordPress stores its base URL on first install
โœ… Update the database if you change the port later

0
Subscribe to my newsletter

Read articles from Muhammad Hassan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Muhammad Hassan
Muhammad Hassan

Hey there! I'm currently working as an Associate DevOps Engineer, and I'm diving into popular DevOps tools like Azure Devops,Linux, Docker, Kubernetes,Terraform and Ansible. I'm also on the learning track with AWS certifications to amp up my cloud game. If you're into tech collaborations and exploring new horizons, let's connect!