導航:首頁 > 源碼編譯 > suse編譯安裝docker

suse編譯安裝docker

發布時間:2023-01-01 11:14:33

『壹』 請教,如何在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 中只保留必要的步驟就可以實現編譯了。

『叄』 超值一篇分享,Docker:從入門到實戰過程全記錄

作者 | 天元浪子

來源 | CSDN博客

想要真正理解Docker,就不得不從虛擬化技術的發展歷程說起。普遍認為虛擬化技術經歷了物理機時代、虛擬機時代,目前已經進入到了容器化時代。可以說,Docker是虛擬化技術不斷發展的必然結果。

那麼,什麼是容器呢?容器和虛擬機有什麼不同?Docker和容器又是什麼關系呢?搞明白這幾個問題,Docker的概念就清晰了。

1.1 虛擬機和容器

藉助於VMWare等軟體,可以在一台計算機上創建多個虛擬機,每個虛擬機都擁有獨立的操作系統,可以各自獨立的運行程序。這種分身術雖然隔離度高(操作系統級),使用方便(類似物理機),但佔用存儲資源多(GB級)、啟動速度慢(分鍾級)的缺點也是顯而易見的。

相較於虛擬機,容器(Container)是一種輕量型的虛擬化技術,它虛擬的是最簡運行環境(類似於沙盒)而非操作系統,啟動速度快(秒級)、佔用存儲資源少(KB級或MB級),容器間隔離度為進程級。在一台計算機上可以運行上千個容器,這是容器技術對虛擬機的碾壓式優勢。

1.2 容器、鏡像和Docker

Docker是一個開源的應用容器引擎,可以創建容器以及基於容器運行的程序。Docker可以讓開發者打包他們的應用和依賴包到一個輕量級、可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。

聽起來很簡單,但是在Docker和容器之間,還隱藏著一個鏡像的概念,令初學者頗感困惑。本質上,Docker鏡像是一個特殊的文件系統,它提供容器運行時所需的程序、庫、資源、配置等文件。Docker鏡像類似於一個py文件,它需要Docker的運行時(類似於python解釋器)運行。鏡像被運行時,即創建了一個鏡像的實例,一個實例就是一個容器。

1.3 Docker 和 k8s

作為容器引擎,Docker為容器化的應用程序提供了開放的標准,使得開發者可以用管理應用程序的方式來管理基礎架構,實現快速交付、測試和部署代碼。隨著容器的大量使用,又產生了如何協調、調度和管理容器的問題,Docker的容器編排應運而生。

k8s是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理,是一個開源的,用於管理雲平台中多個主機上的容器化的應用,k8s的目標是讓部署容器化的應用簡單並且高效,k8s提供了應用部署、規劃、更新、維護的一種機制。

Docker和k8sr都是以containerd(容器化標准)作為運行時,因此使用Docker創建的鏡像完全可以在k8s中無障礙的使用。


2.1 在ubuntu中安裝

在linux系統中安裝Docker非常簡單,官方為我們提供了一鍵安裝腳本。這個方法也適用於Debian或CentOS等發行版。

安裝過程如果出現超時,不要灰心,多試幾次,總會成功的。安裝完成後,Docker只能被root用戶使用,可以使用下面的命令取消許可權限制:

然後,重啟docker服務:

最後,關閉當前的命令行,重新打開新的命令行就可以了。

順便提一下,如果在CentOS下安裝,可能會出現一堆類似於下面的錯誤:

這是由於docker和Podman沖突造成的,需要先卸載Podman:

2.2 在Win10中安裝

Docker的運行,依賴linux的環境,官方提供了Docker Desktop for Windows,但是它需要安裝Hyper-V,Hyper-V是微軟開發的虛擬機,類似於 VMWare 或 VirtualBox,僅適用於 Windows 10。這個虛擬機一旦啟用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本將無法使用!如果你必須在電腦上使用其他虛擬機(例如開發 Android 應用必須使用的模擬器),請不要使用 Hyper-V!

我的電腦是win10家庭版,不能直接安裝hyper-v,需要將下面的命令保存到cmd文件中:

然後在cmd文件上點擊右鍵,選擇使用管理員運行。執行完畢後會重啟,在重啟的過程中進行安裝。

2.3 Hello world

docker服務啟動的情況下,運行下面的命令:

此命令的含義是:

