Procházet zdrojové kódy

docs: add Chapter 1 - Docker pre-configuration and todo plan

yangyi před 2 dny
revize
fe70a606d3

+ 39 - 0
.gitignore

@@ -0,0 +1,39 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+.kotlin
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 10 - 0
.idea/.gitignore

@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/

+ 14 - 0
.idea/misc.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 7 - 0
.idea/vcs.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 150 - 0
docker-java-sdk-tutorial.md

@@ -0,0 +1,150 @@
+# Docker Java SDK 使用教程
+
+> Solomon Hykes — Docker 创始人
+>
+> Docker 提供了一个核心的抽象层,让你可以在任何基础设施上运行任何应用。这种抽象层的本质是:将应用的运行环境打包成一个标准化的单元,这个单元可以在任何地方运行。
+
+那么,从这章开始,就让我们来感受一下,Docker Java SDK 为我们带来了什么。
+
+***
+
+## 前置Docker配置
+
+在使用 Docker Java SDK 之前,我们需要确保本机的 Docker 环境已经正确配置。SDK 通过 Unix socket 或 TCP 协议与 Docker daemon 通信,因此需要根据实际情况选择合适的连接方式并完成相应配置。
+
+### 用户组配置
+
+默认情况下,Docker daemon 的 Unix socket 文件 `/var/run/docker.sock` 的所有者是 `root` 用户,所属组是 `docker`。如果当前用户没有 `docker` 用户组的权限,在连接 Docker 时会遇到权限拒绝的问题:
+
+```
+permission denied while trying to connect to the Docker daemon socket
+```
+
+解决方法是将当前用户添加到 `docker` 用户组中:
+
+```bash
+# 将当前用户添加到 docker 用户组
+sudo usermod -aG docker $USER
+
+# 查看当前用户所属 groups
+groups
+
+# 如果 usermod 不生效,可以尝试 newgrp 刷新组信息
+newgrp docker
+```
+
+添加完成后,需要**重新登录系统**或**重启系统**让修改生效。我们可以通过以下命令验证是否配置成功:
+
+```bash
+# 查看 docker.sock 文件的权限
+ls -la /var/run/docker.sock
+
+# 输出示例:srw-rw---- 1 root docker 0 Sep 15 10:00 /var/run/docker.sock
+# 注意权限中的 's' 表示 socket 文件,所属组为 docker
+```
+
+**思考:** 为什么 Docker 选择使用 Unix socket 而不是普通的文件来进行通信?
+
+Unix socket 是一种进程间通信(IPC)机制,相比 TCP 连接,它在同一台机器上的通信效率更高,且不需要经过网络协议栈,安全性也更好。因此 Docker daemon 默认监听 Unix socket 作为主要的通信方式。
+
+### 网络协议配置
+
+Docker Java SDK 支持两种连接协议:**Unix socket** 和 **TCP**。
+
+#### Unix socket 协议
+
+Unix socket 是默认的连接方式,适用于 Docker daemon 运行在本机的场景。SDK 通过以下地址连接:
+
+```
+unix:///var/run/docker.sock
+```
+
+这种方式的优点是无需额外配置,安全性高(通过文件权限控制访问),但缺点是只能连接本机的 Docker daemon。
+
+#### TCP 协议
+
+当需要远程连接 Docker daemon 时,需要使用 TCP 协议。这要求 Docker daemon 启动时开启 TCP 端口监听。
+
+**方法一:修改 Docker daemon 启动参数**
+
+在 `/etc/docker/daemon.json` 中添加配置:
+
+```json
+{
+  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
+}
+```
+
+**方法二:修改 systemd service 配置**
+
+创建或编辑 systemd 配置文件:
+
+```bash
+sudo mkdir -p /etc/systemd/system/docker.service.d
+sudo vi /etc/systemd/system/docker.service.d/override.conf
+```
+
+添加以下内容:
+
+```ini
+[Service]
+ExecStart=
+ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
+```
+
+然后重启 Docker 服务:
+
+```bash
+sudo systemctl daemon-reload
+sudo systemctl restart docker
+```
+
+验证 TCP 监听是否生效:
+
+```bash
+# 查看 Docker daemon 监听的端口
+ss -tlnp | grep 2375
+
+# 或使用 curl 测试
+curl http://localhost:2375/version
+```
+
+**注意:** 开启 TCP 监听后,任何能够访问该端口的客户端都可以操作 Docker daemon,存在严重的安全风险。在生产环境中,建议配合 TLS 证书进行加密通信。
+
+#### TLS 安全通信配置
+
+在生产环境中使用 TCP 协议时,应该启用 TLS 加密:
+
+```bash
+# 创建 TLS 证书(示例)
+mkdir -p /etc/docker/certs
+openssl req -x509 -newkey rsa:4096 -sha256 -days 365 \
+  -keyout /etc/docker/certs/server-key.pem \
+  -out /etc/docker/certs/server-cert.pem \
+  -nodes -subj "/CN=localhost"
+
+# Docker daemon 启动参数
+ExecStart=/usr/bin/dockerd \
+  --tlsverify \
+  --tlscacert=/etc/docker/ca.pem \
+  --tlscert=/etc/docker/certs/server-cert.pem \
+  --tlskey=/etc/docker/certs/server-key.pem \
+  -H tcp://0.0.0.0:2376 \
+  -H unix://var/run/docker.sock
+```
+
+### 连接方式对比
+
+| 特性 | Unix socket | TCP | TCP + TLS |
+|------|-------------|-----|-----------|
+| 适用场景 | 本机连接 | 远程连接 | 远程连接(生产) |
+| 安全性 | 高(文件权限) | 低(明文传输) | 高(证书加密) |
+| 性能 | 高 | 中等 | 中等(加密开销) |
+| 配置复杂度 | 低 | 中 | 高 |
+| 默认端口 | 无 | 2375 | 2376 |
+
+**思考:** 在微服务架构中,如果需要让应用通过 Docker Java SDK 管理容器化的服务,你会选择哪种连接方式?为什么?
+
+***
+
+下一章,我们将正式开始使用 Docker Java SDK,创建 DockerClient 并连接到 Docker daemon。

