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
- 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.
- 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.
- Escalabilidade Melhorada: O Docker facilita a escala de aplicações para cima ou para baixo, conforme necessário, criando e gerindo múltiplos contentores.
- 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:
- Cliente Docker: A interface de utilizador que permite interagir com o daemon Docker.
- Daemon Docker: O processo em segundo plano que gere objetos Docker, como imagens, contentores, redes e volumes.
- 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.
- 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.
- 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:
- Montando Volumes: Monte diretórios do seu sistema hospedeiro no contentor Docker para partilhar ficheiros e dados.
- Rede: Configure redes Docker para permitir que os contentores comuniquem entre si e com o sistema hospedeiro.
- Variáveis de Ambiente: Passe variáveis de ambiente para o contentor Docker para configurar a aplicação.
- 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
./appdo hospedeiro para o diretório/var/www/htmlno 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-datapara 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 contentordocker stop: Parar um contentor em execuçãodocker rm: Remover um contentordocker logs: Visualizar os logs de um contentordocker 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:
- Usa a imagem oficial do Nginx como imagem base.
- Copia o ficheiro de configuração padrão do Nginx para o contentor.
- Copia o código da aplicação web para o diretório raiz web do contentor.
- Expoe a porta 80 para tráfego HTTP.
- 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:
- Executa o contentor em modo desacoplado (
-d). - Mapeia a porta 80 no hospedeiro para a porta 80 no contentor (
-p 80:80). - Atribui o nome
my-nginx-serverao contentor. - Usa a imagem
my-nginx-serverpara 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:
- Constrói o serviço
webusando o Dockerfile no diretório atual. - Implanta três réplicas do serviço
web. - 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. - 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.



