成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在Docker中使用Docker

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

[[354736]]

 1. 典型適用場景

在 CI 中,通常會有一個 CI Engine 負責解析流程,控制整個構建過程,而將真正的構建交給 Agent 去完成。例如,Jenkins 、GitLab 均是如此。

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

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

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

2. 兩種使用模式

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

2.1 Docker in Docker

Docker in Docker ,以下簡稱 DinD 。

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

這種方式下,容器中的 Docker Daemon 完全獨立于外部,具有良好的隔離特性。看起來,Container 類似一個 VM ,但 DinD 的作者自己也不是很推薦。

主要原因還是安全問題。DinD 需要以特權模式啟動,這種嵌套會帶來潛在的安全風險。

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

2.2 Docker outside of Docker

Docker outside of Docker ,以下簡稱 DooD 。

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

因此,只需要將 Container 的外部 Docker Daemon 服務掛載到 Container 。讓 Container 誤以為本地運行了 Docker Daemon,使用 Docker CLI 命令操作時,外部的 Docker Daemon 會響應請求。

這種方式下,響應命令的容器與使用 docker 命令的容器處于同一層級。

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

3.1 DinD

  •  運行 DinD 容器 
  1. $ docker run --privileged -e DOCKER_TLS_CERTDIR="" -d --name dockerd  docker:dind  
  2. d6414f2ff0076c42de19a8a1fe122481c1a72b3bd45fd490dbe1c427414b4139 
  •  運行帶 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 

使用起來和一個獨立的 Docker Daemon 環(huán)境一樣。

  •  查看外部是否受影響

鍵入 exit 退出容器,通過主機上的 Docker Daemon 

  1. $ docker images |grep fa4651c24a18 

符合預期。DinD 使用的是獨立的 Docker Daemon,對外部的實例沒有直接影響。

3.2 DooD

  •  運行一個容器 
  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 退出容器,通過主機上的 Docker Daemon 

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

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

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

4.1 DinD

  •  創(chuàng)建一個 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 
  • 進入 Pod 
  1. $ kubectl exec -it dind-5446ffbc8d-68q28  -c docker-cli sh 
  •  測試是否使用獨立的 Docker Daemon 
  1. $ docker pull nginx  
  2. $ docker images  
  3. REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
  4. nginx               latest              daee903b4e43        3 days ago          133MB 

符合預期,這里僅顯示了剛拉取的 Nginx 的鏡像,完全獨立于主機的 Docker Daemon。

4.2 DooD

  •  創(chuàng)建一個 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 
  •  進入 Pod 
  1. $ kubectl exec -it dood-667d8bcfc6-d5fzf  -c docker-cli sh 
  •  測試是否使用的是主機的 Docker Daemon 
  1. $ docker images |wc  
  2. 69       482      8509 

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

5. 參考

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

 

責任編輯:龐桂玉 來源: 奇妙的Linux世界
相關推薦

2015-08-31 13:42:06

IDEDockerdoclipser

2015-11-26 10:57:56

DockerOpen vSwitc

2019-09-16 19:00:48

Linux變量

2014-07-02 09:47:06

SwiftCocoaPods

2024-09-06 11:34:15

RustAI語言

2020-04-09 10:18:51

Bash循環(huán)Linux

2022-05-17 08:25:10

TypeScript接口前端

2022-06-23 08:00:53

PythonDateTime模塊

2021-06-09 09:36:18

DjangoElasticSearLinux

2021-03-09 07:27:40

Kafka開源分布式

2015-08-27 09:46:09

swiftAFNetworkin

2024-01-18 08:37:33

socketasyncio線程

2011-08-10 09:31:41

Hibernateunion

2017-03-07 09:17:51

AtomicDocker遠程

2016-11-03 20:06:53

UbuntuGrafanaDocker

2022-06-10 10:01:17

MacDockerLinux

2018-05-16 10:32:06

Linux命令find

2018-06-26 09:15:24

Linux命令history

2020-12-31 07:31:10

C# 反射數(shù)據(jù)

2023-01-28 17:41:07

Java代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆精品国产免费 | 成人字幕网zmw| 狠狠操狠狠搞 | 久久久精品网站 | www日日日 | 欧洲视频一区二区 | 久久久www成人免费精品张筱雨 | 精品国产区 | 国产高清视频 | 日韩不卡一二区 | 97人澡人人添人人爽欧美 | 国产一区二区三区不卡av | 欧美一区2区三区4区公司二百 | 亚洲精品中文字幕在线观看 | 精品国产免费人成在线观看 | 99re视频在线 | 精品99爱视频在线观看 | 精品一区二区不卡 | 免费毛片网 | 国产亚洲一区二区三区在线观看 | 色啪网 | 成年网站在线观看 | 亚洲视频欧美视频 | 亚洲久久一区 | 人操人人 | 激情五月综合 | 永久免费视频 | 亚洲欧美激情精品一区二区 | 不卡一区二区三区四区 | 亚州春色| 伊人久久大香线 | 亚洲欧美一区二区三区在线 | 一区二区三区高清 | 天天干狠狠干 | 97人人澡人人爽91综合色 | 亚洲激精日韩激精欧美精品 | 精品一级毛片 | 日韩成人在线观看 | 久久综合一区二区 | 免费在线毛片 | 国产亚洲精品精品国产亚洲综合 |