I’m hosting my 10+ year old blog and another two family blogs on a Windows machine on Azure for many years. It’s running with WIMP (Windows, IIS, MySQL, PHP) Stack. Windows machine is costly and hard to maintain ( Windows updates π ). After some time, because it’s mysql and php, and deployed in some folder which I almost forgot, I am a little bit fear to touch them so just let them running, for years.
Recently I work a lot with docker and I believe docker will be the deployment standard (at least web application). I finally migrate all the blogs to a Linux machine with docker.
The migration experience was quite smooth and simple, here are the steps:
Backup
- Export all the data from old hosting, save to some folder for later import.
Infrastructure Preparation
- Create one GNU/Linux machine (I use Ubuntu).
- Install docker. You can install with official script: https://github.com/docker/docker-install
- Install docker-compose (Compose is a tool for defining and running multi-container Docker applications): https://docs.docker.com/compose/install/
Environment Design
Since I have multiple blogs to host on a single machine, a reverse proxy is needed to forward different domain request to different upstream containers. I chose Nginx, it’s quite easy to configure.
I have 3 blogs (let’s say blog1, blog2, blog3) so there will be 5 containers:
- CONTAINER1: mysql
- CONTAINER2: nginx
- CONTAINER3: jinweijie
- CONTAINER4: jinweijie-blog1
- CONTAINER5: jinweijie-blog2
Environment Diagram:

Deployment
1. Write an nginx.conf
events { worker_connections 1024; }
http {
# this part is www redirect
server {
server_name jinweijie.com;
listen 80;
return 301 http://www.jinweijie.com$request_uri;
}
server {
server_name www.jinweijie.com;
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://jinweijie:80;
}
}
server {
server_name jinweijie-blog1.com;
listen 80;
return 301 http://www.jinweijie-blog1.com$request_uri;
}
server {
server_name www.jinweijie-blog1.com;
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://jinweijie-blog1:80;
}
}
server {
server_name jinweijie-blog2.com;
listen 80;
return 301 http://www.jinweijie-blog2.com$request_uri;
}
server {
server_name www.jinweijie-blog2.com;
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://jinweijie-blog2:80;
}
}
}
2. Write the Dockerfile for Nginx, simple, just use the official Nginx docker image and copy the nginx.conf
FROM nginx AS runtime-nginx COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
3. Write the docker-compose.yml
version: "3.7"
services:
site-db:
image: mysql:5.7
volumes:
- /home/ubuntu/sites/mysql:/var/lib/mysql
networks:
- site-net
environment:
MYSQL_ROOT_PASSWORD: [YOUR_DB_PASSWORD]
MYSQL_USER: [YOUR_DB_USER]
MYSQL_PASSWORD: [YOUR_DB_PASSWORD]
restart: always
ports:
- 3306:3306
nginx:
build:
context: .
target: runtime-nginx
dockerfile: nginx/Dockerfile
image: jinweijiedocker/personal-sites-nginx
depends_on:
- jinweijie
- jinweijie-blog1
- jinweijie-blog2
networks:
- site-net
ports:
- "80:80"
jinweijie:
depends_on:
- site-db
image: wordpress:5.0
networks:
- site-net
restart: always
environment:
WORDPRESS_DB_NAME: jinweijie
WORDPRESS_DB_HOST: site-db:3306
WORDPRESS_DB_USER: [YOUR_DB_USER]
WORDPRESS_DB_PASSWORD: [YOUR_DB_PASSWORD]
working_dir: /var/www/html
volumes:
- /home/ubuntu/sites/jinweijie:/var/www/html
jinweijie-blog1:
depends_on:
- site-db
image: wordpress:5.0
networks:
- site-net
restart: always
environment:
WORDPRESS_DB_NAME: jinweijie-blog1
WORDPRESS_DB_HOST: site-db:3306
WORDPRESS_DB_USER: [YOUR_DB_USER]
WORDPRESS_DB_PASSWORD: [YOUR_DB_PASSWORD]
working_dir: /var/www/html
volumes:
- /home/ubuntu/sites/jinweijie-blog1:/var/www/html
jinweijie-blog2:
depends_on:
- site-db
image: wordpress:5.0
networks:
- site-net
restart: always
environment:
WORDPRESS_DB_NAME: jinweijie-blog2
WORDPRESS_DB_HOST: site-db:3306
WORDPRESS_DB_USER: [YOUR_DB_USER]
WORDPRESS_DB_PASSWORD: [YOUR_DB_PASSWORD]
working_dir: /var/www/html
volumes:
- /home/ubuntu/sites/jinweijie-blog2:/var/www/html
networks:
site-net:
driver: bridge
4. Run the command to spin up the whole environment:
sudo docker-compose up -d
5. Import the old backup to new WordPress environment.
That’s it. Hope it helps if you are also trying to use docker to deployment some applications. π