第一次運行時,因為本地沒有ubuntu:20.04鏡像,docker會自動從鏡像伺服器下載。下載過程可能需要多試幾次,只要成功一次,以後執行就不再需要下載了。

docker官方還提供了一個hello-world鏡像,可以直接運行:

此命令省略了鏡像版本和運行參數,docker使用latest作為版本,即最新版本。

從hello world的例子中,也可以體驗到,docker實例的運行是非常快的。


docker官方的鏡像庫比較慢,在進行鏡像操作之前,需要將鏡像源設置為國內的站點。

新建文件/etc/docker/daemon.json,輸入如下內容:

然後重啟docker的服務:

3.1 列出本地所有鏡像

執行命令 docker images 可以查看

當前我本地只有剛才安裝的兩個鏡像。

3.2 從鏡像庫中查找鏡像

執行命令 docker search 鏡像名稱可以從docker鏡像庫中查找鏡像。

最好選擇官方(OFFICIAL)的鏡像,這樣的鏡像最穩定一些。

3.3 下載新的鏡像

執行命令docker pull 鏡像名稱:版本號即可下載新的鏡像。

鏡像下載後,就可以使用鏡像來創建容器了。


4.1 啟動容器

執行命令docker run即可啟動容器,也就是創建某個鏡像的實例。docker run命令非常復雜,可以先執行一個docker run --help來查看幫助:

比如我們要執行python的shell,需要添加-it參數,即:docker run -it python:3.8

4.2 將宿主機的文件掛載到容器

docker容器與宿主機是隔離的,要想讓容器內的程序能訪問宿主機上的文件,需要通過-v參數將宿主機的文件掛載到容器中。

比如我們在宿主機上有一個hello.py,可以列印hello,想要在python容器中執行,就需要進行掛載。-v後還需要接兩個參數,分別是宿主機的目錄和容器內的目錄,兩者使用:分隔,路徑必須都是絕對路徑。

我的hello.py保存在主目錄的/docker_test目錄中,將這個目錄掛載到容器的/docker_test目錄,然後在容器內執行python /docker_test/hello.py:

4.3 容器的埠映射

我們修改一下hello.py,創建一個socket服務端,並監聽5000埠,當有客戶端連接時,列印客戶端的地址,先客戶端發送hello,然後關閉連接:

在容器內執行:

接下來,嘗試用telnet命令連接,結果卻是失敗的。原因是,127.0.0.1是宿主機的ip地址,5000是容器的埠,這與我們的習慣稍微有些不同。事實上,docker的容器是非常輕量的,它並沒有自己的網路,要想訪問容器的埠,需要進行埠映射,將容器的某埠映射到宿主機的埠,客戶端連接時,只要與宿主機的埠進行連接就可以了。

需要注意的是,上面的代碼創建的伺服器,無論如何也不可能被客戶端連接,因為代碼中綁定了127.0.0.1的ip,在容器中運行時,需要綁定所有ip,即0.0.0.0。

然後,再使用-p參數,-p還需要三個參數,即宿主機的ip地址、宿主機的埠、容器的埠,三者之間使用:分隔。一般的,可以將宿主機的ip地址省略,只寫宿主機的埠:容器的埠即可。

這樣,就將容器的5000埠映射到了宿主機的5001埠,使用:

即可與容器中的伺服器進行連接。

4.4 容器管理

上面的服務運行之後,可以使用docker ps命令,查看運行中的容器:

顯示的內容有下面幾列:

要想結束容器,可以使用docker kill 容器ID命令。


一般而言,當我們的程序開發完成後,會連同程序文件與運行環境一起製作成一個新的鏡像。

要製作鏡像,需要編寫Dockerfile。DockeFile由多個命令組成,常用的命令有:

注意,Docker鏡像中有一個層的概念,每執行一個RUN命令,就會創建一個層,層過多會導致鏡像文件體積增大。盡量在RUN命令中使用&&連接多條shell命令,減少RUN命令的個數,可以有效減小鏡像文件的體積。

5.1 自製顯示文本文件內容鏡像

編寫cat.py,接收一個文件名,由python讀取文件並顯示文件的內容:

這個例子比較簡單,縮寫Dockerfile如下:

這個Dockerfile的含義是:

需要說明的是,ENTRYPOINT有兩種寫法:

這里採用第二種寫法,是因為我們要在外部給容器傳遞參數。執行命令編譯Docker鏡像:

這個命令中,-t的含義是目標,即生成的鏡像名為hello,版本號為1.0,別忘了最後那個.,這叫到上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如復制),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。

這樣,我們的第一個鏡像就製作完成了,使用下面的命令執行它:

即可看到~/docker_test/cat/files/test.txt的內容。

5.2 自製web伺服器鏡像

我們使用tornado開發一個網站,而python的官方鏡像是沒有tornado庫的,這就需要在製作鏡像時進行安裝。

測試的ws.py如下:

編寫Dockerfile文件如下:

在此我們驗證一下CMD與ENTRYPOINT的區別。在Dockerfile所在有目錄下執行如下命令:

執行完成後,再使用docker images使用就可以看到生成的鏡像了,然後使用下面的命令運行:

在瀏覽器中輸入宿主機的ip和8000埠,就可以看到頁面了。

在這個例子中,我使用的運行命令是CMD,如果在docker run中指定的其他的命令,此命令就不會被執行,如:

此時,容器中被執行的是python命令,而不是我們的服務。在更多情況下,我們希望在docker run命令中為我們的服務傳參,而不是覆蓋執行命令,那麼,我們應該使用ENTRYPOINT而不是CMD:

上面這種寫法,是不支持傳遞參數的,ENTRYPOINT和CMD還支持另一種寫法:

使用這種寫法,docker run命令中的參數才可以傳遞給hello.py:

這個命令中,--port=9000被作為參數傳遞到hello.py中,因此容器內的埠就成了9000。

在生產環境中運行時,不會使用-it選項,而是使用-d選項,讓容器在後台運行:

這種方式下,即使當前的控制台被關閉,該容器也不會停止。

5.3 自製apscheler服務鏡像

接下來,製作一個使用apscheler編寫的服務鏡像,代碼如下:

Dockerfile也是信手拈來:

生成鏡像:

應該可以運行了,文件復制需要兩個目錄,在運行時,可以使用兩次-v來掛載不同的目錄:


前面用到的官方python鏡像大小足足882MB,在這個基礎上,再安裝用到的第三方庫,添加項目需要的圖片等資源,大小很容易就超過1個G,這么大的鏡像,網路傳給客戶非常的不方便,因此,減小鏡像的體積是非常必要的工作。


docker hub上有個一python:3.8-alpine鏡像,大小隻有44.5MB。之所以小,是因為alpine是一個採用了busybox架構的操作系統,一般用於嵌入式應用。我嘗試使用這個鏡像,發現安裝一般的庫還好,但如果想安裝numpy等就會困難重重,甚至網上都找不到解決方案。

還是很回到基本的路線上來,主流的操作系統鏡像,ubuntu的大小為72.9MB,centos的大小為209MB——這也算是我更喜歡使用ubuntu的一個重要原因吧!使用ubuntu作為基礎鏡像,安裝python後的大小為139MB,再安裝pip後的大小一下子上升到了407MB,要是再安裝點其他東西,很容易就趕上或超過python官方鏡像的大小了。

看來,尋常路線是很難壓縮鏡像文件體積了。幸好,還有一條曲線救國的路可走,這就是多階段構建法。

多階段構建的思想其實很簡單,先構建一個大而全的鏡像,然後只把鏡像中有用的部分拿出來,放在一個新的鏡像里。在我們的場景下,pip只在構建鏡像的過程中需要,而對運行我們的程序卻一點用處也沒有。我們只需要安裝pip,再用pip安裝第三方庫,然後將第三方庫從這個鏡像中復制到一個只有python,沒有pip的鏡像中,這樣,pip佔用的268MB空間就可以被節省出來了。

1、在ubuntu鏡像的基礎上安裝python:

然後運行:

這樣,就生成了python:3.8-ubuntu鏡像。

2、在python:3.8-ubuntu的基礎上安裝pip:

然後運行:

這樣,就生成了python:3.8-ubuntu-pip鏡像。

3、多階段構建目標鏡像:

這個dockerfile需要解釋一下了,因為它有兩個FROM命令。

第一個是以python:3.8-ubuntu-pip鏡像為基礎,安裝numpy,當然,在實際應用中,把所有用到的第三方庫出寫在這里。

第二個FROM是以FROM python:3.8-ubuntu鏡像為基礎,將第三方庫統統復制過來,COPY命令後的–from=0的意思是從第0階段進行復制。實際應用中再從上下文中復製程序代碼,添加需要的ENTRYPOINT等。

