How to deploy a web server using Docker

DockerDockerBeginner
Practice Now

Introduction

Docker is a widely-adopted containerization platform that simplifies the deployment and management of applications. In this tutorial, you will learn how to deploy a web server using Docker, exploring the benefits of containerization and setting up a Docker development environment.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("`Docker`")) -.-> docker/ContainerOperationsGroup(["`Container Operations`"]) docker(("`Docker`")) -.-> docker/ImageOperationsGroup(["`Image Operations`"]) docker(("`Docker`")) -.-> docker/DockerfileGroup(["`Dockerfile`"]) docker/ContainerOperationsGroup -.-> docker/create("`Create Container`") docker/ContainerOperationsGroup -.-> docker/ps("`List Running Containers`") docker/ContainerOperationsGroup -.-> docker/run("`Run a Container`") docker/ContainerOperationsGroup -.-> docker/start("`Start Container`") docker/ContainerOperationsGroup -.-> docker/stop("`Stop Container`") docker/ImageOperationsGroup -.-> docker/pull("`Pull Image from Repository`") docker/DockerfileGroup -.-> docker/build("`Build Image from Dockerfile`") docker/ContainerOperationsGroup -.-> docker/ls("`List Containers`") subgraph Lab Skills docker/create -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/ps -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/run -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/start -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/stop -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/pull -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/build -.-> lab-411531{{"`How to deploy a web server using Docker`"}} docker/ls -.-> lab-411531{{"`How to deploy a web server using Docker`"}} end

Understanding Docker

What is Docker?

Docker is an open-source platform that allows developers to build, deploy, and run applications in a containerized environment. Containers are lightweight, standalone, and executable packages that include everything needed to run an application, including the code, runtime, system tools, and libraries. Docker provides a consistent and reliable way to package and distribute applications, making it easier to develop, test, and deploy software.

Benefits of Using Docker

  1. Consistent Environments: Docker containers ensure that applications run the same way, regardless of the underlying infrastructure, providing a consistent and reliable development and deployment environment.
  2. Increased Efficiency: Docker containers are lightweight and can be started and stopped quickly, allowing for more efficient use of system resources compared to traditional virtual machines.
  3. Improved Scalability: Docker makes it easy to scale applications up or down, as needed, by creating and managing multiple containers.
  4. Improved Portability: Docker containers can be easily shared and deployed across different platforms and environments, making it easier to move applications between development, testing, and production.

Docker Architecture

The Docker architecture consists of the following key components:

  1. Docker Client: The user interface that allows you to interact with the Docker daemon.
  2. Docker Daemon: The background process that manages Docker objects, such as images, containers, networks, and volumes.
  3. Docker Images: Immutable files that contain the code, runtime, system tools, libraries, and dependencies needed to run an application.
  4. Docker Containers: Runnable instances of Docker images, which are isolated and have their own file system, network, and process space.
  5. Docker Registry: A repository for storing and distributing Docker images.
graph TD A[Docker Client] --> B[Docker Daemon] B --> C[Docker Images] B --> D[Docker Containers] B --> E[Docker Registry]

Getting Started with Docker

To get started with Docker, you'll need to install the Docker engine on your system. The installation process varies depending on your operating system, but you can typically find the instructions on the official Docker website.

Once you have Docker installed, you can start using it to build and run your applications. Here's a simple example of running a Nginx web server using Docker:

## Pull the Nginx image from the Docker registry
docker pull nginx

## Run the Nginx container
docker run -d -p 80:80 --name my-nginx nginx

This command pulls the Nginx image from the Docker registry, and then runs a new container based on that image, exposing port 80 on the host to port 80 in the container.

Setting up a Docker Development Environment

Installing Docker

To set up a Docker development environment, you first need to install the Docker engine on your system. Here's how to do it on Ubuntu 22.04:

## Update the package index
sudo apt-get update

## Install packages to allow apt to use a repository over HTTPS
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

## Add Docker's official GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

## Set up the Docker repository
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Install Docker Engine, containerd, and Docker Compose
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Configuring Docker for Development

