docker@dind(docker in docker)

docker-dind 是 “Docker in Docker” 的简称,即在 Docker 容器内部运行 Docker 守护进程,使容器可以自己运行 Docker 命令(例如 docker build, docker run 等)。在 CI/CD(比如 GitLab CI、Jenkins)中很常见,用于构建镜像或运行子容器


docker-image

基本用法:运行 docker-dind 容器

1
2
3
docker run --privileged --name dind-test -d docker:dind

docker run --name dind --rm --privileged -d docker:dind

参数解释:

  • --privileged: 必须,让容器有更高的权限来运行 Docker 守护进程
  • docker:dind: Docker 官方提供的 dind 镜像
  • -d: 后台运行
  • --name: 给容器起名方便管理

让容器内能执行 docker 命令

方式 1:使用 docker:dind 镜像(自带 dockerd

1
2
3
docker run --privileged -d docker:dind
docker exec -it <container_id> sh
# 然后你就可以在里面运行 docker 命令

方式 2:挂载宿主机的 Docker 套接字(推荐)

这种方式不是真正的 Docker-in-Docker,但更安全和高效:

1
2
3
4
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
docker:latest

这个方式本质上是:容器使用宿主机的 Docker 守护进程,所以不需要 --privileged 权限。

⚠️ 安全注意

  • 使用 --privileged 会让容器获得宿主机的几乎所有权限,有安全隐患。
  • 在 CI 中建议使用 挂载 Docker 套接字 的方法,除非你确实需要完全隔离的 Docker 环境。