最後,再運行:

這然,用於我們項目的鏡像就做好了。比使用官方python鏡像構建的版本,小了大約750MB。


到此,我們的鏡像已經製作好了,可是,鏡像文件在哪,如何在生產環境下運行呢?

剛才使用docker images命令時,已經看到了生成的鏡像:

我們可以使用docker save命令將鏡像保存到指定的文件中,保存的文件是一個.tar格式的壓縮文件:

將hello.tar復制到生產環境的機器上,然後執行導入命令:

就可以使用了。

『肆』 怎樣製作docker基礎鏡像 suse

初次安裝部署好docker後,大多數鏡像可以從DockerHub 提取,但是大多數人都希望自己可以完全自定義一個鏡像,那麼這里需要一個第三方工具 febootstrap epel6的源提供febootstrap的RPM包 yum install docker-io febootstrap -y service docker start。

『伍』 如何編譯docker 1.2.0版本的源碼

經過研究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

『陸』 怎麼安裝suse系統

准備工具:

默認安裝vmware12pro虛擬機軟體,可以在本站下載。

下載opensuse42.3系統鏡像,5分享--》鏡像--》linux下載系統。

開始新建虛擬機

分配處理器,然後下一步。

分配內存。帶桌面的最少1G,不帶桌面可以分配512M。

創建給虛擬機的硬碟。

參考:網頁鏈接

『柒』 如何在 CentOS 7 上安裝 Docker

在編譯docker代碼之前肯定需要研究一下docker的代碼結構以及官方推薦的方式,因為docker是開源的,所以很多第三方開發者參與。那麼官方肯定會給出開發環境搭建的文檔,所以拿到代碼肯定先研究官方的編譯方法。通過文檔和代碼了解到docker官方推薦的是在docker本身的容器裡面搭建環境和編譯,官方給出的是一個基於ubuntu的dockerfile。不過正是這個dockerfile可以清楚的知道需要為了編譯准備哪些依賴環境,為我們後面自己編譯提供了環境搭建的基礎。然後就嘗試了官方的編譯方案,結果各種網路問題導致編譯通不過,當然網上也有相應的解決方案,基本上就是替換一些依賴源(國外的被牆了)。但是就算編譯通過了也只是一個基於ubuntu的二進制文件,只能在ubuntu的相應的系統上運行。我們需要的是一個可以在centos7上運行的二進制文件,關鍵要搭建一個可以持續開發和編譯測試的環境。當然也可以製作一個centos7的dockerfile文件,對照著官方的ubuntu的dockerfile也很簡單。但是這些都是還需要有一個前提,就是需要先安裝一個以前版本的docker來啟動這個環境澀,好處也是杠杠的,可以在任何一台能夠運行docker的系統上進行開發和測試,而且可以進行持續集成。不過對於我們來說能夠編譯出一個穩定運行在centos7上的二進制文件即可,所以就嘗試直接在本地進行編譯,而不是通過docker的容器進行。
經過研究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
第二個在官方的dockerfile文件裡面有解決方案,執行如下命令:

git clone --no-checkout https://git.fedorahosted.org/git/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103

cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper

第三個btrfs使用如下安裝依賴: yum install btrfs-progs。
這些依賴都解決了就繼續編譯,這個時候可能會出現ld連接錯誤,提示找不到庫。因為docker編譯的方式完全是static,所以所有依賴的庫必須還要有相應的靜態庫(.a),而不是動態庫(.so)。剛才通過yum install sqlite-devel.x86_64安裝了sqlite3的依賴,但是最後發現裡面沒有靜態庫,所以編譯ld的時候出錯了。我的解決辦法就是重新到sqlite3的官方網站下載了源碼包,然後編譯安裝即可。
編譯完成以後,就會在docker源碼目錄下的bundles/1.3.1/binary/目錄有如下文件:
docker docker-1.3.1 docker-1.3.1.md5 docker-1.3.1.sha256
docker-1.3.1這個文件就是我們需要的二進制文件了,docker是一個軟連接到docker-1.3.1的文件。
到此就成功完成編譯了,以後修改了代碼重新支持編譯腳步即可:

./hack/make.sh binary

『捌』 如何編譯Docker源碼

本文根據docker官方給出的docker代碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,了解了編譯步驟後,也可以結合自身遇到的網路問題進行「規避」。
docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。 如果想快速的查看編譯環境搭建指導,而不關注環境搭建的機制和細節,可以直接跳到最後一章「總結」。

前提
機器上已經安裝了docker,因為編譯環境是個docker容器,所以要事先有docker(daemon),後面會創建個編譯環境容器,在容器裡面編譯代碼。本文中使用物理機,物理機上運行著docker (daemon)。
機器(物理機)上安裝了git 。 後續使用git下載docker源碼
機器(物理機)上安裝了make。
下載ubuntu 14.04的docker鏡像

下載docker源碼
git clone
會把代碼下載到當前目錄下,後面會把代碼拷貝到容器中。

編譯前分析
官方給的編譯方法是make build 和 make binary等。下面先分析Makefile,看懂Makefile後,編譯環境的准備流程就比較清楚了。

Makefile
在下載的docker源碼中可以看到它的Makefile,Makefile中比較關鍵的幾個參數:
DOCKER_MOUNT := $(if $(BIND_DIR),-v "$(CURDIR)/$(BIND_DIR):/go/src/github.com/docker/docker/$(BIND_DIR)") DOCKER_MOUNT 表示創建容器時的mount參數。因為編譯環境是一個容器,在後續的步驟中啟動容器時使用DOCKER_MOUNT參數,會將物理機上的目錄mount給容器容器,容器中該目錄是編譯生成docker二進制文件的目錄。
DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_ENVS) $(DOCKER_MOUNT) 這是後面創建docker容器時的命令行的一部分,其中包含了前面的DOCKER_MOUNT參數。
DOCKER_IMAGE := docker-dev$(if $(GIT_BRANCH),:$(GIT_BRANCH)) 這是docker image參數,鏡像的名字是docker-dev,以當前git中docker版本作為tag名。這個鏡像是在make build一步做出來的。
DOCKER_RUN_DOCKER := $(DOCKER_FLAGS) "$(DOCKER_IMAGE)" 創建docker容器的命令行,組合了前面的DOCKER_FLAGS 和 DOCKER_IMAGE 。 從命令行中可以看出,啟動容器使用的參數有 --rm -i --privileged,使用了一些環境變數,還有使用了-v參數把物理機上目錄mount給容器,在容器中編譯好二進制文件後放到該目錄中,在物理機上就能獲得docker二進制文件。啟動的的docker 容器鏡像名字是docker-dev。下文會介紹docker-dev鏡像是怎麼來的。
由於官方給出的「構建編譯環境」的方法是執行 make build,下面在Makefile中看到build分支是這樣的:

make build時會調用 docker build -t "$(DOCKER_IMAGE)" . 去製作一個叫做DOCKER_IMAGE的鏡像。
進行源碼編譯的方式是執行 make binary來編譯代碼,在Makefile中make binary的分支如下:

make binary除了進行 make build以外,會執行$(DOCKER_RUN_DOCKER),即上文提到的docker run命令行。由於執行過了build,會build出來docker-dev鏡像,所以在docker run時直接使用前面build出來的鏡像。docker run時的命令行參數是hack/make.sh binary。make binary的過程實際上是創建一個容器,在容器中執行hack/make.sh binary腳本。接下來會詳細介紹make build和make binary所做的內容。
make build
根據官方的指導,先執行make build來搭建編譯環境。上面分析了,make build實際上是製作了一個鏡像,這個鏡像里會包含編譯代碼所需的環境。下面來介紹下這個鏡像。

