如何通过Docker service创建容器时绑定volume?附Java docker-client代码
docker-java创建Swarm Service绑定Volume的实现方案
你正在使用docker-java库操作Docker Swarm服务,绑定Volume仅需在ContainerSpec配置中追加Mount规则即可,现有拉取镜像、创建服务的逻辑无需大幅改动。
完整修改后的代码示例
import com.github.dockerjava.api.model.Mount; import com.github.dockerjava.api.model.MountType; // 原有拉取镜像逻辑不变 dockerClient.pullImageCmd(image).withTag(tag) .exec(new PullImageResultCallback()); // 构建Mount规则,两种场景二选一即可 // 场景1:命名卷挂载,将名为app-data的卷挂载到容器内的/opt/app/data路径 Mount volumeMount = new Mount() .withType(MountType.VOLUME) .withSource("app-data") .withTarget("/opt/app/data"); // 场景2:本地目录绑定,将宿主机/host/data路径挂载到容器内的/opt/app/data路径 // Mount bindMount = new Mount() // .withType(MountType.BIND) // .withSource("/host/data") // .withTarget("/opt/app/data"); ServiceSpec serviceSpec = new ServiceSpec() .withMode(new ServiceModeConfig() .withReplicated(new ServiceReplicatedModeOptions() .withReplicas(1))) .withName(trname) .withTaskTemplate(new TaskSpec() .withContainerSpec(new ContainerSpec() .withImage(image) // 追加Mount配置,支持传入多个Mount对象实现多路径挂载 .withMounts(volumeMount) )); String serviceId = dockerClient.createServiceCmd(serviceSpec).exec().getId();
配置说明
- 命名卷挂载适合多节点Swarm集群使用,数据由Docker统一管理,生命周期独立于容器
- 本地目录绑定仅适合单节点Swarm环境,如需在多节点集群使用,需保证所有可调度节点的对应源路径存在
- 如需设置只读挂载,可在Mount对象后追加
.withReadOnly(true),禁止容器写入挂载路径
内容的提问来源于stack exchange,提问作者Sang Kim
相关产品推荐
相关产品推荐

