# Setting Up Shared Database Container in Docker

## The Objective

To setup a single database container that can be used with multiple applications and frontends.

## Preparation

1. Pull the Docker images used in the examples by running the following commands in a terminal
   # mariadb
   docker pull mariadb
   # phpmyadmin
   docker pull phpmyadmin
   # wordpress
   docker pull wordpress

## Method 1 - Container Links

This method utilizes the --link flag. Container links are a "legacy feature" of Docker and may become deprecated in a future release. Further reading https://docs.docker.com/network/links/

1. Run the following commands in a terminal to setup the container stack using --link
   # create working directories
   mkdir ~/docker/mariadb -p && mkdir ~/docker/wordpress -p
   # set permissions on working directories
   sudo chown "$USER":"$USER" ~/docker -R
   # run the mariadb docker container
   docker run -d --name mariadb -e MYSQL_ROOT_PASSWORD=r00tp@ss -v ~/docker/mariadb:/var/lib/mysql --restart=unless-stopped mariadb:latest
   # run phpmyadmin container linked to the mariadb container
   docker run -d --name phpmyadmin --link mariadb -e PMA_HOST=mariadb -p 8080:80 --restart=unless-stopped phpmyadmin
   # connect to mysql CLI inside the mariadb container
   docker exec -it mariadb mysql --user root -pr00tp@ss
   # create a new database and service account for wordpress
   CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
   GRANT ALL ON wordpress.* TO 'wordpress_rw'@'%' IDENTIFIED BY 'W0rdPr3ss!!';
   FLUSH PRIVILEGES;
   EXIT;
   # run the wordpress docker container
   docker run -d --name wordpress --link mariadb -p 8880:80 -e WORDPRESS_DB_HOST=mariadb -e WORDPRESS_DB_USER=wordpress_rw -e WORDPRESS_DB_PASSWORD='W0rdPr3ss!!' -e WORDPRESS_DB_NAME=wordpress -v ~/docker/wordpress:/var/www/html --restart unless-stopped wordpress
2. Remove the created containers by running the following commands
   # remove the containers
   docker rm wordpress -f && docker rm phpmyadmin -f && docker rm mariadb -f
   # remove working directories
   sudo rm ~/docker/mariadb -R && sudo rm ~/docker/wordpress -R

## Method 2 - Docker Networking

Create a Docker network and connect each of the containers to it so they can communicate.

1. Run the following commands in a terminal to setup the container stack using Docker networking
   # create working directories
   mkdir ~/docker/mariadb -p && mkdir ~/docker/wordpress -p
   # set permissions on working directories
   sudo chown "$USER":"$USER" ~/docker -R
   # create the docker network
   docker network create containers
   # run the mariadb docker container
   docker run -d --name mariadb -e MYSQL_ROOT_PASSWORD=r00tp@ss -v ~/docker/mariadb:/var/lib/mysql --network containers --restart=unless-stopped mariadb:latest
   # run phpmyadmin container
   docker run -d --name phpmyadmin -e PMA_HOST=mariadb -p 8080:80 --restart=unless-stopped --network containers phpmyadmin
   # connect to mysql CLI inside the mariadb container
   docker exec -it mariadb mysql --user root -pr00tp@ss
   # create a new database and service account for wordpress
   CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
   GRANT ALL ON wordpress.* TO 'wordpress_rw'@'%' IDENTIFIED BY 'W0rdPr3ss!!';
   FLUSH PRIVILEGES;
   EXIT;
   # run the wordpress docker container
   docker run -d --name wordpress -p 8880:80 -e WORDPRESS_DB_HOST=mariadb -e WORDPRESS_DB_USER=wordpress_rw -e WORDPRESS_DB_PASSWORD='W0rdPr3ss!!' -e WORDPRESS_DB_NAME=wordpress -v ~/docker/wordpress:/var/www/html --network containers --restart=unless-stopped wordpress
2. Remove the created containers and network by running the following commands
   # remove the containers
   docker rm wordpress -f && docker rm phpmyadmin -f && docker rm mariadb -f
   # remove docker network
   docker network rm containers
   # remove working directories
   sudo rm ~/docker/mariadb -R && sudo rm ~/docker/wordpress -R

## Method 3 - Exposing Host Ports

Expose ports on the host into the container and connect other containers to the host's exposed port

1. Run the following commands in a terminal to setup the container stack using exposed ports on the host
   # create working directories
   mkdir ~/docker/mariadb -p && mkdir ~/docker/wordpress -p
   # set permissions on working directories
   sudo chown "$USER":"$USER" ~/docker -R
   # run the mariadb docker container
   docker run -d --name mariadb -e MYSQL_ROOT_PASSWORD=r00tp@ss -v ~/docker/mariadb:/var/lib/mysql -p 3306:3306 --restart=unless-stopped mariadb:latest
   # run phpmyadmin container
   docker run -d --name phpmyadmin -e PMA_HOST=$(hostname -f) -p 8080:80 --restart=unless-stopped phpmyadmin
   # connect to mysql CLI inside the mariadb container
   docker exec -it mariadb mysql --user root -pr00tp@ss
   # create a new database and service account for wordpress
   CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
   GRANT ALL ON wordpress.* TO 'wordpress_rw'@'%' IDENTIFIED BY 'W0rdPr3ss!!';
   FLUSH PRIVILEGES;
   EXIT;
   # run the wordpress docker container
   docker run -d --name wordpress -p 8880:80 -e WORDPRESS_DB_HOST=$(hostname -f) -e WORDPRESS_DB_USER=wordpress_rw -e WORDPRESS_DB_PASSWORD='W0rdPr3ss!!' -e WORDPRESS_DB_NAME=wordpress -v ~/docker/wordpress:/var/www/html --restart=unless-stopped wordpress
2. Remove the created containers and network by running the following commands
   # remove the containers
   docker rm wordpress -f && docker rm phpmyadmin -f && docker rm mariadb -f
   # remove working directories
   sudo rm ~/docker/mariadb -R && sudo rm ~/docker/wordpress -R