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

如何在Docker 中使用 Docker

如图所示,可以在 Container 中直接运转一个 Docker Daemon ,然后运用 Container 中的 Docker CLI 东西操作容器。这种方法下,容器中的 Docker Daemon 彻底独立于外部,具有杰出的隔离特性。

DinD 需要以特权形式发动,这种嵌套会带来潜在的安全危险。

这种方法下,呼应指令的容器嵌套于运用docker指令的容器。

2. Docker outside of Docker

Docker outside of Docker 简称 DooD

如何在Docker 中使用 Docker

如图所示,需要将 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

如何在Docker 中使用 Docker

仅显示了刚拉取的 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

如何在Docker 中使用 Docker

可以看到,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

如何在Docker 中使用 Docker

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

docker image ls |grep d3156fec8bcb

如何在Docker 中使用 Docker

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

如何在Docker 中使用 Docker

DooD 直接运用的外部 Docker Daemon

参考:

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