Comunicação Socket
Primeiro vamos criar um servidor importando a biblioteca socket, e fazer o bind no IP 0.0.0.0 e porta 12345 (escuta todas as interfaces). O servidor vai ficar em espera por mensagens de clientes. Ao receber vai enviar uma resposta de mensagem recebida.
# servidor_udp.py
import socket
servidor_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
servidor_socket.bind(("0.0.0.0", 12345))
print("Servidor UDP aguardando mensagens...")
while True:
mensagem, endereco = servidor_socket.recvfrom(1024)
print(f"Recebido de {endereco}: {mensagem.decode()}")
servidor_socket.sendto("Mensagem recebida com sucesso!".encode(), endereco)
O cliente por sua vez pega o endereço do servidor de uma variável de ambiente SERVER_HOST e envia mensagens para o servidor. Após cada envio espera a resposta do servidor.
# cliente_udp.py
import socket
import os
import time
HOST = os.getenv("SERVER_HOST", "servidor")
PORT = 12345
cliente_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for i in range(5):
mensagem = f"Mensagem {i+1} do cliente"
cliente_socket.sendto(mensagem.encode(), (HOST, PORT))
resposta, _ = cliente_socket.recvfrom(1024)
print("Resposta do servidor:", resposta.decode())
time.sleep(1)
cliente_socket.close()
O Dockerfile abaixo utiliza a imagem do python para executar o servidor. Copia todos os arquivos e executa o CMD de acordo com o docker-compose.
FROM python:3.11-slim
WORKDIR /app
COPY . .
CMD ["python", "servidor_udp.py"]
# Esse exemplo é para o servidor, o docker-compose usa o command para sobrescrever esse CMD
Por fim o docker-compose
orchestra esses containers de acordo com suas funções.
docker-compose
- Constrói a imagem localmente.
- Expõe a porta 12345/udp.
- Executa o servidor_udp.py.
- Conecta à rede rede_udp.
- Constrói a mesma imagem do servidor.
- Dependem do servidor (esperam ele iniciar).
- Usam SERVER_HOST=servidor (resolvido via DNS da rede Docker).
- Executam cliente_udp.py.
- Conecta à rede rede_udp.
- Garante que os serviços se vejam por nome (DNS Docker).
version: "3.9"
services:
servidor:
build:
context: .
container_name: servidor_udp
ports:
- "12345:12345/udp"
networks:
- rede_udp
command: python servidor_udp.py
cliente1:
build:
context: .
depends_on:
- servidor
environment:
- SERVER_HOST=servidor
networks:
- rede_udp
command: python cliente_udp.py
cliente2:
build:
context: .
depends_on:
- servidor
environment:
- SERVER_HOST=servidor
networks:
- rede_udp
command: python cliente_udp.py
cliente3:
build:
context: .
depends_on:
- servidor
environment:
- SERVER_HOST=servidor
networks:
- rede_udp
command: python cliente_udp.py
networks:
rede_udp:
driver: bridge
Para executar utilize docker-compose up --build