Dockerfile
在和Makefile相同的目錄下(源碼的根目錄),有Dockerfile。執行make build 相當於調用docker build,使用的就是該Dockerfile。Dockerfile中的幾個主要步驟(有些步驟這里略過):
FROM ubuntu:14.04 使用ubuntu 14.04作為基礎鏡像;在宿主機上,要事先下載好ubuntu 14.04鏡像。
安裝一些編譯需要的軟體;
用git下載lvm2源碼,並編譯安裝;
下載並安裝GO 1.5.1;
安裝GO相關的tools 可以做code coverage test 、 go lint等代碼檢查
安裝registry和notary server;
安裝docker-py 後面跑集成測試用的
將物理機的contrib/download-frozen-image.sh 腳本拷貝到鏡像中/go/src/github.com/docker/docker/contrib/
運行contrib/download-frozen-image.sh 製作鏡像 實際上這一步只是下載了3個鏡像的tar文件。注意:docker build相當於創建一個臨時的容器(在臨時的容器中執行Dockerfile中的每一步,最後在保存成鏡像),「運行contrib/download-frozen-image.sh 製作鏡像」這個動作出現在Dockerfile中,相當於在docker build所創建的臨時的容器中下載docker鏡像,有docker-in-docker容器嵌套的概念。下一小節會對download-frozen-image.sh腳本做詳細分析。
ENTRYPOINT ["hack/dind"] 做出來的鏡像,使用它啟動的容器可以自動運行源碼目錄中的hack/dind腳本。 dind這個腳本是a wrapper script which allows docker to be run inside a docker container 。後面的小節會對hack/dind腳本做詳細的分析。
COPY . /go/src/github.com/docker/docker 把物理機上的docker源碼文件打入到鏡像中
download-frozen-image.sh腳本
上一小節里提到,在Dockerfile中,有一步會調用contrib/download-frozen-image.sh ,它主要作用是下載3個鏡像的tar包,供後續docker load。在Dockerfile中的調用方式如下:

download-frozen-image.sh腳本中會依次解析參數,其中/docker-frozen-images作為base dir,後面下載的東西全放到這里。之後的3個參數是鏡像,裡麵包含了鏡像名(例如busybox)、鏡像tag(例如latest)、鏡像id(例如),後面會在循環中依次下載這3個鏡像的tar文件。
download-frozen-image.sh腳本中會通過curl從registry上獲取如下信息:
token:獲取token,後面curl獲取的其他信息時都需要使用token。例如本例中 token='signature=,repository="library/busybox",access=read'
ancestryJson:把鏡像相關聯的歷史層次的id也都獲取到,因為每一層的tar都需要下載。本例中 ancestryJson='["", ""]'
這里可以看到這個鏡像只有2層,兩層的id這里都列了出來。 每個鏡像包含的層數不同,例如。第三個鏡像jess/unshare共有10層。
VERSION、json、tar: 每一層鏡像id的目錄下,都下載這3個文件,其中VERSION文件內容目前都是「1.0」,json文件是該層鏡像的json文件,tar文件是該層鏡像的真正內容,以.tar保存。
下載好的各層鏡像目錄結構如下:
$ls

$tree

hack/dind腳本
在Dockerfile中,ENTRYPOINT ["hack/dind"] ,表示在鏡像啟動後,運行該腳本,下面分析一下這個腳本的功能。
腳本在代碼根目錄下的hack目錄中,作者對腳本的描述是 DinD: a wrapper script which allows docker to be run inside a docker container.
就是可以在docker容器中創建docker容器。它就做了一個事,那就是在容器中創建好cgroup目錄,並把各個cgroup子系統mount上來。
為了方便理解,我們可以先看看物理機。在宿主機上如果創建docker容器,需要宿主機上必須事先mount cgroup子系統,因為cgroup是docker容器的一個依賴。同理docker-in-docker也要求外層的docker容器中有cgroup子系統,dind腳本在容器啟動後,先去/proc/1/cgroup中獲取cgroup子系統,然後依次使用mount命令,將cgroup mount上來,例如mount -n -t cgroup -o "cpuset" cgroup "/cgroup/cpuset"
最終在運行make build後,會製作出一個叫docker-dev的鏡像。
make binary
執行make binary 就可以編譯出docker二進制文件。編譯出來的二進制文件在源碼目錄下的bundles/1.10.0-dev/binary/docker-1.10.0-dev ,其中還包含md5和sha256文件。

Makefile中的binary
Makefile中關於make binary流程是

