如何指定在DinD而非宿主Docker中运行应用容器?
解决方案
要让myapp容器明确运行在DinD环境中,你需要调整docker-compose.yaml的核心配置,同时修正DinD服务的基础镜像问题:
关键修改点
- 修正DinD服务的镜像与运行配置
原配置使用的docker:latest是Docker客户端镜像,不含守护进程,无法作为DinD服务端。需改用docker:dind镜像,并配置必要的端口、环境变量与数据持久化。 - 通过Docker客户端代理启动myapp
宿主机的docker-compose默认连接宿主机Docker守护进程,要让myapp在DinD内启动,需要通过一个客户端容器连接到DinD的守护进程,执行启动命令。
修改后的完整配置
version: '3.8' # 持久化DinD的Docker数据,避免重启后丢失容器数据 volumes: dind-storage: services: docker: hostname: docker container_name: dind image: docker:dind # 使用带守护进程的DinD专用镜像 privileged: yes ports: - "2375:2375" # 暴露DinD的Docker守护进程端口(测试用非TLS端口) environment: - DOCKER_TLS_CERTDIR="" # 关闭TLS验证,简化测试环境连接 command: --storage-driver overlay2 # 指定存储驱动,提升运行稳定性 volumes: - dind-storage:/var/lib/docker myapp-launcher: image: docker:latest # 使用Docker客户端镜像作为启动代理 container_name: myapp-launcher depends_on: - docker # 确保DinD服务启动完成后再执行启动逻辑 environment: - DOCKER_HOST=tcp://docker:2375 # 指定连接到DinD的守护进程 # 拉取镜像并在DinD环境内启动myapp容器 command: > sh -c " docker pull foox/myapp:1.1.0 && docker run -d --name myapp -p 8080:8080 foox/myapp:1.1.0 " network_mode: "service:docker" # 与DinD共享网络,让宿主机能访问myapp的8080端口
配置说明
- DinD服务启动后,会在内部运行独立的Docker守护进程,通过2375端口对外暴露连接入口。
myapp-launcher容器作为代理,连接到DinD的守护进程,执行docker run命令将myapp容器启动在DinD环境内。- 共享网络配置确保宿主机能通过DinD的8080端口,访问到DinD内部运行的
myapp服务。
如果需要在宿主机直接用docker-compose管理DinD内的所有服务,可以在宿主机执行export DOCKER_HOST=tcp://localhost:2375,再运行docker-compose up,此时所有服务都会在DinD环境内启动。
内容的提问来源于stack exchange,提问作者user842225
相关产品推荐
相关产品推荐

