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
参考: