手工編譯安裝docker
㈠ Docker編譯文件安裝
docker安裝包地址: https://download.docker.com/linux/static/stable/x86_64/
大家可以根據自己的需求選擇適應的版本,我選擇的版本的【20.10.10】
docker.service文件內容如下:
鏡像導出命令:
我們可以查看鏡像的名稱和版本:
所以這里的具體的導出命令是:
將tar文件上傳到內網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代碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,了解了編譯步驟後,也可以結合自身遇到的網路問題進行「規避」。
docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。 如果想快速的查看編譯環境搭建指導,而不關注環境搭建的機制和細節,可以直接跳到最後一章「總結」。
前提
機器上已經安裝了docker,因為編譯環境是個docker容器,所以要事先有docker(daemon),後面會創建個編譯環境容器,在容器裡面編譯代碼。本文中使用物理機,物理機上運行著docker (daemon)。
機器(物理機)上安裝了git 。 後續使用git下載docker源碼
機器(物理機)上安裝了make。
下載ubuntu 14.04的docker鏡像
㈣ 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
安裝成功了!!
㈤ 如何在"特殊"的網路環境下編譯 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 中只保留必要的步驟就可以實現編譯了。
方法 3.
對 Docker 代碼中的 Docker 進行徹底的改造,用國內的各種鏡像替換其中不能在「正常」網路條件下訪問的鏡像,使得代碼能夠快速編譯通過。
?
FROM docker.cn/docker/ubuntu:14.04.1
MAINTAINER Meaglith Ma <[email protected]> (@genedna)
RUN echo "deb http://mirrors.aliyun.com/ubuntu trusty main universe" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0* \
unzip \
--no-install-recommends
RUN git clone --no-checkout https://coding.net/genedna/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103
RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper
RUN curl -sSL http://docker-cn.qiniudn.com/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
ENV PATH /go/bin:$PATH
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm
ENV GOARM 5
RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'
RUN mkdir -p /go/src/github.com/gpmgo \
&& cd /go/src/github.com/gpmgo \
&& curl -o gopm.zip http://gopm.io/api/v1/download?pkgname=github.com/gpmgo/gopm\&revision=dev --location \
&& unzip gopm.zip \
&& mv $(ls | grep "gopm-") gopm \
&& rm gopm.zip \
&& cd gopm \
&& go install
RUN gopm bin -v code.google.com/p/go.tools/cmd/cover
RUN gem sources --remove https://rubygems.org/ \
&& gem sources -a https://ruby.taobao.org/ \
&& gem install --no-rdoc --no-ri fpm --version 1.0.2
RUN gopm bin -v -d /go/bin github.com/cpuguy83/go-md2man@tag:v1
RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox
RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg
RUN git config --global user.email '[email protected]'
RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeser
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
以上的命令把 Ubuntu 鏡像中的源替換為國內速度較快的阿里源;把 lvm2 鏡像到國內的 Git 託管服務 coding.net;從 七牛雲存儲 保存的 Golang 源碼進行獲取和編譯;使用 gopm 下載編譯所需要的 Library ;最後把其中 gem 源切換到淘寶。至此,可以在「特殊」的網路條件下快速編譯 Docker 。
㈥ debian 8 怎麼安裝Docker
1 系統安裝
為了保險、省事,我刻錄光碟安裝的系統。光碟啟動時,界面顯示Install,以及其他選項。如果您需要安裝其他桌面,請選擇下方的Advanced Options,選擇其他桌面。看到初中英語都有強迫症的人,請出門左轉,選擇Windows系統使用。
安裝過程相對Ubuntu、openSUSE等系統來說比較復雜,所以安裝過程必須仔細閱讀每一步的提示文字,並要謹慎操作。安裝結束後,就要進行系統配置了。
如果您選擇讓系統自動幫您分區,系統也會提示您是否將/home單獨分區。個人強烈建議將/home單獨分區,如果系統需要重裝,就可以讀取之前的配置文件,重裝後的軟體就不需要配置了。當然,如果系統因為配置文件錯誤而崩潰,則需要重新生成配置文件,那時將配置文件全部刪除即可,個人存儲的文件,比如文檔、音樂、視頻、圖片等,可以免遭破壞。
2 系統配置
在配置系統之前,必須刷新軟體源,否則軟體是安裝不上的,你再著急都沒用。如何刷新軟體源,請參見2.1。
系統裝好後,一些版權受限的插件已經被安裝了,系統可以播放mp3、mp4等格式的音頻和視頻,而且不會出現亂碼問題。但flash需要手動更新,詳情參見2.4。
2.1 軟體源
對於Ubuntu用戶來說,我強烈不建議選用中國境內的鏡像源,最好使用主源。因為根據我的經驗,中國境內的鏡像源(如華中科技大學開源鏡像站等)的軟體包不全,一部分軟體包沒有,但是官方的主源則不存在這個問題。然而,經過我的摸索,Debian源不存在這個問題,但是選用一部分源時,要麼提示Hash校驗和不符,要麼在安裝軟體包時提示「軟體包未經驗證」。經過我的摸索,中國科技大學的Debian源不存在這個問題。
修改軟體源,網上很多帖子都建議直接修改sources.list,我個人不建議這樣做。因為對於新手來說,這種敏感操作非常容易出問題,而且這樣需要使用命令操作,給習慣了windows系統的新手感覺Linux很難用。不管是Ubuntu還是Debian,都可以在圖形界面修改。方法是:新立得軟體包管理器——設置——軟體庫。參照已經給出的源列表進行修改。
選用了速度比較快的源,對於系統中軟體安裝和更新來說,是比較重要的。但是,有些人卻不清楚我為何安裝軟體需要插入DVD光碟,原因就是默認將DVD作為本地源加入了源列表。如果您不需要,可以在「軟體庫」設置中,將cdrom://這個源取消勾選。但是個人建議保留,因為Debian的DVD裡麵包含了很多軟體,其中DVD 1 中是最常見的軟體,配置基本的桌面都需要從DVD 1 中抓取軟體包進行安裝。如果您打算使用unstable或者testing,請去掉cdrom源,並修改其他源為對應的版本,詳情請參見官方wiki,在此我不贅述了。
刷新軟體源方法:在新立得軟體包管理器點擊「刷新」,也可以按照如下命令:
# apt-get update
或
# aptitide update
如果添加cdrom源,那麼在插入光碟後,在新立得軟體包管理器中,編輯——添加CD-ROM,或者運行如下命令:
# apt-cdrom add
2.2 無線網卡驅動
這個是最棘手的,最頭痛的。我第一次安裝時,查了一個下午的資料,試驗了各種方法。我最先參考官方wiki,但是wiki中提供的方法無效。我有Linux經驗,所以我的操作是沒有絲毫錯誤的。在搜索了幾十個網頁後,最終安裝成功。方法如下:
2.2.1 執行如下命令:
# apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') build-essential dkms broadcom-sta-moles
2.2.2 安裝驅動:
# dpkg -i wireless-bcm43142-dkms_6.20.55.19-1_amd64.deb
這個驅動程序您可以從網路上下載到。實際上,也可以手工編譯出來。如果您想自己編譯出這個文件,可以上網搜索一下,由於我學校網路情況特別糟糕,我無法打開這個網頁(這個網頁是我們國內的網站,但是我學校的網路封鎖了大量國內外網站,比如CSDN、linuxsir、網路貼吧、網路快照、bing快照等,所以我無法打開這個網頁)。
2.2.3 激活網卡:
# modprobe wl
2.3 添加32位運行庫
聲明:如果您的系統是64位,請仔細閱讀,如果是32位,跳過此節,繼續閱讀2.4。
對於Ubuntu系的用戶(如Ubuntu、Linuxmint等),以及openSUSE等,系統已經默認安裝了32位運行庫。但是對於Debian,系統沒有默認安裝。不安裝32位運行庫的後果是,你安裝wps時,提示wps的架構不適用於64位系統。所以,下面我介紹一下安裝32位運行庫的方法:
# dpkg --add-architecture i386
# apt-get update
# apt-get install ia32-libs libncurses5:i386
2.4 flash
系統默認自帶了Iceweasel,這個瀏覽器實際上就是firefox。對於firefox的flash,官方不再升級版本,永久停留在11.2,但是,官方說明,他們會一直給11.2版本的flash提供更新!!系統剛安裝時,flash版本很低,所以需要手動升級。升級方法如下:
# apt-get install flashplugin-nonfree
# update-flashplugin-nonfree --install
如果您使用chromium瀏覽器,需要安裝pepperflashplugin。在debian 7.8中,pepperflashplugin是無法直接從新立得中安裝的,需要添加backports源。但是,backports源里的部分軟體可能會對系統主版本升級造成影響,所以謹慎使用。如果您使用了backports源,在發行版主版本升級時,請參照releases notes進行設置。安裝pepperflashplugin方法如下:
# aptitude -t wheezy-backports install pepperflashplugin-nonfree
# update-pepperflashplugin-nonfree --install
2.5 輸入法配置
這個是比較麻煩的。如果您在安裝過程中是聯網安裝,這個問題就不是問題。但是如果您是斷網安裝,那麼,系統剛裝好時,fcitx輸入法是不能打字的。或者能打字,但是沒有輸入界面。這個需要怎麼辦呢?
原因就是,fcitx一整套的軟體包系統沒有完整安裝,這個可能是開發者的疏忽。那麼,請你打開新立得軟體包管理器,輸入fcitx進行檢索,確認以下包都已經全部安裝:
fcitx
fcitx-bin
fcitx-config-common
fcitx-config-gtk
fcitx-config-gtk2
fcitx-data
fcitx-frontend-all
fcitx-frontend-gtk2:amd64
fcitx-frontend-gtk3:amd64
fcitx-frontend-qt4:amd64
fcitx-googlepinyin
fcitx-libs:amd64
fcitx-mole-dbus
fcitx-mole-kimpanel
fcitx-mole-x11
fcitx-moles
fcitx-pinyin
fcitx-sunpinyin
fcitx-table
fcitx-table-wubi
fcitx-tools
fcitx-ui-classic
全部安裝後,重啟系統之後就可以使用了。
㈦ 如何編譯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、每一次編譯會自動刪除掉前面已經生成的二進制文件,所以不用擔心二進制文件不是最新的問題。
㈧ 如何編譯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下面進行依賴包的下載。通過上面的方法把所有依賴包下載完以後就可以進行編譯了。
㈨ aria2 編譯docker
docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。
操作方法:
1.在dockerHub上注冊一個共有賬戶。
2.編譯系統下(假設ubuntu)安裝docker,並登錄hub賬戶。
3.編譯系統下創建一個docker鏡像,安裝並調試好aria2。
4.鏡像保存好後,就可以將本地docker鏡像推送到hub上了。
5.通過dockerhub,大家就可以直接pull你的aria2鏡像了。
㈩ wsl中安裝docker
最近又開始研究win10自帶的linux子系統(wsl), 在將自己公司用的編譯環境配置好之後, 相繼配置了tftp和ssh, 現在用xshell直接ssh登錄感覺不要太好, 已經滿足了自己平時的開發需求, 考慮到自己偶爾也會用到docker, 所以想在wsl中配置一下docker環境, 也算是自己開始學習了解docker這一進來比較火的東東.
網上找了很多教程, 最後發現還是官方的最靠譜, 先上網址 https://docs.docker.com/install/linux/docker-ce/ubuntu/
再附上純命令
如果運行顯示如下的話, 說明服務沒起, 需要先用命令 sudo service docker start 起一下:
hello-world運行結果如下說明成功:
剛開始按照上面的步驟安裝, hello-world是無法運行的, 我不確定是不是所以的wsl都這樣, 所以上面只是給了正常的流程, 如果很不幸你按照上面的步驟最後也失敗了, 那不妨繼續往下看, 說不定咱們的問題相同哦.
問題的現象是:
出現上面的現象, 應該是因為docker的版本太新導致的(起碼我的是), 這時需要我們安裝舊一點版本的docker, 方法如下:
安裝成功後驗證一下:
這里要特別感謝一下 這位仁兄 , 因為我的安裝歷程就是就此止步, 達到成功的.
自己安裝docker也是經歷了諸多絕望, 之前已經失敗過一次了, 好在這第二次挺住了, 最終安裝成功, 當然, 現在還沒有學習過要怎麼使用, 後面加油吧. 最後, 如果這篇文章對你有所幫助, 就請給個贊吧, 也希望您能瀏覽下本人的其他文章, 說不定還會有點收獲, 謝謝.
