1. 程式人生 > >在(Docker裡的)Jenkins裡執行Docker

在(Docker裡的)Jenkins裡執行Docker

在本文中,我們將快速瞭解一下如何在一個容器裡裝載Docker sock以便建立其“兄弟”容器。我的一個同事稱之為DooD(Docker-outside-of-Docker),以區別於DinD(Docker-in-Docker),後者是在容器中安裝一個完整的隔離的Docker版本。DooD比DinD簡單得多(至少在配置方面),尤其是能重用並快取宿主上的映象。反之,如果你想實現映象對宿主的隱藏和隔離,則最好使用DinD。

為說明DooD的工作方式,我們將在一個Jenkins容器內使用DooD,從而能在Jenkins任務中建立並測試容器。我們希望使用Jenkins使用者來建立這些容器,因此會比使用root使用者稍微麻煩些。這有點很像Pini Reznik在“ 使用Docker、Mesos實現持續交付 ”中描述的技術,不過我們將使用 sudo 來避免Pini面臨的將使用者加入Docker組的問題。

我們使用官方Jenkins映象作為基礎,剩下的事情就很簡單了。

建立一個包容以下內容的Dockerfile:

FROM jenkins:1.596

USER root

RUN apt-get update \

&& apt-get install -y sudo \

&& rm -rf /var/lib/apt/lists/*

RUN echo “jenkins ALL=NOPASSWD: ALL” >> /etc/sudoers

USER jenkins

COPY plugins.txt /usr/share/jenkins/plugins.txt

RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

我們需要賦予jenkins使用者sudo許可權以便能在容器內執行Docker命令。當然,也可以將jenkins使用者加入到Docker組中來避免在所有Docker命令前使用‘sudo’,不過由於這個組gid的不同會造成不可移植(如Pini文中所述)。

最後兩行用於處理 plugins.txt 檔案中定義的外掛。如果你不需要任何外掛可以忽略這兩行,不過我推薦至少包括如下內容:

$ cat plugins.txt

scm-api:latest

git-client:latest

git:latest

greenballs:latest

如果不想安裝任何外掛,可建立個空檔案或將相關指令從Dockerfile中刪除。本文並不需要上述外掛。

現在來構建並執行容器,將Docker socket和程式對映進來。

$ docker build -t myjenk .

Successfully built 471fc0d22bff

dockerrundv/var/run/docker.sock:/var/run/docker.sockv(which docker):/usr/bin/docker -p 8080:8080 myjenk

現在你就有一個執行在 http://localhost:8080 的Docker例項可以用來執行Docker命令了。可通過如下步驟快速測試一下:

在瀏覽器中開啟Jenkins首頁,並點選“建立一個新任務”連結。
輸入專案名稱(比如“docker-test”),選擇“構建一個自由風格的軟體專案”並點選OK。
在配置頁面,點選“增加構建步驟”並選擇“Execute shell”。
在命令框裡輸入“sudo docker run hello-world”。
點選“儲存”。
點選“立即構建”。

運氣好的話,應出現一個綠(或藍)球。點選這個球,並選擇“Console Output”,你將看到類似如下內容:

[jenkins3-1024x640.png]

好極了!我們已經在Jenkins容器內成功運行了Docker命令。請注意,這裡存在一個重大的安全問題:Jenkins使用者對宿主具有root許可權,比如Jenkins可以建立裝載宿主任意目錄的容器。因此,務必確保這個容器只對受信使用者訪問,並考慮使用VM來將Jekins與宿主其他部分隔離開。

還有其他的方式,主要是 Docker in Docker(DinD) 以及 使用HTTPS與Docker後臺程式通訊 。DinD並不比使用特權模式的容器安全性高,不過確實能避免使用sudo。DinD最主要的劣勢是你無法重用宿主快取的映象(不過如果需要為測試容器提供一個與宿主隔離的乾淨環境,這將很有用)。通過HTTPS暴露socket不需要sudo並且可以使用宿主的映象,但因為打開了埠增加了攻擊面,可以說是最不安全的。

我將在未來的文章中深入說明如何安全地設定HTTPS socket上的Docker。

相關推薦

DockerJenkins執行Docker

在本文中,我們將快速瞭解一下如何在一個容器裡裝載Docker sock以便建立其“兄弟”容器。我的一個同事稱之為DooD(Docker-outside-of-Docker),以區別於DinD(Docker-in-Docker),後者是在容器中安裝一個完整的隔離的

Spring Boot十一Redis整合從Docker安裝到分散式Session共享

一、簡介 Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API,Redis也是技術領域使用最為廣泛的儲存中介軟體,它是「Remote Dictionary Service」首字母縮寫,也就是「遠端字典服務」。 Red

VmCentOS映象上模擬測試Docker,一些簡單的安裝步驟

先了解幾個概念: 映象 mysql 映象 容器   mysql服務 倉庫  mysql倉庫 linux最小化安裝時沒有netstat命令 可以使用yum -y install net-tools安裝 刪除舊版本,如果沒有可以不執行 yu

java基礎學習總結二十:多執行緒上下文切換

什麼是上下文切換        即使是單核CPU也支援多執行緒執行程式碼,CPU通過給每個執行緒分配CPU時間片來實現這個機制。時間片是CPU分配給各個執行緒的時間,因為時間片非常短,所以CPU通過不停地切換執行緒執行,讓我們感覺多個執行緒時同時執行的,時

大資料教程8.3wordcount程式執行過程的解析

        上一篇部落格分享了wordcount的原始碼編寫、原理實現,本節將對wordcount在hadoop內部執行過程進行解析。         執行流程圖如下:

Java語言學習十二:多執行

    Java中給多執行緒程式設計提供了內建的支援,多執行緒是多工的一種特別形式,它使用了更小的資源開銷。這裡需要知道兩個術語及其關係:程序和執行緒。     程序:程序是系統進行資源分配和排程的一個獨立單位。一個程序包括由作業系統分配的記憶體空間,包含

在LinuxUbuntu16.04下編寫執行C語言程式

       最初學習C語言用的是Visual C++6.0,後來還用過一些IDE,複製貼上都可以用滑鼠對目標進行選擇即可。但在Linux系統裡,需要熟練掌握在Terminal裡編寫C語言程式,進行編譯除錯。本章

Python爬蟲開發三-續:快速執行緒池爬蟲

0×00 簡介 本文算是填前面的一個坑,有朋友和我將我前面寫了這麼多,真正沒看到什麼特別突出的實戰,給了應對各種情況的方案。多執行緒那裡講的也是坑。忽然想想,說的也對,為讀者考慮我確實應該把多執行緒這裡的坑補完。 然後決定再以一篇文章的形式講一下這個輕型執行緒池爬蟲,同時也為大家提供一個思路

python+appium-desktop:安卓android7.0以上使用appium無法定位元素無法refresh且 無法執行指令碼

--解決方法:   啟動appium時配置中新增: "automationName":"uiautomator2" --擴充套件:     想支援安卓7.0及以上版本需要滿足一下3點:     1、使用appium-desktop 1.6.3以及以上版本     2、啟動appium的driver配置新增:"

jdk8新特性Lambda表示式結合spring 執行緒池,一行程式碼實現多執行

1.配置spring 執行緒池 @Configuration @EnableAsync @ConfigurationProperties(prefix="threadpool") public class ExecutePoolConfiguration { @V

Java多執行十五:多執行緒同步的五種方法

一、為什麼要執行緒同步     因為當我們有多個執行緒要同時訪問一個變數或物件時,如果這些執行緒中既有讀又有寫操作時,就會導致變數值或物件的狀態出現混亂,從而導致程式異常。舉個例子,如果一個銀行賬戶同時被兩個執行緒操作,一個取100塊,一個存錢100塊。假設賬戶原本有0塊,如

Windows 1064位配置Caffe執行環境的基本流程

    進行深度學習可以使用Caffe,我使用windows配置了一下Caffe執行環境,非常簡單。這裡把官網的配置過程搬運過來,以備參考。   配置環境: Windows 10(64位)+ Vis

Java Executor併發框架十四Executor框架執行緒池使用原始方式實現生產者消費者模式

       我們可以利用wait()來讓一個執行緒在某些條件下暫停執行。例如,在生產者消費者模型中,生產者執行緒在緩衝區為滿的時候,消費者在緩衝區為空的時 候,都應該暫停執行。如果某些執行緒在等待某些條件觸發,那當那些條件為真時,你可以用 notify 和 notifyAll 來通知那些等待中的執行緒重

關於IDLE的使用筆記--輸入多行語句或函式後再執行

在Python自帶的IDLE中,如果編輯一個函式或輸入多行語句後,如何繼續執行? 例如,編輯如下程式碼: 此時如果直接回車,輸入例如 print_lol(xxx)準備執行程式碼,會報錯,提示print_lol未定義。 因為此時多行編輯還沒有完成。如何做? 只需

C#自身包含其他應用程式或者檔案並在執行時呼叫

       今天一個同事問我,怎麼把Dll動態連結庫直接嵌入到C#開發的應用程式本身,讓C#在釋出出去的時候,只是一個.exe的檔案,而不是一個資料夾。我仔細思索了一下這個問題。發現這個問題其實可以總結為一個比較普遍的問題,那就是怎樣把不同種類的檔案包含到C#開發的應用程式

React Native開發之IDEAtom+Nuclide安裝,執行,除錯

歡迎Follow我的Github,部落格會同步在Github的Blog倉庫更新。也可以關注CSDN部落格的React Native分類 前言 工欲善其事,必先利其器 好像在哪聽到一句話,”滿級程式設計師不需要IDE,不需要自動補全,不需要靜

SpringBoot開發詳解十二 -- SpringBoot中執行定時任務

最近在專案中一直使用定時任務完成一些業務邏輯,比如天氣介面的資料獲取,定時傳送簡訊,郵件。以及商城中每天使用者的限額,定時自動收貨等等。定時器在專案中是我們常常會使用到的一個手段,今天我們就來看下在SpringBoot中如何整合定時任務。 定時任務在Sprin

簡單的linux servicelinux服務編寫,執行示例

1.寫一個簡單小程式1234567891011#include<stdio.h>#include<stdlib.h>int main(int argc,char **argv){while(1)  {printf("hello world\n");sl

gitlab+jenkins+maven+docker持續集成——.Jenkins獲取git tags代碼進行持續集成

gitlab+jenkins+maven+docker持續集成(六)——.jenkins獲取git tags代碼進行持續集成GitFlow的工作流如上圖所示,在開發工作中,不同的代碼分支對應著項目或產品的不同形態,圍繞特定形態的人力投入也不相同。隨著時間的推進,我們在 開發分支 中合並產品的功能實現,產品的功

gitlab+jenkins+maven+docker持續集成——.Jenkins Pipeline持續集成

gitlab+jenkins+maven+docker持續集成(七)——.jenkins pipeline持續集成Pipeline的幾個基本概念:Stage: 階段,一個Pipeline可以劃分為若幹個Stage,每個Stage代表一組操作。註意,Stage是一個邏輯分組的概念,可以跨多個Node。Node: