Skip to content

Commit 6c6c079

Browse files
committed
Add initial implementation of Docker socket manager library
- Introduced SocketType enum for connection types (LOCAL, REMOTE_SSH) - Created DockerConnectionException for handling connection failures - Implemented DockerSocketConfig as a value object for connection parameters - Added DockerConnection interface and its implementations for local and SSH connections - Developed utility class DockerEnvironmentDetector for environment detection - Established CHANGELOG and README for project documentation
1 parent ef21564 commit 6c6c079

21 files changed

Lines changed: 1850 additions & 57 deletions

.github/social.html

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>docker-socket-manager – Social Preview</title>
7+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Space+Grotesk:wght@300;400;600&display=swap" rel="stylesheet">
8+
<style>
9+
* { margin: 0; padding: 0; box-sizing: border-box; }
10+
11+
body {
12+
width: 1280px;
13+
height: 640px;
14+
overflow: hidden;
15+
background: #0a0e17;
16+
font-family: 'Space Grotesk', sans-serif;
17+
display: flex;
18+
align-items: center;
19+
justify-content: center;
20+
}
21+
22+
.bg {
23+
position: absolute;
24+
inset: 0;
25+
background:
26+
radial-gradient(ellipse 60% 50% at 70% 50%, rgba(0,180,255,0.06) 0%, transparent 70%),
27+
radial-gradient(ellipse 40% 60% at 10% 80%, rgba(0,100,200,0.07) 0%, transparent 60%);
28+
}
29+
30+
/* subtle grid */
31+
.grid {
32+
position: absolute;
33+
inset: 0;
34+
background-image:
35+
linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
36+
linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px);
37+
background-size: 48px 48px;
38+
mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 30%, transparent 100%);
39+
}
40+
41+
.container {
42+
position: relative;
43+
display: flex;
44+
align-items: center;
45+
gap: 80px;
46+
padding: 0 80px;
47+
width: 100%;
48+
}
49+
50+
/* LEFT */
51+
.left {
52+
flex: 1;
53+
display: flex;
54+
flex-direction: column;
55+
gap: 20px;
56+
}
57+
58+
.badge {
59+
display: inline-flex;
60+
align-items: center;
61+
gap: 8px;
62+
border: 1px solid rgba(0,180,255,0.3);
63+
border-radius: 4px;
64+
padding: 4px 12px;
65+
width: fit-content;
66+
font-family: 'JetBrains Mono', monospace;
67+
font-size: 11px;
68+
color: rgba(0,180,255,0.8);
69+
letter-spacing: 0.05em;
70+
background: rgba(0,180,255,0.05);
71+
}
72+
73+
.badge::before {
74+
content: '';
75+
width: 6px;
76+
height: 6px;
77+
border-radius: 50%;
78+
background: #00b4ff;
79+
box-shadow: 0 0 6px #00b4ff;
80+
}
81+
82+
.title {
83+
font-family: 'JetBrains Mono', monospace;
84+
font-size: 52px;
85+
font-weight: 700;
86+
line-height: 1.05;
87+
color: #e8edf5;
88+
letter-spacing: -0.02em;
89+
}
90+
91+
.title .accent { color: #00b4ff; }
92+
93+
.subtitle {
94+
font-size: 15px;
95+
color: rgba(200,210,230,0.55);
96+
line-height: 1.6;
97+
font-weight: 300;
98+
max-width: 360px;
99+
}
100+
101+
.tags {
102+
display: flex;
103+
flex-wrap: wrap;
104+
gap: 8px;
105+
margin-top: 4px;
106+
}
107+
108+
.tag {
109+
font-family: 'JetBrains Mono', monospace;
110+
font-size: 11px;
111+
color: rgba(200,220,255,0.5);
112+
border: 1px solid rgba(200,220,255,0.12);
113+
border-radius: 3px;
114+
padding: 3px 10px;
115+
background: rgba(255,255,255,0.02);
116+
}
117+
118+
.github {
119+
font-family: 'JetBrains Mono', monospace;
120+
font-size: 11px;
121+
color: rgba(120,140,170,0.6);
122+
margin-top: 8px;
123+
}
124+
125+
/* RIGHT — code card */
126+
.card {
127+
width: 460px;
128+
flex-shrink: 0;
129+
background: #111720;
130+
border: 1px solid rgba(255,255,255,0.07);
131+
border-radius: 10px;
132+
overflow: hidden;
133+
box-shadow:
134+
0 0 0 1px rgba(0,180,255,0.08),
135+
0 24px 64px rgba(0,0,0,0.6),
136+
0 0 80px rgba(0,180,255,0.04);
137+
}
138+
139+
.card-header {
140+
background: #0d131d;
141+
padding: 10px 14px;
142+
display: flex;
143+
align-items: center;
144+
gap: 8px;
145+
border-bottom: 1px solid rgba(255,255,255,0.05);
146+
}
147+
148+
.dot { width: 10px; height: 10px; border-radius: 50%; }
149+
.dot.r { background: #ff5f57; }
150+
.dot.y { background: #febc2e; }
151+
.dot.g { background: #28c840; }
152+
153+
.card-filename {
154+
font-family: 'JetBrains Mono', monospace;
155+
font-size: 11px;
156+
color: rgba(180,200,230,0.4);
157+
margin-left: 4px;
158+
}
159+
160+
.card-body {
161+
padding: 20px 22px;
162+
font-family: 'JetBrains Mono', monospace;
163+
font-size: 12.5px;
164+
line-height: 1.75;
165+
color: #8899bb;
166+
}
167+
168+
.line { display: block; }
169+
.kw { color: #569cd6; }
170+
.cl { color: #4ec9b0; }
171+
.fn { color: #dcdcaa; }
172+
.str { color: #ce9178; }
173+
.num { color: #b5cea8; }
174+
.cm { color: #4a5568; }
175+
.ch { color: #e8edf5; }
176+
.op { color: #9cdcfe; }
177+
.ind { padding-left: 18px; }
178+
.ind2 { padding-left: 36px; }
179+
.ind3 { padding-left: 54px; }
180+
</style>
181+
</head>
182+
<body>
183+
<div class="bg"></div>
184+
<div class="grid"></div>
185+
186+
<div class="container">
187+
<div class="left">
188+
<div class="badge">@Java Library · v0.1.0</div>
189+
190+
<div class="title">
191+
docker<span class="accent">-socket</span><br>manager
192+
</div>
193+
194+
<div class="subtitle">
195+
Connect to Docker daemons over local Unix sockets or remote SSH tunnels.<br>
196+
Automatic socat relay · connection pooling · Spring Boot ready.
197+
</div>
198+
199+
<div class="tags">
200+
<span class="tag">SSH Tunnel</span>
201+
<span class="tag">socat</span>
202+
<span class="tag">docker-java</span>
203+
<span class="tag">Connection Pool</span>
204+
<span class="tag">Maven Package</span>
205+
</div>
206+
207+
<div class="github">github.com/nomad4tech/docker-socket-manager</div>
208+
</div>
209+
210+
<div class="card">
211+
<div class="card-header">
212+
<div class="dot r"></div>
213+
<div class="dot y"></div>
214+
<div class="dot g"></div>
215+
<span class="card-filename">DockerBackupJob.java</span>
216+
</div>
217+
<div class="card-body">
218+
<span class="line cm">// connect to remote Docker via SSH</span>
219+
<span class="line"><span class="cl">DockerSocketConfig</span> <span class="op">config</span> <span class="ch">=</span> <span class="cl">DockerSocketConfig</span></span>
220+
<span class="line ind"><span class="ch">.</span><span class="fn">builder</span><span class="ch">()</span></span>
221+
<span class="line ind"><span class="ch">.</span><span class="fn">id</span><span class="ch">(</span><span class="num">1L</span><span class="ch">)</span></span>
222+
<span class="line ind"><span class="ch">.</span><span class="fn">type</span><span class="ch">(</span><span class="cl">SocketType</span><span class="ch">.</span><span class="op">REMOTE_SSH</span><span class="ch">)</span></span>
223+
<span class="line ind"><span class="ch">.</span><span class="fn">sshHost</span><span class="ch">(</span><span class="str">"prod-01.example.com"</span><span class="ch">)</span></span>
224+
<span class="line ind"><span class="ch">.</span><span class="fn">sshPrivateKeyPath</span><span class="ch">(</span><span class="str">"~/.ssh/id_rsa"</span><span class="ch">)</span></span>
225+
<span class="line ind"><span class="ch">.</span><span class="fn">remoteSocatPort</span><span class="ch">(</span><span class="num">2375</span><span class="ch">)</span></span>
226+
<span class="line ind"><span class="ch">.</span><span class="fn">build</span><span class="ch">();</span></span>
227+
<span class="line"> </span>
228+
<span class="line"><span class="cl">DockerClient</span> <span class="op">client</span> <span class="ch">=</span></span>
229+
<span class="line ind"><span class="op">service</span><span class="ch">.</span><span class="fn">getClient</span><span class="ch">(</span><span class="num">1L</span><span class="ch">,</span> <span class="op">config</span><span class="ch">);</span></span>
230+
<span class="line"> </span>
231+
<span class="line"><span class="op">client</span><span class="ch">.</span><span class="fn">execCreateCmd</span><span class="ch">(</span><span class="op">containerId</span><span class="ch">)</span></span>
232+
<span class="line ind"><span class="ch">.</span><span class="fn">withCmd</span><span class="ch">(</span><span class="str">"pg_dump"</span><span class="ch">,</span> <span class="str">"-Fc"</span><span class="ch">,</span> <span class="str">"mydb"</span><span class="ch">)</span></span>
233+
<span class="line ind"><span class="ch">.</span><span class="fn">exec</span><span class="ch">();</span></span>
234+
</div>
235+
</div>
236+
</div>
237+
</body>
238+
</html>

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [0.1.0] - 2026-03-19
9+
10+
### Added
11+
- `DockerSocketService` - connection pool for local and remote Docker sockets
12+
- `LOCAL` connection type via Unix socket
13+
- `REMOTE_SSH` connection type via SSH tunnel with automatic socat relay management
14+
- Automatic socat process lifecycle - starts if not running, kills on disconnect
15+
- Connection health check via Docker ping (`isAlive`, `evict`)
16+
- `DockerEnvironmentDetector` - detects Docker container environment and socket availability
17+
- `DockerSocketConfig` - value object for connection parameters (builder API)
18+
- `DockerConnectionException` - typed exception for connection failures

0 commit comments

Comments
 (0)