Docker is a containerzation platform, it can be defined, as simple as BUILD, SHIP and RUN.
A container is a light-weight or a scaled down Virtual machine. This is what we are seeing elsewhere in the web. Let us deep dive a bit and compare the differences.
Analogy : Container Vs Virtual Machine
Source: Docker website.
Both are designed to provide an isolated environment in which to run an application. Additionally, the environment is represented as a binary artefact that can be moved between hosts.
The underlying architecture is completely different, easy way to interpret is by looking at the image below.
Imagine a Virtual machine as a House and Docker container as an Apartment or an unit.
Houses (the VMs) are fully self-contained and offer protection from unwanted guests. They also each possess their own infrastructure –plumbing, heating, electrical, etc. Furthermore, in the vast majority of cases houses are all going to have at a minimum a bedroom, living area, bathroom, and kitchen.
Apartments (Docker containers) they are built around shared infrastructure. The apartment building (the server running the Docker daemon, otherwise known as a Docker host) offers shared plumbing, heating, electrical, etc. to each apartment. Additionally, apartments are offered in several different sizes – from studio to multi-bedroom penthouse. You’re only renting exactly what you need.
Docker is not a virtualization technology, it’s an application delivery technology.
Excellent isn’t it ? credit goes to the guys at Docker for this example. You can thank me for collating it here 🙂
How Docker is helping the Test Automation world ?
It helps by providing a seamless environment for Distributed testing. The moment we hear Distributed testing in Selenium world, Selenium Grid comes to our mind. Yes! In earlier days or still, a few companies have different VM’s hosted as a node and connected to a hub. This is costly. Hence people were choosing the Test on Cloud platforms like SauceLabs and Browserstack. Docker eliminates all those infra setup and cost benefits.
Now that, we saw how a VM and Docker container differs, Instead of each separate VM as a Node, each container in a Docker is considered as a Node. Imagine the possibilities. Scaling up the Nodes(Containers) are easy. SauceLabs and Browserstack are still different and have their own positives.
Let’s setup docker-selenium in our machine.
Step 1: Download Docker from docker.com/products/overview
Step 2: Install as per your OS instructions.
Docker will be running as a daemon process and could be seen here on your mac system bar.
Step 1: On your Terminal(Mac) type in docker –version it should print out version number.
Official Repository page: https://github.com/SeleniumHQ/docker-selenium
The classic problem of dev and QA getting into a debate for a bug or a feature that may work fine in dev system but not in the QA system, all that problem shall be resolved with this Node containers.
Pull and then run the image are two basic things to be done with docker images.
Selenium Grid Standalone
docker pull selenium/standalone-chrome-debug Likewise you can pull in all the images as you want.
Running a standalone machine without connecting to a hub, image names with description.
selenium/standalone-chrome: Selenium standalone with Chrome installed
selenium/standalone-firefox: Selenium standalone with Firefox installed
selenium/standalone-chrome-debug: Selenium standalone with Chrome installed and runs a VNC server
selenium/standalone-firefox-debug: Selenium standalone with Firefox installed and runs a VNC server
docker run -d --name selenium -p 5900:5900 -p 4444:4444 selenium/standalone-chrome-debug
You can view this standalone machine through your VNC viewer or Screen Sharing app on your Mac.
docker ps -a on your screensharing app use localhost:5900 you will see a ubuntu logo 🙂 That’s it you are done and you can run a sample test and view in this machine.
Selenium Grid with Hub and Node
docker pull selenium/hub
docker pull selenium/node-chrome-debug.
and few other images with the description as follows.
selenium/hub: Image for running a Selenium Grid Hub
selenium/node-chrome: Selenium node with Chrome installed, needs to be connected to a Selenium Grid Hub
selenium/node-firefox: Selenium node with Firefox installed, needs to be connected to a Selenium Grid Hub
selenium/node-chrome-debug: Selenium node with Chrome installed and runs a VNC server, needs to be connected to a Selenium Grid Hub
selenium/node-firefox-debug: Selenium node with Firefox installed and runs a VNC server, needs to be connected to a Selenium Grid Hub
Step 3: Creating a docker HUB instance
docker run -d -p 5000:4444 --name selenium-hub -P selenium/hub
Step 4: To check if the hub is up and running http://localhost:5000/grid/console
Step 5: Run a Chrome Node and Link it to Hub
docker run -d --link selenium-hub:hub -P --name chrome selenium/node-chrome-debug .
Step 6: Run a Firefox Node and Link it to Hub
docker run -d --link selenium-hub:hub -P --name firefox selenium/node-firefox-debug.
Selenium Grid setup with Docker-compose
Now that, we have got fair understanding and working setup of Selenium standalone setup and Selenium grid with hub and node.
Let us, make even simpler by eliminating step 1 to step 6 by using one command and a docker YAML file.
Step 1: Download create one yml file like this docker-compose.yml
Step 2: To spin up Selenium Grid just run this command where your yml file is placed,
docker-compose up -d .
Step 3: http://localhost:4444/grid/console should show up hub with one chrome and one firefox node.
Step 1: docker-compose scale selenium-chrome=5 selenium-firefox=5
Step 2: Bang! Now you have 10 machines(Nodes / Containers) Instead of setting up 10 Mac Mini's or 10 Linux machines to run your Selenium tests.
So, that's a lot of saving in terms of machine cost. Docker is easy, simple and powerful. So dockerize your Selenium Grid environment.
UPDATE: Revised on Nov 28 with new screenshots.