如何在Docker 中使用 Docker

2,045 阅读2分钟

Docker 以 C/S 模式工作,主要分为两个部分,Docker CLI 和 Docker Daemon。Docker CLI 是客户端,提供给用户命令行操作Docker,例如 docker create/images/ps等,Docker Damon是守护进程,负责接受用户指令,维护容器的生命周期。

两种模式

如何在Docker 中使用 Docker,有两种使用模式:

1. Docker in Docker

Docker in Docker 简称 DinD

image.png

如图所示,可以在 Container 中直接运行一个 Docker Daemon ,然后使用 Container 中的 Docker CLI 工具操作容器。这种方式下,容器中的 Docker Daemon 完全独立于外部,具有良好的隔离特性。

DinD 需要以特权模式启动,这种嵌套会带来潜在的安全风险。

这种方式下,响应命令的容器嵌套于使用 docker 命令的容器。

2. Docker outside of Docker

Docker outside of Docker 简称 DooD

image.png

如图所示,需要将 Container 的外部 Docker Daemon 服务挂载到 Container,让Container误以为本地运行了 Docker Daemon,使用 Docker CLI 命令操作时,外部的 Docker Daemon 会响应请求。

这种方式下,响应命令的容器与使用 docker 命令的容器处于同一层级。

Kubernetes环境下使用

1. DinD

创建一个dind.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dind
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dind
  template:
    metadata:
      labels:
        app: dind
    spec:
      containers:
        - name: dockerd
          image: 'docker:dind'
          env:
            - name: DOCKER_TLS_CERTDIR
              value: ""
          securityContext:
            privileged: true
        - name: docker-cli
          image: 'docker:latest'
          env:
          - name: DOCKER_HOST
            value: 127.0.0.1
          command: ["/bin/sh"]
          args: ["-c", "sleep 86400;"]

kubectl apply -f dind.yaml
kubectl get pod |grep dind
kubectl exec -it dind-548dbf7f68-mpqnk -c docker-cli sh
docker pull nginx
docker image ls

image.png

仅显示了刚拉取的 Nginx 的镜像,完全独立于主机的 Docker Daemon。

2. DooD

创建一个dood.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dood
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dood
  template:
    metadata:
      labels:
        app: dood
    spec:
      containers:
        - image: docker:latest
          name: docker-cli
          securityContext:
            privileged: false
          command: ["/bin/sh"]
          args: ["-c", "sleep 86400;"]
          volumeMounts:
          - mountPath: /var/run/docker.sock
            name: volume-docker
      volumes:
        - hostPath:
            path: /var/run/docker.sock
            type: ""
          name: volume-docker

kubectl apply -f dood.yaml
kubectl get pod |grep dood
kubectl exec -it dood-5dcdb4d9d-p6qbm -c docker-cli sh
docker image ls

image.png

可以看到,Docker 命令使用的就是外部的 Docker Daemon。

Docker环境下使用

1. DinD

docker run --privileged -e DOCKER_TLS_CERTDIR="" -d -it --name dockerd  docker:dind
docker run --rm -it --link dockerd:docker docker:latest sh

在 DinD 容器中,拉取镜像

docker pull alpine

image.png

键入 exit 退出容器,在主机上面执行

docker image ls |grep d3156fec8bcb

image.png

DinD 使用的是独立的 Docker Daemon,对外部没有影响。

2. DooD

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker:dind sh

docker pull alpine

exit

docker image ls|grep alpine

image.png

DooD 直接使用的外部 Docker Daemon

参考:

www.chenshaowen.com/blog/how-to…