Introdução
Docker é uma plataforma poderosa para construir, implantar e executar aplicações num ambiente de contentores. Neste tutorial, aprenderá a executar uma aplicação personalizada num contêiner Docker e expor uma porta personalizada para acesso externo. No final deste guia, terá uma compreensão sólida de como tirar partido do Docker para implantar as suas aplicações com maior flexibilidade e controlo.
Introdução ao Docker e aos Contêineres
Docker é uma plataforma de código aberto popular que permite o desenvolvimento, implantação e gestão de aplicações usando contentores. Os contentores são pacotes de software leves, autónomos e executáveis que incluem tudo o que uma aplicação precisa para funcionar, incluindo o código, o tempo de execução, as ferramentas de sistema e as bibliotecas.
O que é o Docker?
Docker é uma ferramenta concebida para facilitar a criação, implantação e execução de aplicações usando contentores. Os contentores permitem que um desenvolvedor empacote uma aplicação com todas as suas partes necessárias, como bibliotecas e outras dependências, e a envie como um único pacote.
Benefícios do Uso do Docker
- Consistência: Os contentores garantem que a sua aplicação funcionará da mesma forma, independentemente do ambiente em que é implantada.
- Escalabilidade: Os contentores podem ser facilmente escalados para cima ou para baixo para atender às necessidades da sua aplicação.
- Portabilidade: Os contentores podem ser executados em qualquer sistema que tenha o Docker instalado, facilitando a movimentação da sua aplicação entre diferentes ambientes.
- Eficiência: Os contentores são leves e utilizam menos recursos do que as máquinas virtuais, tornando-os mais eficientes na execução.
Arquitetura do Docker
Docker utiliza uma arquitetura cliente-servidor, onde o cliente Docker comunica com o daemon Docker, que é responsável por construir, executar e distribuir contentores Docker.
graph LD
subgraph Arquitetura Docker
client((Cliente Docker))
daemon((Daemon Docker))
registry((Registo Docker))
client --> daemon
daemon --> registry
end
Contêineres Docker
Os contentores Docker são os blocos de construção básicos do Docker. Um contêiner é uma unidade de software padrão que empacota o código e todas as suas dependências, de modo que a aplicação execute de forma rápida e fiável de um ambiente informático para outro.
graph LD
subgraph Contêiner Docker
app((Aplicação))
runtime((Tempo de execução))
libs((Bibliotecas))
bin((Binários))
end
Imagens Docker
As imagens Docker são a base para os contentores. Uma imagem é um pacote de software leve, autónomo e executável que inclui tudo o que é necessário para executar uma aplicação: o código, um tempo de execução, bibliotecas, variáveis de ambiente e ficheiros de configuração.
Executando uma Aplicação Personalizada no Docker
Criando uma Imagem Docker Personalizada
Para executar uma aplicação personalizada num contêiner Docker, primeiro precisa de criar uma imagem Docker para a sua aplicação. Isto pode ser feito usando um Dockerfile, que é um documento de texto que contém todos os comandos que um utilizador poderia chamar na linha de comandos para montar uma imagem.
Eis um exemplo de Dockerfile para uma aplicação web Flask simples:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Este Dockerfile:
- Inicia a partir da imagem base
python:3.9-slim - Define o diretório de trabalho para
/app - Copia o ficheiro
requirements.txte instala os pacotes Python necessários - Copia o código da aplicação para o contêiner
- Especifica o comando para executar a aplicação (
python app.py)
Construindo e Executando a Imagem Docker
Depois de ter o Dockerfile, pode construir a imagem Docker usando o comando docker build:
docker build -t my-flask-app .
Isto criará uma nova imagem Docker com a etiqueta my-flask-app.
Para executar a aplicação num contêiner Docker, utilize o comando docker run:
docker run -p 5000:5000 my-flask-app
Isto iniciará um novo contêiner baseado na imagem my-flask-app e mapeará a porta 5000 no host para a porta 5000 no contêiner.
Verificando a Aplicação
Agora pode aceder à aplicação em execução no seu navegador web visitando http://localhost:5000. Deverá ver o resultado da sua aplicação Flask.
Expondo uma Porta Personalizada
Por defeito, quando se executa um contêiner Docker, este está isolado do sistema anfitrião e da sua rede. Se a sua aplicação estiver a ser executada numa porta específica dentro do contêiner, é necessário expor essa porta ao sistema anfitrião para poder aceder à aplicação de fora do contêiner.
Expondo uma Porta
Para expor uma porta de um contêiner Docker, pode usar a opção -p ou --publish ao executar o comando docker run. A sintaxe é:
docker run -p <porta_anfitrião>:<porta_contêiner> <nome_imagem>
Por exemplo, se a sua aplicação estiver a ser executada na porta 8000 dentro do contêiner, pode expô-la à porta 80 no sistema anfitrião assim:
docker run -p 80:8000 my-app
Isto irá mapear a porta 80 no sistema anfitrião para a porta 8000 dentro do contêiner.
Verificando a Porta Exposta
Pode verificar se a porta foi exposta corretamente, verificando a saída do comando docker run, que deverá mostrar as portas mapeadas:
$ docker run -p 80:8000 my-app
* Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
Alternativamente, pode usar o comando docker port para listar as portas mapeadas para um contêiner em execução:
$ docker port <id_contêiner>
8000/tcp -> 0.0.0.0:80
Isto mostra que a porta 8000 dentro do contêiner está mapeada para a porta 80 no sistema anfitrião.
Agora, pode aceder à sua aplicação visitando http://localhost (ou o endereço IP do sistema anfitrião) no seu navegador web.
Resumo
Neste tutorial, aprendeu a executar uma aplicação personalizada num contêiner Docker e expor uma porta personalizada para acesso externo. Ao encapsular a sua aplicação em contêineres, pode garantir implementações consistentes e fiáveis, bem como a capacidade de escalar e gerir a sua aplicação de forma mais eficiente. A tecnologia de contentoresização do Docker fornece uma plataforma poderosa para os desenvolvedores construírem, distribuírem e executarem as suas aplicações de forma mais simplificada e eficiente.



