偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何在Docker中使用Docker

系統(tǒng) Linux
如果 Agent 已經(jīng)是容器化的,那么在 Agent 上如何構(gòu)建鏡像呢?這就是本篇將給出的回答,如何在 Docker 中使用 Docker。

[[354736]]

 1. 典型適用場(chǎng)景

在 CI 中,通常會(huì)有一個(gè) CI Engine 負(fù)責(zé)解析流程,控制整個(gè)構(gòu)建過(guò)程,而將真正的構(gòu)建交給 Agent 去完成。例如,Jenkins 、GitLab 均是如此。

如下圖, 連接 CI Engine 的 Agent, 種類很多。這是為了滿足不同項(xiàng)目對(duì)構(gòu)建環(huán)境的要求。

同時(shí) Agent 是動(dòng)態(tài)的,構(gòu)建時(shí)才需要,構(gòu)建完成時(shí)即銷毀。CI 非常適合實(shí)踐容器、Serverless 等技術(shù),因此在生產(chǎn)過(guò)程中 Agent 經(jīng)常是容器化的。

那么問(wèn)題就來(lái)了?如果 CI Engine 也是容器化的,在容器中如何使用 Agent 容器去構(gòu)建呢?如果 Agent 已經(jīng)是容器化的,那么在 Agent 上如何構(gòu)建鏡像呢?這就是本篇將給出的回答,如何在 Docker 中使用 Docker。

2. 兩種使用模式

我們需要知道 Docker 以 C/S 模式工作,主要分為兩個(gè)部分,Docker CLI 和 Docker Daemon 。Docker CLI ,也就是客戶端,提供給用戶命令行操作 Docker,例如 docker create/images/ps 等。Docker Damon ,也就是守護(hù)進(jìn)程,負(fù)責(zé)接受用戶指令,維護(hù)容器的生命周期。

2.1 Docker in Docker

Docker in Docker ,以下簡(jiǎn)稱 DinD 。

如上圖,可以在 Container 中直接運(yùn)行一個(gè) Docker Daemon ,然后使用 Container 中的 Docker CLI 工具操作容器。

這種方式下,容器中的 Docker Daemon 完全獨(dú)立于外部,具有良好的隔離特性??雌饋?lái),Container 類似一個(gè) VM ,但 DinD 的作者自己也不是很推薦。

主要原因還是安全問(wèn)題。DinD 需要以特權(quán)模式啟動(dòng),這種嵌套會(huì)帶來(lái)潛在的安全風(fēng)險(xiǎn)。

這種方式下,響應(yīng)命令的容器嵌套于使用 docker 命令的容器。

2.2 Docker outside of Docker

Docker outside of Docker ,以下簡(jiǎn)稱 DooD 。

如上圖,Docker 以 C/S 模式工作,使用時(shí)用戶關(guān)注的是 C 端,而生命周期的管理在 S 端。

因此,只需要將 Container 的外部 Docker Daemon 服務(wù)掛載到 Container 。讓 Container 誤以為本地運(yùn)行了 Docker Daemon,使用 Docker CLI 命令操作時(shí),外部的 Docker Daemon 會(huì)響應(yīng)請(qǐng)求。

這種方式下,響應(yīng)命令的容器與使用 docker 命令的容器處于同一層級(jí)。

3. Docker 環(huán)境下的演示

3.1 DinD

  •  運(yùn)行 DinD 容器 
  1. $ docker run --privileged -e DOCKER_TLS_CERTDIR="" -d --name dockerd  docker:dind  
  2. d6414f2ff0076c42de19a8a1fe122481c1a72b3bd45fd490dbe1c427414b4139 
  •  運(yùn)行帶 CLI 的容器鏈接 DinD 容器 
  1. $ docker run --rm -it --link dockerd:docker docker:latest sh 
  •  在 DinD 容器中,拉取鏡像 
  1. # 拉取鏡像  
  2. $ docker pull shaowenchen/devops-java-sample  
  3. # 查看鏡像  
  4. $ docker images  
  5. REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE  
  6. shaowenchen/devops-java-sample   latest              fa4651c24a18        6 weeks ago         122MB 

使用起來(lái)和一個(gè)獨(dú)立的 Docker Daemon 環(huán)境一樣。

  •  查看外部是否受影響

鍵入 exit 退出容器,通過(guò)主機(jī)上的 Docker Daemon 

  1. $ docker images |grep fa4651c24a18 

符合預(yù)期。DinD 使用的是獨(dú)立的 Docker Daemon,對(duì)外部的實(shí)例沒(méi)有直接影響。

3.2 DooD

  •  運(yùn)行一個(gè)容器 
  1. $ docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine sh 
  •  安裝 curl

這里為了避免安裝 Docker CLI ,直接使用 curl 調(diào)用 Docker Daemon 的 API。 

  1. $ apk update && apk add curl 
  •  拉取鏡像 
  1. $ curl -XPOST --unix-socket /var/run/docker.sock http://localhost/images/create?fromImage=shaowenchen/docker-robotframework&tag=latest  
  2. ...  
  3. {"status":"Status: Downloaded newer image for shaowenchen/docker-robotframework"} 
  •  查看拉取的鏡像

