經過研究docker的官方編譯腳步,發現本地編譯也很簡單,只需要在docker源碼的目錄下執行如下命令即可:
./hack/make.sh binary
上面這條命令就只會生成docker的二進制文件,不過肯定不會這么順利的,執行這個命令你就會發現錯誤。如果第一次執行報的錯誤應該是找不到相應的go依賴包。那麼現在就開始解決第一個問題,go依賴包。
解決go依賴包最直接的方法就一個一個去github或者其他地方去下載到本地,但是這樣做很麻煩,docker依賴的go語言包很多,然後依賴包可能又依賴其他包。這里有一個簡單實用的辦法,也是go語言管理項目的方便之處。通過go get命令來自動下載,例如發現報錯的是docker某一個目錄下的依賴包,那麼可以如下執行:
go get -v ./src/github.com/docker/docker/...
這條命令執行以後整個docker目錄下源文件依賴的包都會被自動下載。如果發現其他目錄下源文件也報同樣的錯誤,可以按照次方法解決。不過這里需要強調一點, 這些下載都是會下載最新的包,如果編譯老的docker肯定會出問題 ,如果編譯最新的docker代碼肯定不會有問題,因為官方的編譯是這種方式。
上面執行的命令都是建立在go語言環境建立成功的基礎上,我安裝的go遇到是1.3.3版本的,採用源碼方式安裝。安裝在/export/servers/go下面,然後所有的go語言工程源碼目錄放在 /export/servers/gopath。然後配置環境變數在用戶的根目錄下的.bashrc文件裡面如下:
export GOPATH=/export/servers/gopath
export GOROOT=/export/servers/go
export GOARCH=amd64
export GOOS=linux
然後docker的代碼目錄如下:/export/servers/gopath/src/github.com/docker/docker。這樣才能在gopath下面進行依賴包的下載。通過上面的方法把所有依賴包下載完以後就可以進行編譯了。
在繼續編譯的過程中還會遇到缺少c語言依賴包缺少的問題,主要有三個,(1)sqlite3;(2)device-mapper;(3)btrfs.
第一個sqlite3可以使用如下命令安裝依賴:yum install sqlite-devel.x86_64
『貳』 跪求一個編譯好的dockerui,環境如圖linux。(實在不會編譯github上的dockerui項目)
https://github.com/kevana/ui-for-docker
這個往下看有如何使用說明哦哈哈
『叄』 如何在mips架構編譯docker之github源碼動態編譯
經過研究docker的官方編譯腳步,發現本地編譯也很簡單,只需要在docker源碼的目錄下執行如下命令即可: ./hack/make.sh binary 上面這條命令就只會生成docker的二進制文件,不過肯定不會這么順利的,執行這個命令你就會發現錯誤。如果第一次執行...
『肆』 docker 多階段構建 可以不使用嗎
docker多階段構建可以不使用。
docker多階段構建或者使一個Docker鏡像包含來自兩個不同鏡像的依賴庫時,就需要知道每個鏡像的Dockerfile。本文介紹了如何通過docker history命令來對Docker鏡像進行反向工程,得到它們的Dockerfile,並組織到一個Dockerfile里然後build,從而實現想做的事情。
多階段抽樣具體操作過程是:
docker多階段構,將總體分為若干個一級抽樣單位,從中抽選若干個一級抽樣單位入樣。
docker多階段構建將入樣的每個一級單位分成若干個二級抽樣單位,從入樣的每個一級單位中各抽選若干個二級抽樣單位入樣……,依此類推,直到獲得最終樣本。
docker多階段構建如果我們面對的一階單元內總體基本單元數相當大,作全面的調查就會比較困難,或者一階單元內各二階單元可以給出相近的結果,作全面的調查又無必要。此時從費用和抽樣估計效率考慮,便可以從總體中隨機抽取一部分一階單元。
『伍』 想使用docker來進行Android源碼編譯,對電腦配置要求怎麼樣
這個配置足夠了,還需要配置好對應的環境和編譯工具。
『陸』 生產環境,測試環境中,Docker 可以做什麼
上次有人說不敢在生產環境中用 Docker,所以 SegmentFault 社區組織翻譯 8 個你可能不知道的 Docker 知識 這篇文章,和大家介紹一下生產環境中的 Docker 用例。
自從上世紀 90 年代硬體虛擬化被主流的技術廣泛普及之後,對數據中心而言,發生的最大的變革莫過於容器和容器管理工具,例如:Docker。在過去的一年內,Docker 技術已經逐漸走向成熟,並且推動了大型初創公司例如 Twitter 和 Airbnb 的發展,甚至在銀行、連鎖超市、甚至 NASA 的數據中心都贏得了一席之地。當我幾年前第一次直到 Docker 的時候,我還對 Docker 的未來持懷疑的態度,我認為他們是把以前的 Linux 容器的概念拿出來包裝了一番推向市場。但是使用 Docker 成功進行了幾個項目 例如 Spantree 之後,我改變了我的看法:Docker 幫助我們節省了大量的時間和經歷,並且已經成為我們技術團隊中不可或缺的工具。
GitHub 上面每天都會催生出各式各樣的工具、形態各異的語言和千奇百怪的概念。如果你和我一樣,沒有時間去把他們全部都測試一遍,甚至沒有時間去親自測試 Docker,那麼你可以看一下我的這篇文章:我將會用我們在 Docker 中總結的經驗來告訴你什麼是 Docker、為什麼 Docker 會這么火。
Docker 是容器管理工具
Docker 是一個輕量級、攜帶型、與外界隔離的容器,也是一個可以在容器中很方便地構建、傳輸、運行應用的引擎。和傳統的虛擬化技術不同的是,Docker 引擎並不虛擬出一台虛擬機,而是直接使用宿主機的內核和硬體,直接在宿主機上運行容器內應用。也正是得益於此,Docker 容器內運行的應用和宿主機上運行的應用性能差距幾乎可以忽略不計。
但是 Docker 本身並不是一個容器系統,而是一個基於原有的容器化工具 LXC 用來創建虛擬環境的工具。類似 LXC 的工具已經在生產環境中使用多年,Docker 則基於此提供了更加友好的鏡像管理工具和部署工具。
Docker 不是虛擬化引擎
Docker 第一次發布的時候,很多人都拿 Docker 和虛擬機 VMware、KVM 和 VirtualBox 比較。盡管從功能上看,Docker 和虛擬化技術致力於解決的問題都差不多,但是 Docker 卻是採取了另一種非常不同的方式。虛擬機是虛擬出一套硬體,虛擬機的系統進行的磁碟操作,其實都是在對虛擬出來的磁碟進行操作。當運行 CPU 密集型的任務時,是虛擬機把虛擬系統里的 CPU 指令「翻譯」成宿主機的CPU指令並進行執行。兩個磁碟層,兩個處理器調度器,兩個操作系統消耗的內存,所有虛擬出的這些都會帶來相當多的性能損失,一台虛擬機所消耗的硬體資源和對應的硬體相當,一台主機上跑太多的虛擬機之後就會過載。而 Docker 就沒有這種顧慮。Docker 運行應用採取的是「容器」的解決方案:使用 namespace 和 CGroup 進行資源限制,和宿主機共享內核,不虛擬磁碟,所有的容器磁碟操作其實都是對 /var/lib/docker/ 的操作。簡言之,Docker 其實只是在宿主機中運行了一個受到限制的應用程序。
從上面不難看出,容器和虛擬機的概念並不相同,容器也並不能取代虛擬機。在容器力所不能及的地方,虛擬機可以大顯身手。例如:宿主機是 Linux,只能通過虛擬機運行 Windows,Docker 便無法做到。再例如,宿主機是 Windows,Windows 並不能直接運行 Docker,Windows上的 Docker 其實是運行在 VirtualBox 虛擬機里的。
Docker 使用層級的文件系統
前面提到過,Docker 和現有容器技術 LXC 等相比,優勢之一就是 Docker 提供了鏡像管理。對於 Docker 而言,鏡像是一個靜態的、只讀的容器文件系統的快照。然而不僅如此,Docker 中所有的磁碟操作都是對特定的Copy-On-Write文件系統進行的。下面通過一個例子解釋一下這個問題。
例如我們要建立一個容器運行 java Web 應用,那麼我們應該使用一個已經安裝了 JAVA 的鏡像。在 Dockerfile(一個用於生成鏡像的指令文件)中,應該指明「基於 JAVA 鏡像」,這樣 Docker 就會去 Docker Hub Registry 上下載提前構建好的 JAVA 鏡像。然後再 Dockerfile 中指明下載並解壓 Apache Tomcat 軟體到 /opt/tomcat 文件夾中。這條命令並不會對原有的 JAVA 鏡像產生任何影響,而僅僅是在原有鏡像上面添加了一個改動層。當一個容器啟動時,容器內的所有改動層都會啟動,容器會從第一層中運行 /usr/bin/java 命令,並且調用另外一層中的 /opt/tomcat/bin 命令。實際上,Dockerfile 中每一條指令都會產生一個新的改動層,即便只有一個文件被改動。如果用過 Git 就能更清楚地認識這一點,每條指令就像是每次 commit,都會留下記錄。但是對於 Docker 來說,這種文件系統提供了更大的靈活性,也可以更方便地管理應用程序。
我們Spantree的團隊有一個自己維護的含有 Tomcat 的鏡像。發布新版本也非常簡單:使用 Dockerfile 將新版本拷貝進鏡像從而創建一個新鏡像,然後給新鏡像貼上版本的標簽。不同版本的鏡像的不同之處僅僅是一個 90 MB 大小的 WAR 文件,他們所基於的主鏡像都是相同的。如果使用虛擬機去維護這些不同的版本的話,還要消耗掉很多不同的磁碟去存儲相同的系統,而使用 Docker 就只需要很小的磁碟空間。即便我們同時運行這個鏡像的很多實例,我們也只需要一個基礎的 JAVA / TOMCAT 鏡像。
Docker 可以節約時間
很多年前我在為一個連鎖餐廳開發軟體時,僅僅是為了描述如何搭建環境都需要寫一個 12 頁的 Word 文檔。例如本地 Oracle 資料庫,特定版本的 JAVA,以及其他七七八八的系統工具和共享庫、軟體包。整個搭建過程浪費掉了我們團隊每個人幾乎一天的時間,如果用金錢衡量的話,花掉了我們上萬美金的時間成本。雖然客戶已經對這種事情習以為常,甚至認為這是引入新成員、讓成員適應環境、讓自己的員工適應我們的軟體所必須的成本,但是相比較起來,我們寧願把更多的時間花在為客戶構建可以增進業務的功能上面。
如果當時有 Docker,那麼構建環境就會像使用自動化搭建工具 Puppet / Chef / Salt / Ansible 一樣簡單,我們也可以把整個搭建時間周期從一天縮短為幾分鍾。但是和這些工具不同的地方在於,Docker 可以不僅僅可以搭建整個環境,還可以將整個環境保存成磁碟文件,然後復制到別的地方。需要從源碼編譯 Node.js 嗎?Docker 做得到。Docker 不僅僅可以構建一個 Node.js 環境,還可以將整個環境做成鏡像,然後保存到任何地方。當然,由於 Docker 是一個容器,所以不用擔心容器內執行的東西會對宿主機產生任何的影響。
現在新加入我們團隊的人只需要運行 docker-compose up 命令,便可以喝杯咖啡,然後開始工作了。
Docker 可以節省開銷
當然,時間就是金錢。除了時間外,Docker 還可以節省在基礎設施硬體上的開銷。高德納和麥肯錫的研究表明,數據中心的利用率在 6% - 12% 左右。不僅如此,如果採用虛擬機的話,你還需要被動地監控和設置每台虛擬機的 CPU 硬碟和內存的使用率,因為採用了靜態分區(static partitioning)所以資源並不能完全被利用。。而容器可以解決這個問題:容器可以在實例之間進行內存和磁碟共享。你可以在同一台主機上運行多個服務、可以不用去限制容器所消耗的資源、可以去限制資源、可以在不需要的時候停止容器,也不用擔心啟動已經停止的程序時會帶來過多的資源消耗。凌晨三點的時候只有很少的人會去訪問你的網站,同時你需要比較多的資源執行夜間的批處理任務,那麼可以很簡單的便實現資源的交換。
虛擬機所消耗的內存、硬碟、CPU 都是固定的,一般動態調整都需要重啟虛擬機。而用 Docker 的話,你可以進行資源限制,得益於 CGroup,可以很方便動態調整資源限制,讓然也可以不進行資源限制。Docker 容器內的應用對宿主機而言只是兩個隔離的應用程序,並不是兩個虛擬機,所以宿主機也可以自行去分配資源。
『柒』 docker 並行編譯為什麼很慢
電腦卡的話有可能是垃圾文件太多了,這樣的話你可以用騰訊電腦管家清理系統垃圾和各種緩存文件,也可能是磁碟碎片太多,那你就需要整理一下磁碟了,後台的運行程序太多的話,那就需要關除掉你不用的軟體的,優化系統進程。如果是瀏覽網頁中病毒的話,那就需要進行殺毒了
『捌』 如何編譯docker源碼
本文根據docker官方給出的docker代碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,了解了編譯步驟後,也可以結合自身遇到的網路問題進行「規避」。
docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。 如果想快速的查看編譯環境搭建指導,而不關注環境搭建的機制和細節,可以直接跳到最後一章「總結」。
前提
機器上已經安裝了docker,因為編譯環境是個docker容器,所以要事先有docker(daemon),後面會創建個編譯環境容器,在容器裡面編譯代碼。本文中使用物理機,物理機上運行著docker (daemon)。
機器(物理機)上安裝了git 。 後續使用git下載docker源碼
機器(物理機)上安裝了make。
下載ubuntu 14.04的docker鏡像
『玖』 請教,如何在ubuntu環境下編譯Docker的安裝文件
Docker 的基本用法
在本節中,我將向您介紹 Docker 命令的常用選項。例如如何下載一個 docker image,打造一個容器,以及如何訪問容器。
要創建一個新的容器,你應該選擇一個基本 image 的操作系統,例如啟動 Ubuntu 或者 CentOS 或其他系統。您可以搜索一個基本 image 使用 Docker 搜索命令:
docker search ubuntu
該命令將顯示所有 ubuntu images,你可以自己嘗試一下搜索 centos Images。
現在我們現在 base image到我們的服務中,使用命令:
docker pull ubuntu
現在,您可以通過使用命令來查看所有已下載的images:
docker images
Ubuntu 鏡像從DockerHub/Docker Registry下載。下一步驟是創建從該鏡像的容器。
要創建容器,可以使用docker create 或 docker run
docker create ubuntu:14.04
docker create 命令會創建一個新的容器,但不會啟動它。所以現在你需要使用運行命令:
docker run -i -t ubuntu:14.04 /bin/bash
此命令將創建並運行一個基於 Ubuntu14.04 鏡像的容器,容器內並運行一個命令/bin/bash,您將在容器內自動運行命令。
當你輸入 Exit 命令退出容器時,容器也是停止運行,如果你想容器在後台運行需要在命令後面添加 -d 參數。
docker run -i -t -d ubuntu:14.04 /bin/sh -c 「while true; do echo hello world; sleep 1; done」
/bin/sh -c 「while true; do echo hello world; sleep 1; done」 this is bash script to echo 「hello word」 forever.
現在你可以看到容器在後台運行通過命令:
docker ps
如果你想從 bash 命令看日誌結果,使用命令:
docker logs NAMES/ContainerID
怎樣在後台訪問容器 shell?這個命令將會連接你的容器 shell:
docker exec -i -t NAMES/ContainerID
你可以看到主機名和容器ID是相等的,這意味著你在容器shell內。當你在shell 上鍵入』exit`,會離開的shell,但容器仍在運行。
你會經常使用的另一個命令是:
docker stop NAME/ContainerID
這將停止容器而不將其刪除,這樣你就可以用命令重新啟動它:
docker start NAME/ContainerID
如果你想刪除的容器,先停止它,然後用命令將其刪除:
docker rm NAME/ContainerID
『拾』 如何在"特殊"的網路環境下編譯 Docker
由於 Docker 編譯需要依賴於 Docker Daemon ,所以只能在 64 位的 Linux 環境下先安裝 Docker 程序,再從 Github 上克隆 Docker 的代碼進行編譯。
在 Docker 的目錄下執行 make 命令將默認執行 Makefile 中 make binary 指令進行編譯。
?
default: binary
all: build
$(DOCKER_RUN_DOCKER) hack/make.sh
binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary
cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross
從以上的 Makefile 可以看出,執行 make、make binary、make all 或 make cross 都可以得到可運行的 Docker 程序。
在 Mac OS 環境下使用 brew 的命令安裝 Docker ,只能得到一個 docker client 的二進製程序,如果以 daemon 的方式運行,會得到 『This is a client-only binary - running the Docker daemon is not supported.』 的錯誤提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
?
FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker
Dockerfile 中只保留必要的步驟就可以實現編譯了。