+ 0 - 0
docker-java-sdk.md


+ 17 - 0
pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>space.anyi</groupId>
+    <artifactId>docker-sdk-demo</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    
+</project>

+ 12 - 0
src/main/java/space/anyi/docker/QuickStart.java

@@ -0,0 +1,12 @@
+package space.anyi.docker;
+
+/**
+ * @fileName: QuickSatrt
+ * @projectName: docker-sdk-demo
+ * @package: space.anyi.docker
+ * @author: yangyi
+ * @date:15/9/2026 7:56 pm
+ * @description: TODO
+ */
+public class QuickSatrt {
+}

+ 20 - 0
src/test/java/space/anyi/docker/QuickStartTest.java

@@ -0,0 +1,20 @@
+package space.anyi.docker;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @fileName: QuickStartTest
+ * @projectName: docker-sdk-demo
+ * @package: space.anyi.docker
+ * @author: yangyi
+ * @date:15/9/2026 9:38 pm
+ * @description: TODO
+ */
+class QuickStartTest {
+
+    @Test
+    void quickStart() {
+    }
+}

+ 78 - 0
todo.md

@@ -0,0 +1,78 @@
+# Docker Java SDK 教程开发计划
+
+## 项目概述
+基于 `template.md` 的叙述风格,按照 `docker-java-sdk.md` 的大纲,编写 Docker Java SDK 使用教程文档。每章完成后提交到 Git 本地仓库。
+
+## 工作计划
+
+### Chapter 1: 前置Docker配置
+- [ ] 1.1 Docker 用户组配置
+- [ ] 1.2 网络协议配置(Unix socket / TCP)
+- [ ] 1.3 systemd service 配置示例
+- [ ] 1.4 权限问题解决方案
+- [ ] Review & Commit
+
+### Chapter 2: 快速入门
+- [ ] 2.1 创建 DockerClient(默认配置)
+- [ ] 2.2 自定义配置连接 Docker
+- [ ] 2.3 连接测试(ping)
+- [ ] 2.4 拉取镜像(pullImage)
+- [ ] 2.5 创建容器并启动(createContainer + startContainer)
+- [ ] 2.6 JUnit 5 测试用例
+- [ ] Review & Commit
+
+### Chapter 3: 镜像管理相关API
+- [ ] 3.1 listImagesCmd - 列出所有镜像
+- [ ] 3.2 inspectImageCmd - 获取镜像详细信息
+- [ ] 3.3 pullImageCmd - 拉取镜像(异步回调)
+- [ ] 3.4 pushImageCmd - 推送镜像
+- [ ] 3.5 removeImageCmd - 删除镜像
+- [ ] 3.6 tagImageCmd - 标记镜像
+- [ ] 3.7 saveImageCmd / loadImageCmd - 导入导出镜像
+- [ ] 3.8 JUnit 5 测试用例
+- [ ] Review & Commit
+
+### Chapter 4: 镜像构建相关API
+- [ ] 4.1 buildImageCmd - 从 Dockerfile 构建镜像
+- [ ] 4.2 从 tar 包构建镜像
+- [ ] 4.3 构建上下文配置
+- [ ] 4.4 JUnit 5 测试用例
+- [ ] Review & Commit
+
+### Chapter 5: 容器管理相关API
+- [ ] 5.1 createContainerCmd - 创建容器
+- [ ] 5.2 startContainerCmd - 启动容器
+- [ ] 5.3 stopContainerCmd - 停止容器
+- [ ] 5.4 killContainerCmd - 强制停止容器
+- [ ] 5.5 removeContainerCmd - 删除容器
+- [ ] 5.6 listContainersCmd - 列出容器
+- [ ] 5.7 inspectContainerCmd - 获取容器详细信息
+- [ ] 5.8 JUnit 5 测试用例
+- [ ] Review & Commit
+
+### Chapter 6: 容器运维相关API
+- [ ] 6.1 logsCmd - 获取容器日志
+- [ ] 6.2 execCreateCmd / execStartCmd - 在容器中执行命令
+- [ ] 6.3 copyArchiveFromContainerCmd - 从容器复制文件
+- [ ] 6.4 copyArchiveToContainerCmd - 向容器复制文件
+- [ ] 6.5 attachContainerCmd - 连接到容器
+- [ ] 6.6 waitContainerCmd - 等待容器停止
+- [ ] 6.7 JUnit 5 测试用例
+- [ ] Review & Commit
+
+### Chapter 7: DockerClient 核心对象及 API 对照表
+- [ ] 7.1 DockerClient 接口方法一览表
+- [ ] 7.2 Command 对象与 API 的对应关系
+- [ ] 7.3 常用模型类说明
+- [ ] 7.4 错误处理机制
+- [ ] Review & Commit
+
+## 编码规范
+- 日志输出统一使用 SLF4J Logger,禁止 `System.out.println`
+- 每个代码案例需有合理注释,说明关键步骤和设计意图
+- 所有测试使用 JUnit 5 (`org.junit.jupiter.api`)
+- 保持与现有代码一致的风格,遵循 Java 17 语法
+
+## Git 提交规范
+- 每完成一个小知识点后提交
+- Commit message 简明描述该知识点(如 `feat: add Docker client creation`)