Impressora Zebra ZD230 — Rede e Docker¶
Configuração de rede para comunicação entre o container Docker e a impressora Zebra ZD230 via socket TCP.
Topologia¶
┌──────────────────────────────────────────┐
│ Servidor laser-estoque │
│ enp1s0: 10.42.0.x │
│ │
│ ┌─────────────────────┐ │
│ │ Container web │ │
│ │ network_mode: host │──TCP:9100──→ │
│ └─────────────────────┘ │ │
└─────────────────────────────────────│────┘
│
↓
┌──────────────┐
│ Zebra ZD230 │
│ 10.42.0.216 │
│ Porta: 9100 │
└──────────────┘
Por que network_mode: host?¶
O Django precisa enviar comandos ZPL diretamente para a impressora via socket TCP (10.42.0.216:9100). Essa impressora está na rede local física (10.42.0.0/24), conectada na interface enp1s0 do servidor.
Com a rede Docker padrão (bridge), o container não consegue alcançar dispositivos na LAN física. As alternativas seriam:
| Abordagem | Prós | Contras |
|---|---|---|
network_mode: host ✅ |
Simples, acesso direto à LAN | Menos isolamento |
macvlan |
Container com IP próprio na LAN | Complexo, problemas com DHCP |
| Docker network + rota estática | Mais isolado | Requer config no router |
| Proxy TCP no host | Isolamento total | Mais um serviço para manter |
Para um sistema interno em rede controlada, network_mode: host é a solução mais simples e confiável.
Impacto no docker-compose¶
Como o container web usa rede host, ele se comunica com o PostgreSQL via 127.0.0.1:5432 (o DB publica a porta nesse endereço). O Nginx também precisa de network_mode: host para acessar o Gunicorn em 127.0.0.1:8000.
# docker-compose.prod.yml (trechos relevantes)
services:
db:
ports:
- "127.0.0.1:5432:5432" # Acessível apenas no host
web:
network_mode: host # Acessa LAN + DB via 127.0.0.1
nginx:
network_mode: host # Acessa Gunicorn via 127.0.0.1
Configuração da Impressora¶
Dados de conexão¶
| Parâmetro | Valor |
|---|---|
| IP | 10.42.0.216 |
| Porta | 9100 (RAW/TCP) |
| Protocolo | ZPL (Zebra Programming Language) |
| Modelo | Zebra ZD230 |
| Interface | Ethernet |
Testar conectividade¶
Do servidor (host):
# Ping
ping -c 3 10.42.0.216
# Testar porta TCP
nc -zv 10.42.0.216 9100
# Enviar ZPL de teste
echo '^XA^FO50,50^ADN,36,20^FDTeste^FS^XZ' | nc 10.42.0.216 9100
De dentro do container:
docker exec -it laserlab_web bash
apt-get update && apt-get install -y netcat-openbsd
nc -zv 10.42.0.216 9100
No Django¶
A impressão é feita via socket TCP direto:
import socket
def print_zpl(zpl_code: str, host: str = "10.42.0.216", port: int = 9100):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(10)
s.connect((host, port))
s.sendall(zpl_code.encode())
O IP e porta da impressora são configurados no model Printer (app labels).
Troubleshooting¶
Container não alcança a impressora¶
- Verificar que
network_mode: hostestá nodocker-compose.prod.yml - Testar do host primeiro:
nc -zv 10.42.0.216 9100 - Se o host alcança mas o container não →
network_modenão está aplicado
Impressora não responde¶
- Verificar se está ligada e conectada à rede
- Verificar IP: pode ter mudado se usa DHCP (fixar IP no router/switch)
- Reiniciar a impressora (desligar/ligar)
- Verificar no painel da Zebra:
Menu → Rede → TCP/IP
Timeout na impressão¶
- A impressora pode estar em sleep mode
- Aumentar o timeout do socket (atualmente 10s)
- Verificar se há fila de impressão travada (reiniciar impressora)