You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何指定在DinD而非宿主Docker中运行应用容器?

解决方案

要让myapp容器明确运行在DinD环境中,你需要调整docker-compose.yaml的核心配置,同时修正DinD服务的基础镜像问题:

关键修改点

  1. 修正DinD服务的镜像与运行配置
    原配置使用的docker:latest是Docker客户端镜像,不含守护进程,无法作为DinD服务端。需改用docker:dind镜像,并配置必要的端口、环境变量与数据持久化。
  2. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:23:15