Docker Swarm: Deploying Web Apps and Sites
You can use Docker Swarm to deploy fully isolated web applications in to your cloud infrastructure, without also having to configure a web server in it too.
A couple of years ago, I’ve used LXC to do the same thing. However, over the years, I have experienced that Docker has more adoption and therefore more resources available online; including documentation and infrastructure. The reason I initially was hesitant to go with Docker was that I didn’t want to rely on a proprietary technology created by a single private company.
However, as there are related technologies like Kubernets and platforms by service providers like Google, Microsoft, and Amazon AWS that depend on Docker, I feel that Docker Inc (Who develops Docker.) won’t be able to close shop just because they feel like it. Even if they did, the big players would pick the project up. Plus, there’s the Open Container Initiative by The Linux Foundation, which has many big companies as members, including Docker Inc itself. This has given me confidence to adopt Docker.
I have been using Docker Swarm to run several projects of Sanmark Solutions PVT LTD and my own web sites. In fact, this very blog is running on the same infrastructure.
The following, is how I do it.
Creating a Docker Swarm
First, we have to create a virtual machine in your choice of cloud infrastructure provider. My choice is DigitalOcean. If you would like to create an account there, consider using my referral link https://m.do.co/c/e210d2f2ba8f ; it will give you 10 USD free credit (Which you can use to run a VPS for 2 months for free!) when you sign up, and when you spend 25 USD in your account, it will give me 25 USD as a thanks.
I use the smallest level VPS available in DigitalOcean (They call them “Droplets”.), which costs 5 USD/month, which has following specs:
- 1 GB RAM
- 1 Virtual CPU
- 25 GB SSD
- 1 TB/month included transfer
Once you have a VPS, you can create a Docker Swarm in it following the instructions in https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/. You don’t have to setup Docker Machine; just SSH into your VPS and you can
docker init. You don’t have to add more nodes either (Docker Swarm refers to the VPSes as “nodes”.); just the one is enough for now.
Deploying a Web App to Docker Swarm
Log in to the VPS, and create a directory named
docker-deployments in the root directory. In it, create a directory with backward domain name for the service you wish to deploy, with dashes replacing periods. For an example, if you are going to deploy the application for
example.com, the directory name would be
com-example directory, you have to create a
docker-compose.yml file. It will contain all the
services that our app needs. If our app is a WordPress installation, you’d probably need at least two services to run it: WordPress itself, and MySQL or MariaDB (Which is a clone of MySQL.). Docker Swarm calls a collection of services like this a
Following is an example content for a docker-compose.yml file, with the essentials properties.
version: '3' services: wordpress: image: wordpress:5.1.1-php7.1-apache depends_on: - mariadb volumes: - ./volumes/wordpress/content:/var/www/html/wp-content environment: WORDPRESS_DB_HOST: mariadb:3306 WORDPRESS_DB_PASSWORD: root ports: - 8011:80 mariadb: image: mariadb:10.4.4 volumes: - ./volumes/mariadb/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root
I think you’d already know the basics of a
docker-compose.yml, if you’re reading this, so I won’t waste time explaining every line. I’ll just describe some unique ones.
Line 8: As WordPress will be storing user uploaded content in its
wp-content directory, we need to persist those files in it. Docker Containers are volatile, and in case there are multiple
replicas of the service, they all need to share this directory in which user data would be stored. You will have to manually create the directory
volumes/wordpress/content inside your
Line 10: Inside a Docker Swarm Stack, all the member Services of that Stack can call each other by just the name. No need to find internal IPs, which changes overtime anyways.
Line 17: Same as the Line 8. We need to persist the
/var/lib/mysql directory of the MariaDB / MySQL container, in case the currently running one turns off.
Easy Re/deployment with a “Makefile”
To deploy or redeploy a Stack, you’ll have to type a quite long command, which is
docker stack deploy -c docker-compose.yml --with-registry-auth com-example. As that is too long, we can shortcut it using a
Makefile. Just create a file named
Makefile in the
com-example directory, and add the following code into it.
deploy: docker stack deploy -c docker-compose.yml --with-registry-auth com-example
You’ll have to have the
make program installed in your VPS as well. After that, from inside the
com-example directory, run the command
make deploy, and your longer command would be run.
Stopping a Docker Swarm Stack
To stop the Docker Swarm Stack we just deployed, just run the command
docker stack rm com-example.