After installing Docker, you can configure it for your development environment. Here are some common configurations:

  1. Mounting Volumes: Mount directories from your host system to the Docker container to share files and data.
  2. Networking: Configure Docker networks to allow containers to communicate with each other and with the host system.
  3. Environment Variables: Pass environment variables to the Docker container to configure the application.
  4. Build Arguments: Pass build-time arguments to the Docker build process to customize the image.

Here's an example of a Docker Compose file that demonstrates these configurations:

version: "3"
services:
  web:
    build:
      context: .
      args:
        - ENV=development
    ports:
      - 8080:80
    volumes:
      - ./app:/var/www/html
    environment:
      - DB_HOST=database
  database:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
volumes:
  db-data:

This Docker Compose file sets up a web service and a database service, with the following configurations:

  • The web service is built from a local Dockerfile, with a build-time argument ENV=development.
  • The web service mounts the ./app directory from the host to the /var/www/html directory in the container, allowing you to edit the application code directly on the host.
  • The web service and the database service are connected via a network, and the web service can access the database using the DB_HOST environment variable.
  • The database service uses a named volume db-data to persist the database data.

Managing Docker Containers

Once you have your development environment set up, you can use Docker commands to manage your containers. Here are some common commands:

  • docker run: Start a new container
  • docker stop: Stop a running container
  • docker rm: Remove a container
  • docker logs: View the logs of a container
  • docker exec: Execute a command inside a running container

For example, to start the web service from the Docker Compose file above, you can run:

docker-compose up -d web

This will start the web service in detached mode, allowing you to continue using the terminal.

Deploying a Web Server with Docker

Creating a Dockerfile

To deploy a web server using Docker, you first need to create a Dockerfile. A Dockerfile is a text file that contains the instructions for building a Docker image. Here's an example Dockerfile for a simple Nginx web server:

## Use the official Nginx image as the base image
FROM nginx:latest

## Copy the default Nginx configuration file
COPY default.conf /etc/nginx/conf.d/default.conf

## Copy the web application code to the container
COPY app/ /usr/share/nginx/html/

## Expose port 80 for HTTP traffic
EXPOSE 80

## Start the Nginx server
CMD ["nginx", "-g", "daemon off;"]

This Dockerfile:

  1. Uses the official Nginx image as the base image.
  2. Copies the default Nginx configuration file to the container.
  3. Copies the web application code to the container's web root directory.
  4. Exposes port 80 for HTTP traffic.
  5. Starts the Nginx server.

Building and Running the Docker Image

Once you have the Dockerfile, you can build the Docker image using the docker build command:

## Build the Docker image
docker build -t my-nginx-server .

This command builds the Docker image with the tag my-nginx-server using the Dockerfile in the current directory.

After the image is built, you can run a container based on the image using the docker run command:

## Run the Docker container
docker run -d -p 80:80 --name my-nginx-server my-nginx-server

This command:

  1. Runs the container in detached mode (-d).
  2. Maps port 80 on the host to port 80 in the container (-p 80:80).
  3. Assigns the name my-nginx-server to the container.
  4. Uses the my-nginx-server image to create the container.

Scaling and Load Balancing

To scale your web server, you can run multiple instances of the Docker container and use a load balancer to distribute the traffic across the instances. Here's an example of how you can do this using Docker Compose:

version: "3"
services:
  web:
    build: .
    ports:
      - 80:80
    deploy:
      replicas: 3
  load-balancer:
    image: nginx:latest
    ports:
      - 8080:80
    depends_on:
      - web
    configs:
      - source: nginx-config
        target: /etc/nginx/conf.d/default.conf
configs:
  nginx-config:
    file: ./nginx.conf

This Docker Compose file:

  1. Builds the web service using the Dockerfile in the current directory.
  2. Deploys three replicas of the web service.
  3. Runs an Nginx load balancer service that listens on port 8080 and forwards traffic to the web service instances.
  4. Mounts a custom Nginx configuration file to the load balancer container.

By using Docker Compose and load balancing, you can easily scale your web server and ensure high availability and fault tolerance.

Summary

By the end of this tutorial, you will have a solid understanding of Docker and how to use it to deploy a web server. You will learn to set up a Docker development environment, create a Docker container for your web server, and manage the deployment process. This knowledge will empower you to leverage the power of Docker for your web application development and deployment needs.

Other Docker Tutorials you may like