Como implantar um servidor web usando Docker

DockerBeginner
Pratique Agora

Introdução

Docker é uma plataforma de contentores amplamente adotada que simplifica a implantação e a gestão de aplicações. Neste tutorial, aprenderá a implantar um servidor web usando Docker, explorando os benefícios da contenorização e configurando um ambiente de desenvolvimento Docker.

Compreendendo o Docker

O que é o Docker?

Docker é uma plataforma de código aberto que permite aos desenvolvedores construir, implantar e executar aplicações num ambiente de contentores. Os contentores são pacotes leves, autónomos e executáveis que incluem tudo o que é necessário para executar uma aplicação, incluindo o código, o tempo de execução, as ferramentas de sistema e as bibliotecas. O Docker fornece uma forma consistente e fiável de empacotar e distribuir aplicações, tornando mais fácil o desenvolvimento, teste e implantação de software.

Benefícios do Uso do Docker

  1. Ambientes Consistentes: Os contentores Docker garantem que as aplicações funcionam da mesma forma, independentemente da infraestrutura subjacente, proporcionando um ambiente de desenvolvimento e implantação consistente e fiável.
  2. Aumento da Eficiência: Os contentores Docker são leves e podem ser iniciados e parados rapidamente, permitindo um uso mais eficiente dos recursos do sistema em comparação com as máquinas virtuais tradicionais.
  3. Escalabilidade Melhorada: O Docker facilita a escala de aplicações para cima ou para baixo, conforme necessário, criando e gerindo múltiplos contentores.
  4. Portabilidade Melhorada: Os contentores Docker podem ser partilhados e implantados facilmente em diferentes plataformas e ambientes, tornando mais fácil mover aplicações entre desenvolvimento, teste e produção.

Arquitetura do Docker

A arquitetura do Docker consiste nos seguintes componentes principais:

  1. Cliente Docker: A interface de utilizador que permite interagir com o daemon Docker.
  2. Daemon Docker: O processo em segundo plano que gere objetos Docker, como imagens, contentores, redes e volumes.
  3. Imagens Docker: Ficheiros imutáveis que contêm o código, o tempo de execução, as ferramentas de sistema, as bibliotecas e as dependências necessárias para executar uma aplicação.
  4. Contentores Docker: Instâncias executáveis de imagens Docker, que são isoladas e têm o seu próprio sistema de ficheiros, rede e espaço de processos.
  5. Registo Docker: Um repositório para armazenar e distribuir imagens Docker.
graph TD A[Cliente Docker] --> B[Daemon Docker] B --> C[Imagens Docker] B --> D[Contentores Docker] B --> E[Registo Docker]

Começando com o Docker

Para começar com o Docker, precisará de instalar o motor Docker no seu sistema. O processo de instalação varia dependendo do seu sistema operativo, mas normalmente pode encontrar as instruções no site oficial do Docker.

Depois de ter o Docker instalado, pode começar a usá-lo para construir e executar as suas aplicações. Aqui está um exemplo simples de execução de um servidor web Nginx usando Docker:

## Extrair a imagem Nginx do registo Docker
docker pull nginx

## Executar o contentor Nginx
docker run -d -p 80:80 --name my-nginx nginx

Este comando extrai a imagem Nginx do registo Docker e, em seguida, executa um novo contentor baseado nessa imagem, expondo a porta 80 no host para a porta 80 no contentor.

Configurando um Ambiente de Desenvolvimento Docker

Instalando o Docker

Para configurar um ambiente de desenvolvimento Docker, primeiro precisa de instalar o motor Docker no seu sistema. Veja como fazer isso no Ubuntu 22.04:

## Atualizar o índice de pacotes
sudo apt-get update

## Instalar pacotes para permitir que o apt utilize um repositório via HTTPS
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

## Adicionar a chave GPG oficial do Docker
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

## Configurar o repositório Docker
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

## Instalar o Docker Engine, containerd e Docker Compose
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Configurando o Docker para Desenvolvimento

Após instalar o Docker, pode configurá-lo para o seu ambiente de desenvolvimento. Aqui estão algumas configurações comuns:

  1. Montando Volumes: Monte diretórios do seu sistema hospedeiro no contentor Docker para partilhar ficheiros e dados.
  2. Rede: Configure redes Docker para permitir que os contentores comuniquem entre si e com o sistema hospedeiro.
  3. Variáveis de Ambiente: Passe variáveis de ambiente para o contentor Docker para configurar a aplicação.
  4. Argumentos de Construção: Passe argumentos de tempo de construção para o processo de construção Docker para personalizar a imagem.

Aqui está um exemplo de um ficheiro Docker Compose que demonstra estas configurações:

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:

Este ficheiro Docker Compose configura um serviço web e um serviço de base de dados, com as seguintes configurações:

  • O serviço web é construído a partir de um Dockerfile local, com um argumento de tempo de construção ENV=development.
  • O serviço web monta o diretório ./app do hospedeiro para o diretório /var/www/html no contentor, permitindo editar o código da aplicação diretamente no hospedeiro.
  • O serviço web e o serviço de base de dados estão conectados através de uma rede, e o serviço web pode aceder à base de dados usando a variável de ambiente DB_HOST.
  • O serviço de base de dados utiliza um volume nomeado db-data para persistir os dados da base de dados.

Gerenciando Contentores Docker

Depois de configurar o seu ambiente de desenvolvimento, pode usar comandos Docker para gerir os seus contentores. Aqui estão alguns comandos comuns:

  • docker run: Iniciar um novo contentor
  • docker stop: Parar um contentor em execução
  • docker rm: Remover um contentor
  • docker logs: Visualizar os logs de um contentor
  • docker exec: Executar um comando dentro de um contentor em execução

Por exemplo, para iniciar o serviço web do ficheiro Docker Compose acima, pode executar:

docker-compose up -d web

Isto iniciará o serviço web em modo desacoplado, permitindo continuar a usar o terminal.

Implantando um Servidor Web com Docker

Criando um Dockerfile

Para implantar um servidor web usando Docker, primeiro precisa criar um Dockerfile. Um Dockerfile é um ficheiro de texto que contém as instruções para construir uma imagem Docker. Aqui está um exemplo de Dockerfile para um servidor web Nginx simples:

## Usar a imagem oficial do Nginx como imagem base
FROM nginx:latest

## Copiar o ficheiro de configuração padrão do Nginx
COPY default.conf /etc/nginx/conf.d/default.conf

## Copiar o código da aplicação web para o contentor
COPY app/ /usr/share/nginx/html/

## Expor a porta 80 para tráfego HTTP
EXPOSE 80

## Iniciar o servidor Nginx
CMD ["nginx", "-g", "daemon off;"]

Este Dockerfile:

  1. Usa a imagem oficial do Nginx como imagem base.
  2. Copia o ficheiro de configuração padrão do Nginx para o contentor.
  3. Copia o código da aplicação web para o diretório raiz web do contentor.
  4. Expoe a porta 80 para tráfego HTTP.
  5. Inicia o servidor Nginx.

Construindo e Executando a Imagem Docker

Depois de ter o Dockerfile, pode construir a imagem Docker usando o comando docker build:

## Construir a imagem Docker
docker build -t my-nginx-server .

Este comando constrói a imagem Docker com a etiqueta my-nginx-server usando o Dockerfile no diretório atual.

Após a construção da imagem, pode executar um contentor baseado na imagem usando o comando docker run:

## Executar o contentor Docker
docker run -d -p 80:80 --name my-nginx-server my-nginx-server

Este comando:

  1. Executa o contentor em modo desacoplado (-d).
  2. Mapeia a porta 80 no hospedeiro para a porta 80 no contentor (-p 80:80).
  3. Atribui o nome my-nginx-server ao contentor.
  4. Usa a imagem my-nginx-server para criar o contentor.

Escalonamento e Equilíbrio de Carga

Para escalar o seu servidor web, pode executar múltiplas instâncias do contentor Docker e usar um balanceador de carga para distribuir o tráfego pelas instâncias. Aqui está um exemplo de como pode fazer isto usando 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

Este ficheiro Docker Compose:

  1. Constrói o serviço web usando o Dockerfile no diretório atual.
  2. Implanta três réplicas do serviço web.
  3. Executa um serviço de balanceador de carga Nginx que ouve na porta 8080 e encaminha o tráfego para as instâncias do serviço web.
  4. Monta um ficheiro de configuração Nginx personalizado para o contentor do balanceador de carga.

Usando Docker Compose e balanceamento de carga, pode facilmente escalar o seu servidor web e garantir alta disponibilidade e tolerância a falhas.

Resumo

Ao final deste tutorial, terá um conhecimento sólido do Docker e como utilizá-lo para implantar um servidor web. Irá aprender a configurar um ambiente de desenvolvimento Docker, criar um contentor Docker para o seu servidor web e gerir o processo de implantação. Este conhecimento irá permitir-lhe tirar partido do poder do Docker para as suas necessidades de desenvolvimento e implantação de aplicações web.