This is proof-of-concept project to set up Docker Swarm in development environment with single command.
This project involves:
- Docker Machine
- Docker Swarm - Docker Built-in Orchestration
- Local Docker Registry
- Docker Network
- Docker Service
Note: This project is created for just practice. Not suitable for production use.
- Docker 1.12.1+: https://www.docker.com/
- VirtualBox: https://www.virtualbox.org/
$ git clone https://github.com/chrisleekr/docker-swarm-scalable-web-application-architecture.git
$ cd docker-swarm-scalable-web-application-architecture
$ ./run_swarm.sh
If run on windows, requires git shell https://git-for-windows.github.io/.
After shell script is completed, you can connect instances to:
- Visualizer UI: http://${MANAGER1_IP}:8500
- Web Access: http://${MANAGER1_IP}
- DB Access: tcp://${MANAGER1_IP}:3306
Note: Any node IP will be accessible to instances, not only manager1 node IP.
To stop all machines, run stop_swarm.sh
$ ./stop_swarm.sh
- Launch multiple Docker Machines and configure Docker Swarm automatically
- Demonstrate Docker Swarm which is introduced in Docker 1.12.1+
- Deploy local Docker Registry, which can use pull images across swarm nodes (https://hub.docker.com/_/registry/)
- Build docker image via Dockerfile in Docker Machine and push to local Docker Registry
- Create service with Docker Hub image MySQL (https://hub.docker.com/_/mysql/)
- Create service with custom build docker image (./docker-app-config/Dockerfile)
- Emulate scaling up for launched service
Note This section is a bit descriptive for reference purpose.
- Launching docker machine manager1
- Remove existing docker machine manager1
- Create new docker machine manager1
- Stop newly created machine to add shared folder
- Add current folder as shared folder to docker machine
- Restart docker machine manager1
- Create new folder /docker into docker machine manager1
- Mount shared folder to /docker
- Launching docker machine worker1
- Repeat aforementioned step #1-i to #1-vii
- Launching docker machine worker2
- Repeat aforementioned step #1-i to #1-vii
- Get lead manager manager1 host IP address
- Initialize swarm in lead manager manager1
- Get swarm join token for manager node
- Construct swarm join command for manager node
- Run join command to join manager nodes
- Join worker nodes to swarm
- Get swarm join token for worker node
- Construct swarm join command for worker node
- Run join command to join worker node worker1
- Run join command to join worker node worker2
- Launch docker container manomarks/visualizer
- Launch docker registry service registry:2
- Build docker image for service web (Apache+PHP)
- Go to /docker/docker-app-config and build docker image docker-app-php
- Tag built docker image to localhost:5000/docker-app-php
- Push localhost:5000/docker-app-php to local docker registry
- Create docker network frontend
- Run MySQL service in docker machine manager1
- Clean MySQL data folder
- Create mysql service (single instance) for MySQL:5.7 to manager1 node
- Run Apache & PHP docker-app-php service
- Create web service for docker image docker-app-php across swarm nodes
- Scale up web service to 4 instances