鍵入 exit 退出容器,通過(guò)主機(jī)上的 Docker Daemon 

  1. $ docker images |grep robotframework  
  2. shaowenchen/docker-robotframework                              latest                         d99cfa7ee716        12 months ago       1.5GB 

 符合預(yù)期。DooD 方式直接使用的外部 Docker Daemon。

4. Kubernetes 環(huán)境下的演示

4.1 DinD

  •  創(chuàng)建一個(gè) dind.yaml 文件,內(nèi)容如下: 
  1. apiVersion: apps/v1  
  2. kind: Deployment  
  3. metadata:  
  4.   name: dind  
  5. spec:  
  6.   replicas: 1  
  7.   selector:  
  8.     matchLabels:  
  9.       app: dind  
  10.   template:  
  11.     metadata:  
  12.       labels:  
  13.         app: dind  
  14.     spec:  
  15.       containers:  
  16.         - name: dockerd  
  17.           image: 'docker:dind'  
  18.           env:  
  19.             - name: DOCKER_TLS_CERTDIR  
  20.               value: ""  
  21.           securityContext:  
  22.             privileged: true  
  23.         - name: docker-cli  
  24.           image: 'docker:latest'  
  25.           env:  
  26.           - name: DOCKER_HOST  
  27.             value: 127.0.0.1  
  28.           command: ["/bin/sh"]  
  29.           args: ["-c", "sleep 86400;"] 
  •     創(chuàng)建 Deployment 
  1. $ kubectl apply -f dind.yaml 
  •  查看創(chuàng)建的 Pod 名 
  1. $ kubectl get pod |grep dind  
  2. dind-5446ffbc8d-68q28   2/2     Running       0          12s 
  • 進(jìn)入 Pod 
  1. $ kubectl exec -it dind-5446ffbc8d-68q28  -c docker-cli sh 
  •  測(cè)試是否使用獨(dú)立的 Docker Daemon 
  1. $ docker pull nginx  
  2. $ docker images  
  3. REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
  4. nginx               latest              daee903b4e43        3 days ago          133MB 

符合預(yù)期,這里僅顯示了剛拉取的 Nginx 的鏡像,完全獨(dú)立于主機(jī)的 Docker Daemon。

4.2 DooD

  •  創(chuàng)建一個(gè) dood.yaml 文件,內(nèi)容如下: 
  1. apiVersion: apps/v1  
  2. kind: Deployment 
  3. metadata:  
  4.   name: dood  
  5. spec:  
  6.   replicas: 1  
  7.   selector:  
  8.     matchLabels:  
  9.       app: dood  
  10.   template:  
  11.     metadata:  
  12.       labels:  
  13.         app: dood  
  14.     spec:  
  15.       containers:  
  16.         - image: docker:latest  
  17.           name: docker-cli  
  18.           securityContext:  
  19.             privileged: false  
  20.           command: ["/bin/sh"]  
  21.           args: ["-c", "sleep 86400;"]  
  22.           volumeMounts:  
  23.           - mountPath: /var/run/docker.sock  
  24.             name: volume-docker  
  25.       volumes:  
  26.         - hostPath:  
  27.             path: /var/run/docker.sock  
  28.             type: ""  
  29.           name: volume-docker 
  •  創(chuàng)建 Deployment 
  1. $ kubectl apply -f dood.yaml 
  •  查看創(chuàng)建的 Pod 名 
  1. $ kubectl get pod  |grep dood  
  2. dood-667d8bcfc6-d5fzf   1/1     Running   0          15s 
  •  進(jìn)入 Pod 
  1. $ kubectl exec -it dood-667d8bcfc6-d5fzf  -c docker-cli sh 
  •  測(cè)試是否使用的是主機(jī)的 Docker Daemon 
  1. $ docker images |wc  
  2. 69       482      8509 

符合預(yù)期,這里 Docker 命令使用的就是外部的 Docker Daemon。

5. 參考

  1.  https://medium.com/better-programming/about-var-run-docker-sock-3bfd276e12fd
  2.  https://github.com/jpetazzo/dind 

 

責(zé)任編輯:龐桂玉 來(lái)源: 奇妙的Linux世界
相關(guān)推薦

2015-11-26 10:57:56

DockerOpen vSwitc

2015-08-31 13:42:06

IDEDockerdoclipser

2016-11-03 20:06:53

UbuntuGrafanaDocker

2022-06-10 10:01:17

MacDockerLinux

2014-07-02 09:47:06

SwiftCocoaPods

2019-09-16 19:00:48

Linux變量

2020-04-09 10:18:51

Bash循環(huán)Linux

2024-09-06 11:34:15

RustAI語(yǔ)言

2024-01-18 08:37:33

socketasyncio線程

2015-08-27 09:46:09

swiftAFNetworkin

2021-03-09 07:27:40

Kafka開源分布式

2021-06-09 09:36:18

DjangoElasticSearLinux

2022-05-17 08:25:10

TypeScript接口前端

2011-08-10 09:31:41

Hibernateunion

2022-06-23 08:00:53

PythonDateTime模塊

2017-03-07 09:17:51

AtomicDocker遠(yuǎn)程

2015-07-08 11:28:53

云服務(wù)平臺(tái)Docker MachDocker

2018-03-09 10:07:34

mysql

2023-01-28 17:41:07

Java代碼

2020-12-31 07:31:10

C# 反射數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)