Architecture & DesignUsing Docker on Azure Container Service with Swarm Cluster

Using Docker on Azure Container Service with Swarm Cluster

Developer.com content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

In the first article, “Creating a Docker Swarm Cluster on Azure Container Service,” we discussed creating a Docker Swarm cluster on Azure Container Service (ACS). Each virtual machine (master or agent) has Docker running when the Swarm is created. In this continuation article, we shall discuss using Docker on the Swarm created on the Azure Container Service. We shall discuss using both standalone Docker and a Docker Swarm mode service. This article has the following sections:

Setting the Environment

Use the same environment as in the first article, “Creating a Docker Swarm Cluster on Azure Container Service.” Create a Swarm cluster on ACS, as discussed in the article. In this article, we shall use the Swarm cluster consisting of three master nodes and one agent node to run a standalone Docker container and a Docker Swarm mode service.

Listing Docker Info

Start Cloud Shell as discussed in the article “Creating a Docker Swarm Cluster on Azure Container Service.” Connect to a Swarm master VM using a SSH RSA private key, user name, and Public IP Address of the master, as discussed in the earlier article also. The SSH command to connect to the master VM is as follows; the SSH RSA private key, user name, and Public IP address would be different for different users.

ssh -i /home/deepak/.ssh/id_rsa -p 2200 deepak@52.176.1.213

A connection gets established and a command prompt for the master VM gets displayed.

deepak@Azure:~$ ssh -i /home/deepak/.ssh/id_rsa
   -p 2200 deepak@52.176.1.213
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-65-generic x86_64)
 * Documentation:  https://help.ubuntu.com/
   System information as of Tue Oct 10 22:40:17 UTC 2017

   System load:  0.27            Processes:                     131
   Usage of /:   4.2% of 28.80GB Users logged in:                 0
   Memory usage: 2%              IP address for eth0:    172.16.0.5
   Swap usage:   0%              IP address for docker0: 172.17.0.1

   Graph this data and manage this system at:
      https://landscape.canonical.com/

   Get Cloud support with Ubuntu Advantage Cloud Guest:
      http://www.ubuntu.com/business/services/cloud

   New release '16.04.3 LTS' available.
   Run 'do-release-upgrade' to upgrade to it.


Last login: Tue Oct 10 22:40:17 2017 from 40.78.30.37

Three master nodes were configured in the Swarm provisioned in the article “Creating a Docker Swarm Cluster on Azure Container Service.” The number of master VMs may be 1, 3, or 5. When running multiple master VMs, the SSH command to connect to each of the master VMs is the same except for the SSH port, which is 2200 for the 1st master, 2201 for the 2nd master, 2202 for the 3rd master, 2203 for the 4th master, and 2204 for the 5th master. With three master VMs, the SSH ports used are 2200, 2201, and 2202. To connect to a 2nd master, the SSH command is as follows:

deepak@Azure:~$ ssh -i /home/deepak/.ssh/id_rsa
   -p 2201 deepak@52.176.1.213

And, the SSH command to connect to the 2nd master is as follows:

deepak@Azure:~$ ssh -i /home/deepak/.ssh/id_rsa
   -p 2202 deepak@52.176.1.213

The Docker daemon is running at 172.16.0.5:2375. To display system-wide information, run the docker info command. Output (partial) from the command is listed:

deepak@swarm-master-D50F2361-0:~$ docker -H 172.16.0.5:2375 info
Containers: 0
   Running: 0
   Paused: 0
   Stopped: 0
Images: 0
Role: primary
Strategy: spread
Nodes: 1
   swarm-agent-D50F2361000001: 10.0.0.5:2375
Is Manager: false
   Kernel Version: 3.19.0-65-generic
Operating System: linux
Architecture: amd64
CPUs: 2
Total Memory: 7.145GiB

Running a Hello World Docker Image

Each of the virtual machines in an ACS Swarm is a Docker host and a standalone Docker container may be run on any of the Swarm VMs. As an example, run the “hello-world” Docker image on a master VM.

deepak@swarm-master-D50F2361-0:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
5b0f327be733: Pull complete
Digest: sha256:b2ba691d8aac9e5ac3644c0788e3d3823f9e97f757f01d2
   ddc6eb5458df9d801
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working
   correctly.
To generate this message, Docker took the following steps:
   1. The Docker client contacted the Docker daemon.
   2. The Docker daemon pulled the "hello-world" image from the
      Docker Hub.
   3. The Docker daemon created a new container from that image
      which runs the executable that produces the output you are
      currently reading.
   4. The Docker daemon streamed that output to the Docker client,
      which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container
   with:
   $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker
   ID: https://cloud.docker.com/
For more examples and ideas, visit:
   https://docs.docker.com/engine/userguide/
deepak@swarm-master-D50F2361-0:~$

The Docker image hello-world is running on the Swarm master VM and not on the Swarm. The master VM is just one of the VMs in the Swarm. The Docker Swarm is listening to the endpoint 172.16.0.5:2375. To run Docker containers on the Swarm, the Swarm endpoint must be provided, as we shall discuss in the next section. When a Docker container is run on a Swarm, the Swarm master assigns a Swarm agent to run the Docker container on.

Running a Nginx Docker Image

The hello-world Docker image used in the preceding section is a very basic Docker image with not much Dockerization and just outputs a message. In this section, we shall run a standalone container with Docker image nginx for a Nginx server. The following command creates a Docker container called hello-nginx and exposes port 80 on the host.

docker   run --name hello-nginx -d -p 80:80 nginx

The output from the docker run command is listed:

deepak@swarm-master-D50F2361-0:~$ docker
   run --name hello-nginx -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bc95e04b23c0: Pull complete
110767c6efff: Pull complete
f081e0c4df75: Pull complete
Digest: sha256:004ac1d5e791e705f12a17c80d7bb1e8f7f01aa7dca7deee
   6e65a03465392072
Status: Downloaded newer image for nginx:latest
b3679edba090ff41482f3754b4d852d295985b501f6fa2a08b46c04bd0014c2e

The preceding docker run command runs a Docker container on the Swarm master VM. The docker run command may be run on the Swarm by providing the Swarm endpoint IP and port as follows:

deepak@swarm-master-D50F2361-0:~$ docker -H 172.16.0.5:2375 run
  --name hello-nginx -d -p 80:80 nginx
ddcbc335988f7b5dba762b436bfde4c22d01144d67313813ba140a5391bac8df

Listing Docker Containers

List the Docker containers on a master VM with the docker ps command. The hello-nginx Docker container gets listed. A Swarm manager container, which is not user created but is a system container, is created when a Swarm is created.

Editor’s Note: Please note that many of the following code listings are too wide to display correctly. Please scroll the code box to the right to see the entire listing.
deepak@swarm-master-D50F2361-0:~$ docker ps
CONTAINER ID   IMAGE       COMMAND                 CREATED         STATUS        PORTS                   NAMES
b3679edba090   nginx       "nginx -g 'daemon..."   3 seconds ago   Up 2 seconds  0.0.0.0:80->80/tcp      hello-nginx
f82ebb6efa4f   swarm:1.1.0 "/swarm manage --r..."  5 minutes ago   Up 3 minutes  0.0.0.0:2375->2375/tcp  containers_swarm_1

The Docker containers on the Swarm endpoint may be listed as follows:

deepak@swarm-master-D50F2361-0:~$ docker -H 172.16.0.5:2375 ps -a
CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS        PORTS               NAMES
ddcbc335988f nginx         "nginx -g 'daemon..."   36 seconds ago  Up 35 seconds 10.0.0.5:80->80/tcp   swarm-agent-D50F2361000001/hello-nginx

The Docker container is running on a Swarm agent as indicated by the Docker container name swarm-agent-D50F2361000001/hello-nginx.

Accessing the Nginx Docker Container in a Browser

As discussed earlier, when a Docker container is run on the Swarm using the Swarm endpoint, the Swarm master schedules the container on one of the Swarm agents in the Swarm. To access the Nginx server running in Docker container on the Swarm endpoint, the Swarm agent Public IP must be used. The Swarm we have used has only one Swarm agent. The Swarm agent Public IP may be obtained from the Resources listing, as shown in Figure 1.

Swarm Agent Public IP Address
Figure 1: Swarm Agent Public IP Address

Alternatively, click on the Swarm agent Load balancer in the Resources, as shown in Figure 2.

Swarm Agent Load Balancer
Figure 2: Swarm Agent Load Balancer

In the Swarm agent details page obtain the IP Address (see Figure 3).

IP Address of Swarm Agent
Figure 3: IP Address of Swarm Agent

The IP Address also may be obtained from the Swarm agent load balancer details page, as shown in Figure 4.

Swarm Agent Public IP on the Load Balancer Page
Figure 4: Swarm Agent Public IP on the Load Balancer Page

In a browser on a local machine, navigate to the Public IP address of the Swarm agent. The Nginx server welcome page gets displayed, as shown in Figure 5.

Invoking Nginx Server in a Browser
Figure 5: Invoking Nginx Server in a Browser

Removing a Docker Container

To remove a Docker container, run the docker rm command. A running Docker container cannot be removed. First, stop the Docker container hello-nginx running on the Swarm.

deepak@swarm-master-D50F2361-0:~$ docker -H 172.16.0.5:2375
   stop hello-nginx
hello-nginx

Subsequently, the stopped container may be removed with docker rm.

deepak@swarm-master-D50F2361-0:~$ docker -H 172.16.0.5:2375
   rm hello-nginx
hello-nginx

Initializing the Docker Swarm Mode

As discussed before, the Azure Container Service Swarm does not have the Swarm mode enabled by default. The Swarm mode has to be initialized with the docker swarm init command.

deepak@swarm-master-D50F2361-0:~$ docker swarm init
   --advertise-addr 52.176.1.213
