404 字
2 分钟
DinD在docker容器跑docker

DinD 也就是 Docker-in-Docker,容器里单独跑一个 dockerd,它有自己的 /var/lib/docker、自己的镜像、容器、网络、volume。宿主机 Docker 只看到一个 dind 容器,看不到里面创建的子容器

services:
dev:
image: ubuntu:24.04
container_name: dev-env
command: sleep infinity
working_dir: /workspace
volumes:
- .:/workspace
environment:
DOCKER_HOST: tcp://docker:2375
depends_on:
- docker
docker:
image: docker:dind
container_name: dev-docker
privileged: true
environment:
DOCKER_TLS_CERTDIR: ""
volumes:
- dind-data:/var/lib/docker
volumes:
dind-data:

进入容器运行

Terminal window
apt update
apt install -y docker.io docker-compose-plugin
docker ps
docker run --rm hello-world

docker 通常需要 privileged: true,隔离的是 Docker daemon 数据和对象,不是完整虚拟机级隔离;底层 kernel 仍然是宿主机 kernel。Docker 官方文档也说明容器默认有一定隔离

最佳#

示例目录#

dev-dind/
├── docker-compose.yml
├── Dockerfile
└── ssh/
└── authorized_keys

生成ssh密钥对#

Terminal window
ssh-keygen -t ed25519 -C "dev-container"

复制密钥#

mkdir -p ssh
cp ~/.ssh/id_ed25519.pub ssh/authorized_keys

创建dockerfile与docker-compose.yml#

FROM docker:27-cli AS docker-cli
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
ENV DOCKER_HOST=tcp://dind:2375
RUN echo 'export DOCKER_HOST=tcp://dind:2375' > /etc/profile.d/docker-host.sh \
&& echo 'export DOCKER_HOST=tcp://dind:2375' >> /home/dev/.bashrc \
&& echo 'export DOCKER_HOST=tcp://dind:2375' >> /root/.bashrc
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
openssh-server \
bash \
git \
curl \
nano \
vim \
openjdk-21-jdk \
sudo \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
COPY --from=docker-cli /usr/local/bin/docker /usr/local/bin/docker
COPY --from=docker-cli /usr/local/libexec/docker/cli-plugins/docker-compose /usr/local/libexec/docker/cli-plugins/docker-compose
RUN chmod +x /usr/local/bin/docker \
&& chmod +x /usr/local/libexec/docker/cli-plugins/docker-compose
RUN useradd -m -s /bin/bash dev \
&& echo "dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN mkdir -p /run/sshd \
&& mkdir -p /home/dev/.ssh \
&& chown -R dev:dev /home/dev/.ssh \
&& chmod 700 /home/dev/.ssh
RUN ssh-keygen -A
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config \
&& echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
WORKDIR /workspace
CMD ["/usr/sbin/sshd", "-D", "-e"]

这里自行决定要不要java

services:
dev:
build: .
container_name: dev-ssh
ports:
- "2222:22"
volumes:
- .:/workspace
- ./ssh/authorized_keys:/home/dev/.ssh/authorized_keys:ro
environment:
DOCKER_HOST: tcp://dind:2375
depends_on:
- dind
networks:
- devnet
dind:
image: docker:27-dind
container_name: dev-dind
privileged: true
environment:
DOCKER_TLS_CERTDIR: ""
volumes:
- dind-data:/var/lib/docker
networks:
- devnet
volumes:
dind-data:
networks:
devnet:
Terminal window
docker compose up -d --build
ssh dev@127.0.0.1 -p 2222
DinD在docker容器跑docker
https://blog.inept.top/posts/dokcer-dind/
作者
无能酱
发布于
2026-06-21
许可协议
CC BY-NC-SA 4.0