Skip to main content

Load Balancing Containers

Hands-On Lab

 

Photo of Travis Thomsen

Travis Thomsen

Course Development Director in Content

Length

01:30:00

Difficulty

Intermediate

For the last six months, the Acme Anvil Corporation has been migrating some of their bare metal infrastructure to Docker containers. The initial implementation was very basic and lacked any kind of load balancing. Your manager has tasked you with creating two proofs of concept. For the first proof of concept, you are to use Docker Compose to create an Nginx load balancer and three instances using your weather-app image. Nginx will use port 80 and send traffic to port 3000 on the weather-app containers. For the second proof of concept, you are to create a Docker Swarm service called nginx-app that has two replicas using the Nginx image. The service should be published to port 8080 on the host and target port 80 on the containers.

What are Hands-On Labs?

Hands-On Labs are scenario-based learning environments where learners can practice without consequences. Don't compromise a system or waste money on expensive downloads. Practice real-world skills without the real-world risk, no assembly required.

Load Balancing Containers

Introduction

For the last six months, the Acme Anvil Corporation has been migrating some of their bare metal infrastructure to Docker containers. The initial implementation was very basic and lacked any kind of load balancing. Your manager has tasked you with creating two proofs of concept. For the first proof of concept, you are to use Docker Compose to create an Nginx load balancer and three instances using your weather-app image. Nginx will use port 80 and send traffic to port 3000 on the weather-app containers. For the second proof of concept, you are to create a Docker Swarm service called nginx-app that has two replicas using the Nginx image. The service should be published to port 8080 on the host and target port 80 on the containers.

Solution

Begin by logging in to both lab servers using the credentials provided on the hands-on lab page:

ssh cloud_user@PUBLIC_IP_ADDRESS

Become the root user:

sudo su -

Create a Docker Compose file

On Swarm Server 1

  1. Change to the lb-challenge directory:

    cd lb-challenge
  2. Create our Docker compose file:

    vi docker-compose.yml
  3. The contents of your docker-compose.yml file should look like the following:

    version: '3.2'
    services:
      weather-app1:
          build: ./weather-app
          tty: true
          networks:
           - frontend
      weather-app2:
          build: ./weather-app
          tty: true
          networks:
           - frontend
      weather-app3:
          build: ./weather-app
          tty: true
          networks:
           - frontend
    
      loadbalancer:
          build: ./load-balancer
          image: nginx
          tty: true
          ports:
           - '80:80'
          networks:
           - frontend
    
    networks:
      frontend:

Update nginx.conf

  1. Change to the load-balancer directory:

    cd load-balancer
  2. Edit the nginx.conf file:

    vi nginx.conf
  3. The contents of your nginx.conf file should look like the following:

    events { worker_connections 1024; }
    
    http {
      upstream localhost {
        server weather-app1:3000;
        server weather-app2:3000;
        server weather-app3:3000;
      }
      server {
        listen 80;
        server_name localhost;
        location / {
          proxy_pass http://localhost;
          proxy_set_header Host $host;
        }
      }
    }

Execute docker-compose up

  1. Change directories:

    cd ../
  2. Execute a docker-compose up:

    docker-compose up --build -d
  3. Check our work:

    docker ps
  4. Copy the public IP address of Swarm Server 1 and paste it into a new tab in your browser.

Create a Docker service using Docker Swarm

  1. Change to the root directory:

    cd ~/
  2. View the contents of swarm-token.txt:

    cat swarm-token.txt
  3. Copy the docker swarm join command from the previous step.

On Swarm Server 2

  1. Execute the command that was copied from the previous step.

On Swarm Server 1

  1. Create a Docker service by executing the following command:

    docker service create --name nginx-app --publish published=8080,target=80 --replicas=2 nginx
  2. Verify this completed successfully by running the following command on both servers:

    docker ps
  3. Verify that the default nginx page loads in the browser:

    PUBLIC_IP_ADDRESS:8080

Conclusion

Congratulations, you've completed this hands-on lab!