先執行build,即上一節介紹的,製作docker-dev編譯環境鏡像。
再執行DOCKER_RUN_DOCKER,創建容器,DOCKER_RUN_DOCKER就是執行docker run,使用docker-dev鏡像啟動容器,並且會mount -v 將容器生成二進制文件的路徑與宿主機共享。DOCKER_RUN_DOCKER在「編譯前分析」一章中有介紹。啟動的容器運行的命令行是 hack/make.sh binary 。docker run完整的形式如下:
docker run --rm -i --privileged -e BUILDFLAGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXECDRIVER -e DOCKER_EXPERIMENTAL -e DOCKER_REMAP_ROOT -e DOCKER_GRAPHDRIVER -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "/home/mu/src/docker/docker/bundles:/go/src/github.com/docker/docker/bundles" -t "docker-dev:master" hack/make.sh binary
hack/make.sh腳本
上一節提到的make binary中創建的容器啟動命令是hack/make.sh binary,運行容器中的(docker源碼目錄下的)hack/make.sh腳本,參數為binary。
make.sh中根據傳入的參數組裝後續編譯用的flags(BUILDFLAGS),最後根據傳入的參數依次調用 hack/make/目錄下對應的腳本。例如我們的操作中傳入的參數只有一個binary。那麼在make.sh的最後,會調用hack/make/binary腳本。
hack/make/binary腳本中,就是直接調用go build進行編譯了,其中會使用BUILDFLAGS LDFLAGS LDFLAGS_STATIC_DOCKER等編譯選項。
如果最終生成的docker二進制文件不在bundles/1.10.0-dev/binary/目錄下,那麼可能是編譯參數BINDDIR設置的不正確,可以在執行make binary時增加BINDDIR參數,例如
make BINDDIR=. binary , 將BINDDIR設置為當前目錄。
總結
編譯步驟總結:
1、編譯前在物理機上安裝好make、git,並下載好docker代碼。下載好ubuntu:14.04鏡像
2、執行make build 。這步執行完會在物理機上創建出一個docker-dev的鏡像。
3、執行make binary 。 這步會使用docker-dev鏡像啟動一個容器,在容器中編譯docker代碼。編譯完成後在物理機上直接可以看到二進制文件。默認二進制文件在 bundles/1.10.0-dev/binary/目錄下
4、docker代碼里有很多test,可以使用此套編譯環境執行test,例如 make test 。 更多參數可以看Makefile
搭建環境心得:
1、在make build時,使用Dockerfile創建製作鏡像,這個鏡像有40多層,其中一層失敗就會導致整個build過程失敗。由於Dockerfile中很多步驟是要連到國外的網站去下載東西,很容易失敗。好在docker build有cache機制,如果前面的層成功了,下次重新build時會使用cache跳過,節省了很多時間。所以如果make build中途失敗(一般是由於國內連國外的網路原因),只要重新執行make build就會在上次失敗的地方繼續,多試幾次可以成功。
2、如果其他人已經build出了docker-dev鏡像,可以把它下載到自己的環境上。這樣在自己make build時,會跳過那些已經在本地存在的層,可以節省時間。
3、每一次編譯會自動刪除掉前面已經生成的二進制文件,所以不用擔心二進制文件不是最新的問題。

『玖』 linux怎麼安裝docker

