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
如图所示,可以在 Container 中直接运转一个 Docker Daemon ,然后运用 Container 中的 Docker CLI 东西操作容器。这种方法下,容器中的 Docker Daemon 彻底独立于外部,具有杰出的隔离特性。
DinD 需要以特权形式发动,这种嵌套会带来潜在的安全危险。
这种方法下,呼应指令的容器嵌套于运用docker
指令的容器。
2. Docker outside of Docker
Docker outside of Docker 简称 DooD
如图所示,需要将 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
仅显示了刚拉取的 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 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
键入exit
退出容器,在主机上面履行
docker image ls |grep d3156fec8bcb
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
DooD 直接运用的外部 Docker Daemon
参考:
www.chenshaowen.com/blog/how-to…