Skip to main content

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

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

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

About the author

  • 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!

No comments yet. Be the first to comment.

More from this blog