1 在 CentOS 6.4 上安裝 docker
docker當前官方只支持Ubuntu,所以在 CentOS 安裝Docker比較麻煩(Issue #172)。
docker官方文檔說要求Linux kernel至少3.8以上,CentOS 6.4是2.6的內核,於是我哼哧哼哧的編譯安裝了最新的kernel 3.11.6,重啟後運行docker還是失敗,最後找到原因,是因為編譯時忘記集成aufs模塊了。aufs 需要和 kernel 一起編譯,很麻煩。
不過不需要這么麻煩,有強人已經編譯好了帶aufs模塊的內核,見這里Installing docker.io on centos 6.4 (64-bit)
1.1 取消selinux,因為它會干擾lxc的正常功能
sudo vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

1.2 安裝 Fedora EPEL
sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

1.3 添加 hop5 repo地址
cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo

1.4 安裝 docker-io
sudo yum install docker-io

會自動安裝帶aufs模塊的3.10內核,以及docker-io包。
1.5 將 cgroup 文件系統添加到 /etc/fstab , 只有這樣docker才能正常工作
sudo echo "none /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab

1.6 修改grub引導順序
sudo vim /etc/grub.conf
default=0

設置default為新安裝的內核的位置,一般是0
1.7 重啟
sudo reboot

1.8 檢查新內核是否引導成功
重啟後,檢查一下新內核是否引導起來了
uname -r
3.10.5-3.el6.x86_64

說明成功了
看一下 aufs是否存在
grep aufs /proc/filesystems
nodev aufs

說明存在
1.9 啟動 docker daemon 進程
sudo docker -d &

如果你在公司,且公司內部都是通過代理上網,則可以把代理伺服器告訴docker,用如下命令(參考這里):
sudo HTTP_PROXY=http://xxx:port docker -d &

1.10 下載 ubuntu 鏡像
sudo docker pull ubuntu

1.11 運行 hello world
sudo docker run ubuntu /bin/echo hello world
hello world

安裝成功了!!

『拾』 如何在Linux上安裝配置DockerUI

1、檢查系統需求
Apache/Nginx
MySQL
php 5.5.9+
Composer
PHP擴展:OpenSSL、 PDO、Mbstring、Tokenizer、Fileinfo、GD(2.0+)/Imagick(6.5.7+)
系統滿足上述需求後才能繼續進行安裝。
2、使用Composer安裝項目和依賴
在web根目錄下運行以下命令:
composer create-project pyrocms/pyrocms=3.0-beta1 --prefer-source

注意在Windows系統中這里我們不能使用--prefer-dist選項進行安裝,否則會報錯:
[ErrorException]
ZipArchive::extractTo(): No such file or directory

註:使用--prefer-source選項會強制克隆源代碼,而不是像--prefer-dist那樣強制下載git引用的壓縮包。
Composer使用PHP的ZipArchive擴展壓縮文件,使用--prefer-dist安裝在Windows系統上存在一個問題:如果路徑大於256個字元或者包含.會拋出上述錯誤異常,進而導致Composer不能繼續往下運行。Linux上則不存在這個問題。
安裝完成後,如果是在Linux環境需要配置storage、public/assets、bootstrap/cache目錄的可寫許可權。
如果你覺得Composer安裝麻煩還可以使用學院提供的一鍵安裝包:PyroCMS 3.0測試版一鍵安裝包。
3、在瀏覽器中完成安裝和配置
在瀏覽器中導航到http://localhost/pyrocms/public,頁面會自動跳轉到安裝界面http://localhost/pyrocms/public/installer,此時頁面可能會出現錯誤頁面,錯誤提示信息如下:
FatalErrorException in Container.php line 790:
Maximum function nesting level of '100' reached, aborting!

在Laravel中這並不是什麼bug,只是因為安裝了XDebug而PHP配置文件中xdebug.max_nesting_level對應值設置過低的緣故(默認為100),我們只需將其值設置為250(Homestead虛擬機中就是這么設置的)並重啟web伺服器即可。
注意第一次訪問需要較長時間,這是因為要編譯並載入前端資源的緣故。載入完成後,安裝頁面顯示如下(部分截圖):

在該頁面我們要填寫資料庫配置信息,管理員賬戶信息以及站點的一些通用配置。填寫完成後點擊「Save」按鈕提交表單,然後進入安裝進度頁面,完成站點相關配置和初始化操作,以及基本模塊和擴展的安裝:

安裝完成後顯示如下:

點擊「Login」按鈕進入登錄頁面:

填寫我們之前提交的管理員賬戶信息進行登錄。登錄成功後跳轉到後台管理頁面http://localhost/pyrocms/public/admin/dashboard:

PyroCMS採用類似Drupal(一個流行的開源CMS)的節點(Node)方式來組織內容,一切元素諸如表單元素、分類、類型、設置等都可以看作節點,然後以節點方式組成內容,比如發布Posts需要先創建分類,類型(如文章、視頻等),以及文章欄位對應的表單元素節點等。感興趣的同學可以去玩玩,這里我就不深入探討了。

閱讀全文

與suse編譯安裝docker相關的資料

熱點內容
小愛同學app里怎麼設置鬧鍾 瀏覽:626
微信小程序題庫源碼 瀏覽:734
國內程序員女高管 瀏覽:881
程序員會壓抑 瀏覽:682
物探編程 瀏覽:302
vuepdf預覽 瀏覽:327
迷你世界出編程軟體了 瀏覽:673
res文件夾有哪些 瀏覽:142
交通信號燈單片機課程設計 瀏覽:826
如何測試流媒體伺服器的並發能力 瀏覽:161
溯源碼有分國家認證的嗎 瀏覽:218
如何通過app查詢產檢報告 瀏覽:944
拉結爾安卓手機怎麼用 瀏覽:695
驅動級進程代理源碼 瀏覽:782
androidshape畫線 瀏覽:511
程序員想辭職被拒絕 瀏覽:101
java面試邏輯 瀏覽:749
如何下載全英文app 瀏覽:724
js函數式編程指南 瀏覽:380
為什麼安卓手機相機啟動會卡 瀏覽:341