Arquitetura
Como o doknyu é organizado por dentro.
O doknyu é um único binário em Rust. A interface usa iced e a comunicação com o Docker usa bollard, sobre o runtime assíncrono tokio.
doknyu (1 binário)
├── UI (iced)
│ ├── app.rs estado + update
│ └── views/ containers · detalhe · volumes · redes · onboarding
├── Core (sem dependência de UI)
│ ├── docker/ trait DockerClient → bollard | fake
│ └── model.rs structs puros
└── /var/run/docker.sockPrincípios
Núcleo desacoplado da interface
docker::DockerClient é uma trait assíncrona que devolve tipos próprios de model.rs, nunca tipos do
bollard. Há duas implementações: a real (bollard) e uma falsa, em memória, usada nos testes e no modo
--features fake. Assim, quase toda a lógica é testada sem Docker.
Arquitetura Elm
O iced segue a arquitetura Elm: uma ação do usuário vira uma Message, o update altera o estado e
pode disparar uma Task, e o resultado da Task volta como outra Message. O estado fica em um lugar
só e cada mudança passa pelo mesmo caminho.
Tempo real sem polling
A interface assina o stream de eventos do Docker (docker events) e recarrega só a lista afetada
quando algo muda. Logs e estatísticas também chegam por stream.
Teclado como tabela pura
keymap.rs traduz uma tecla em uma ação com uma função pura, testável sem janela. A mesma tabela de
ações alimenta a paleta de comandos.
Terminal sem a CLI do Docker
A aba Terminal roda o próprio binário em modo ponte (doknyu --exec-bridge <container>) dentro de um
PTY. A ponte abre um exec pela API do Docker, como docker exec -it, e repassa entrada, saída e
tamanho da janela. Por isso o terminal funciona sem a CLI docker, inclusive dentro do sandbox do
Flatpak.
Stack
| Parte | Biblioteca |
|---|---|
| Interface | iced 0.14 (tokio, canvas) |
| API do Docker | bollard |
| Runtime | tokio |
| Terminal | iced_term |
| Erros | thiserror, anyhow |
| Idiomas | rust-i18n, sys-locale |
| Logs internos | tracing |
O design completo e o histórico de decisões estão em
docs/ no repositório.