Swarm initialized: current node (ia4uj7431stu8y0j5h2yvdp27) is
   now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token
SWMTKN-1-5ksj7uqccgv1vnnmie09qmt191ldpupof4ihg4vhm083c20xsh
   -6uyq5653uo62e521bcoatzyyz52.176.1.213:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

List the Swarm mode nodes with the docker node ls command. The Swarm manager node gets listed.

deepak@swarm-master-D50F2361-0:~$ docker node ls
ID                           HOSTNAME                 STATUS   AVAILABILITY   MANAGER STATUS
ia4uj7431stu8y0j5h2yvdp27 *  swarm-master-D50F2361-0  Ready    Active         Leader

Creating a Docker Service

Having initialized the Docker Swarm mode, create a Docker service with the docker service create command. As an example, create a Docker service consisting of two replicas using Docker image alpine and ping docker.com.

deepak@swarm-master-D50F2361-0:~$ docker service create
--replicas 2 --name helloworld alpine ping docker.com
tg1ywqiyei3jw9prco6890ol1

As another example, create a Docker service with the Docker image tutum/hello-world and expose the service on the host on port 8080.

deepak@swarm-master-D50F2361-0:~$ docker service create 
>     --name hello-world 
>     --publish 8080:80 
>     --replicas 2 
>     tutum/hello-world
3e38c1595cddg0ckmoyasrnnu

Listing Docker Services

List the Docker services with the docker service ls command. The two services created in the preceding section get listed.

deepak@swarm-master-D50F2361-0:~$ docker service ls
ID             NAME          MODE         REPLICAS   IMAGE                      PORTS
3e38c1595cdd   hello-world   replicated   2/2        tutum/hello-world:latest   *:8080->80/tcp
tg1ywqiyei3j   helloworld    replicated   2/2        alpine:latest

Listing Docker Service Tasks

List the Docker service tasks for the helloworld service based on the Docker image alpine.

deepak@swarm-master-D50F2361-0:~$ docker service ps helloworld
ID             NAME           IMAGE           NODE                      DESIRED STATE   CURRENT STATE            ERROR   PORTS
0mal82mskbge   helloworld.1   alpine:latest   swarm-master-D50F2361-0   Running         Running 33 seconds ago
iqz0bqkldxs2   helloworld.2   alpine:latest   swarm-master-D50F2361-0   Running         Running 32 seconds ago

List the Docker service tasks for the hello-world service based on the tutum/hello-world Docker image.

deepak@swarm-master-D50F2361-0:~$ docker service ps hello-world
ID             NAME            IMAGE                      NODE                      DESIRED STATE   CURRENT STATE             ERROR   PORTS
yok48ja4o835   hello-world.1   tutum/hello-world:latest   swarm-master-D50F2361-0   Running         Running 38 seconds ago
x5tvcuglwzd0   hello-world.2   tutum/hello-world:latest   swarm-master-D50F2361-0   Running         Running 38 seconds ago

Listing Docker Containers for Docker Service

The Docker containers for a Docker service on a Docker host in the Swarm may be listed with the docker ps command.

deepak@swarm-master-D50F2361-0:~$ docker ps
CONTAINER ID   IMAGE                      COMMAND                 CREATED         STATUS         PORTS   NAMES
b6b069102300   tutum/hello-world:latest   "/bin/sh -c 'php-f..."  6 minutes ago   Up 6 minutes   80/tcp   hello-world.2.x5tvcuglwzd05olktbf3tpfqe
62e26d4bc0ff   tutum/hello-world:latest   "/bin/sh -c 'php-f..."  6 minutes ago   Up 6 minutes   80/tcp   hello-world.1.yok48ja4o835nc7cog8hhjlr7
db4827da350b   alpine:latest              "pingdocker.com"        7 minutes ago   Up 7 minutes            helloworld.2.iqz0bqkldxs2sg8ny50je7e7y
92dab9f7ae97   alpine:latest              "pingdocker.com"        7 minutes ago   Up 7 minutes            helloworld.1.0mal82mskbgecbcwh3op18nrr

Docker containers for the hello-world and helloworld services get listed.

Exploring Logs Generated by a Docker Service Container

The logs generated, if any, in a Docker container for a Docker service may be listed with the docker logs command. As an example, obtain the container ID for an alpine image based service and list the logs:

deepak@swarm-master-D50F2361-0:~$ docker logs db4827da350b
PING docker.com (34.201.187.190): 56 data bytes

As the output indicates, the docker.com domain gets pinged and 56 bytes of data are exchanged.

Conclusion

In this article, we discussed using Docker in a Docker Swarm cluster on Azure Container Service. We used standalone Docker containers and Docker services on the Swarm. A Swarm cluster on ACS exposes a Swarm endpoint to run a standalone Docker container. When Docker containers are run on the Swarm endpoint, the Swarm runs standalone Docker containers on Swarm agent/s. The Swarm mode is not enabled by default and has to be initialized on a Swarm master VM.

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Latest Posts

Related Stories