Skip to content

Commit ddff8b9

Browse files
committed
feat: add container networks view to dashboard
Integrate a new component, ShowContainerNetworks, to display network details for each container in the dashboard. This includes a dialog that shows network information such as IP address, gateway, and MAC address, enhancing the container management capabilities.
1 parent 90f9791 commit ddff8b9

3 files changed

Lines changed: 129 additions & 0 deletions

File tree

apps/dokploy/components/dashboard/compose/containers/show-compose-containers.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
import { api } from "@/utils/api";
3939
import { ShowContainerConfig } from "@/components/dashboard/docker/config/show-container-config";
4040
import { ShowContainerMounts } from "@/components/dashboard/docker/mounts/show-container-mounts";
41+
import { ShowContainerNetworks } from "@/components/dashboard/docker/networks/show-container-networks";
4142
import { DockerTerminalModal } from "@/components/dashboard/docker/terminal/docker-terminal-modal";
4243

4344
const DockerLogsId = dynamic(
@@ -228,6 +229,10 @@ const ContainerRow = ({
228229
containerId={container.containerId}
229230
serverId={serverId || ""}
230231
/>
232+
<ShowContainerNetworks
233+
containerId={container.containerId}
234+
serverId={serverId || ""}
235+
/>
231236
<DockerTerminalModal
232237
containerId={container.containerId}
233238
serverId={serverId || ""}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import {
2+
Dialog,
3+
DialogContent,
4+
DialogDescription,
5+
DialogHeader,
6+
DialogTitle,
7+
DialogTrigger,
8+
} from "@/components/ui/dialog";
9+
import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
10+
import {
11+
Table,
12+
TableBody,
13+
TableCell,
14+
TableHead,
15+
TableHeader,
16+
TableRow,
17+
} from "@/components/ui/table";
18+
import { Badge } from "@/components/ui/badge";
19+
import { api } from "@/utils/api";
20+
21+
interface Props {
22+
containerId: string;
23+
serverId?: string;
24+
}
25+
26+
interface Network {
27+
IPAMConfig: unknown;
28+
Links: unknown;
29+
Aliases: string[] | null;
30+
MacAddress: string;
31+
NetworkID: string;
32+
EndpointID: string;
33+
Gateway: string;
34+
IPAddress: string;
35+
IPPrefixLen: number;
36+
IPv6Gateway: string;
37+
GlobalIPv6Address: string;
38+
GlobalIPv6PrefixLen: number;
39+
DriverOpts: unknown;
40+
}
41+
42+
export const ShowContainerNetworks = ({ containerId, serverId }: Props) => {
43+
const { data } = api.docker.getConfig.useQuery(
44+
{
45+
containerId,
46+
serverId,
47+
},
48+
{
49+
enabled: !!containerId,
50+
},
51+
);
52+
53+
const networks: Record<string, Network> =
54+
data?.NetworkSettings?.Networks ?? {};
55+
const entries = Object.entries(networks);
56+
57+
return (
58+
<Dialog>
59+
<DialogTrigger asChild>
60+
<DropdownMenuItem
61+
className="w-full cursor-pointer"
62+
onSelect={(e) => e.preventDefault()}
63+
>
64+
View Networks
65+
</DropdownMenuItem>
66+
</DialogTrigger>
67+
<DialogContent className="w-full md:w-[70vw] min-w-[70vw]">
68+
<DialogHeader>
69+
<DialogTitle>Container Networks</DialogTitle>
70+
<DialogDescription>
71+
Networks attached to this container
72+
</DialogDescription>
73+
</DialogHeader>
74+
<div className="overflow-auto max-h-[70vh]">
75+
{entries.length === 0 ? (
76+
<div className="text-center text-muted-foreground py-8">
77+
No networks found for this container.
78+
</div>
79+
) : (
80+
<Table>
81+
<TableHeader>
82+
<TableRow>
83+
<TableHead>Network</TableHead>
84+
<TableHead>IP Address</TableHead>
85+
<TableHead>Gateway</TableHead>
86+
<TableHead>MAC Address</TableHead>
87+
<TableHead>Aliases</TableHead>
88+
</TableRow>
89+
</TableHeader>
90+
<TableBody>
91+
{entries.map(([name, network]) => (
92+
<TableRow key={name}>
93+
<TableCell>
94+
<Badge variant="outline">{name}</Badge>
95+
</TableCell>
96+
<TableCell className="font-mono text-xs">
97+
{network.IPAddress
98+
? `${network.IPAddress}/${network.IPPrefixLen}`
99+
: "-"}
100+
</TableCell>
101+
<TableCell className="font-mono text-xs">
102+
{network.Gateway || "-"}
103+
</TableCell>
104+
<TableCell className="font-mono text-xs">
105+
{network.MacAddress || "-"}
106+
</TableCell>
107+
<TableCell className="text-xs">
108+
{network.Aliases?.join(", ") || "-"}
109+
</TableCell>
110+
</TableRow>
111+
))}
112+
</TableBody>
113+
</Table>
114+
)}
115+
</div>
116+
</DialogContent>
117+
</Dialog>
118+
);
119+
};

apps/dokploy/components/dashboard/docker/show/columns.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
import { ShowContainerConfig } from "../config/show-container-config";
1212
import { ShowDockerModalLogs } from "../logs/show-docker-modal-logs";
1313
import { ShowContainerMounts } from "../mounts/show-container-mounts";
14+
import { ShowContainerNetworks } from "../networks/show-container-networks";
1415
import { RemoveContainerDialog } from "../remove/remove-container";
1516
import { DockerTerminalModal } from "../terminal/docker-terminal-modal";
1617
import { UploadFileModal } from "../upload/upload-file-modal";
@@ -128,6 +129,10 @@ export const columns: ColumnDef<Container>[] = [
128129
containerId={container.containerId}
129130
serverId={container.serverId || ""}
130131
/>
132+
<ShowContainerNetworks
133+
containerId={container.containerId}
134+
serverId={container.serverId || ""}
135+
/>
131136
<DockerTerminalModal
132137
containerId={container.containerId}
133138
serverId={container.serverId || ""}

0 commit comments

Comments
 (0)