欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從源碼構(gòu)建docker-ce的過程分析

 更新時間:2022年12月20日 08:30:22   作者:oscar.chen  
這篇文章主要介紹了從源碼構(gòu)建docker-ce的過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

準(zhǔn)備環(huán)境

準(zhǔn)備一臺Linux主機,并在上面安裝好docker-ce,安裝好make,git就可以開始編譯工作了。對,就是如此簡單,可能你會對此感到異或為啥要裝docker,我不是準(zhǔn)備編譯這個玩意么,為啥不裝go,docker不是用go開發(fā)的么? 這些疑問會在后面的步驟中解答。

# docker-ce 安裝參考
# FROM: https://developer.aliyun.com/article/110806
# Ubuntu 14.04 16.04 (使用apt-get進行安裝)
# step 1: 安裝必要的一些系統(tǒng)工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安裝 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

注意:其他注意事項在下面的注釋中
# 安裝指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安裝指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 通過經(jīng)典網(wǎng)絡(luò)、VPC網(wǎng)絡(luò)內(nèi)網(wǎng)安裝時,用以下命令替換Step 2、Step 3中的命令
# 經(jīng)典網(wǎng)絡(luò):
# curl -fsSL http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC網(wǎng)絡(luò):
# curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# CentOS 7 (使用yum進行安裝)
# step 1: 安裝必要的一些系統(tǒng)工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安裝 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 開啟Docker服務(wù)
sudo service docker start

注意:其他注意事項在下面的注釋中
# 官方軟件源默認啟用了最新的軟件,您可以通過編輯軟件源的方式獲取各個版本的軟件包。例如官方并沒有將測試版本的軟件源置為可用,你可以通過以下方式開啟。同理可以開啟各種測試版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   將 [docker-ce-test] 下方的 enabled=0 修改為 enabled=1
#
# 安裝指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安裝指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安裝出現(xiàn)了其他依賴包,如果安裝失敗的話請關(guān)注錯誤信息。例如 docker-ce 17.03 之后,需要先安裝 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通過經(jīng)典網(wǎng)絡(luò)、VPC網(wǎng)絡(luò)內(nèi)網(wǎng)安裝時,用以下命令替換Step 2中的命令
# 經(jīng)典網(wǎng)絡(luò):
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC網(wǎng)絡(luò):
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# 安裝其他工具, 以centos7為例子
yum install -y make git

獲取源碼

git clone https://github.com/moby/moby.git

其實如果你有對docker二次開發(fā)的需求了,我這邊也不用再多費口舌在moby這個奇怪的項目名稱上
其實就個人而言對docker改名這件事也是頗有微詞的,docker公司愿意開源docker-ce固然是好事,但是直接換個名稱明擺著是想把docker早期創(chuàng)造出來的名聲都讓公司的付費產(chǎn)品“docker”
上,而不是所謂的moby(docker-ce)。

編譯前的準(zhǔn)備工作

如果你工作網(wǎng)絡(luò)環(huán)境足夠優(yōu)秀(可以穩(wěn)定的訪問到dockerhub和各種操作系統(tǒng)的源)可以跳過這一小節(jié),肉身在國外的一般沒有這種煩惱。而對于大部分國內(nèi)的開發(fā)者則需要通過代理完成這個開發(fā)環(huán)境的構(gòu)建,一下的步驟僅供參考。

添加dockerd的代理

docker的鏡像拖取工作是由dockerd完成的(而不是你平常使用的docker命令行工具),而dockerd一般掛在systemd的進程下(如果有老哥頭鐵從命令行運行dockerd那么當(dāng)我沒說,這樣也能讀到代理的環(huán)境變量)。如果要為dockerd添加代理的話可以參考如下操作

# 修改為你自己的http代理地址
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://192.168.144.1:10811"
Environment="HTTPS_PROXY=http://192.168.144.1:10811"
EOF
systemctl daemon-realod
systemctl restart docker

到這一步只是為鏡像的拖取操作添加了代理,但是在開發(fā)環(huán)境中資源的拖取問題還是沒有辦法解決,這點我們稍微修改Makefile可以處理,參考如下操作

1. 在Makefile文件頭部增加"include .env"
2. Makefile同目錄創(chuàng)建.env文件并寫入你的環(huán)境變量,參考如下
BUILD_PROXY := --build-arg "http_proxy=http://192.168.144.1:10811" --build-arg "https_proxy=http://192.168.144.1:10811"
3. 追加參數(shù)到指定的構(gòu)建參數(shù)變量,修改Makefile, 在BUILD_OPTS := *后面的一行增加
BUILD_OPTS += $(BUILD_PROXY)

開始編譯

ntpdate ntp1.aliyun.com # 同步時間,如果時間誤差過大會導(dǎo)致部分源依賴獲取失效,非必須
make BIND_DIR=. shell

構(gòu)建過程由于或需要拖取鏡像和資源耗時一般比較長(即使在網(wǎng)絡(luò)條件較好的情況下),一般要10分鐘左右。
如果構(gòu)建成功你回進入如下的一個容器內(nèi)終端

root@3cede98051a6:/go/src/github.com/docker/docker# 

這個便是makefile通過dockerfile為你構(gòu)建的docker-ce的編譯環(huán)境,這個環(huán)境中你開發(fā)和調(diào)試的工具應(yīng)有盡有,如你還有特殊的需求可以通過修改dockerfile重新構(gòu)建(別擔(dān)心,由于之前構(gòu)建的緩存文件,你第二次構(gòu)建只會構(gòu)建新增部分,不會花太多的時間),項目的根目錄掛載到主機目錄,所以你在此路徑下構(gòu)建出的二進制文件也會寫入到宿主機。
接下來我們開始編譯

hack/make.sh binary

編譯完成

root@3cede98051a6:/go/src/github.com/docker/docker# hack/make.sh binary

Removing bundles/

---> Making bundle: binary (in bundles/binary)
Building: bundles/binary-daemon/dockerd
GOOS="" GOARCH="" GOARM=""
Created binary: bundles/binary-daemon/dockerd
Copying nested executables into bundles/binary-daemon
Building: bundles/binary-daemon/docker-proxy
GOOS="" GOARCH="" GOARM=""
Created binary: bundles/binary-daemon/docker-proxy

root@3cede98051a6:/go/src/github.com/docker/docker# 

安裝測試

# 還是在容器內(nèi)
make install

啟動測試

/usr/local/bin/dockerd -D

你也可以在容器內(nèi)下載鏡像,啟動容器

# 在宿主機另開一個終端,并進入容器
[root@localhost moby]# docker ps
CONTAINER ID   IMAGE                      COMMAND            CREATED         STATUS         PORTS                                                                                            NAMES
3cede98051a6   docker-dev                 "hack/dind bash"   8 minutes ago   Up 8 minutes                                                                                                    condescending_swanson
dae301c0f728   yandex/clickhouse-server   "/entrypoint.sh"   33 hours ago    Up 33 hours    0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 9009/tcp   ch-server
[root@localhost moby]# docker exec -it 3ced /bin/bash
root@3cede98051a6:/go/src/github.com/docker/docker#
# 下載鏡像,啟動容器
root@3cede98051a6:/go/src/github.com/docker/docker# docker pull centos:7
7: Pulling from library/centos
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Image is up to date for centos:7
root@3cede98051a6:/go/src/github.com/docker/docker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   eeb6ee3f44bd        15 months ago       204MB
root@3cede98051a6:/go/src/github.com/docker/docker# docker run --rm -it eeb /bin/bash
[root@26c12cba6431 /]# exit
exit

使用Delve調(diào)試

都從源碼構(gòu)建了,總不可能單純奔著純安裝去的吧,多少是想對docker做點簡單的定制化,這里就可以使用Delve來調(diào)試我們編譯出來的dockerd二進制程序了。

dlv /usr/local/bin/dockerd -- -D

哎,咋報錯了

2022-12-14T09:10:43Z error layer=debugger error loading binary "/usr/local/bin/dockerd": could not parse .eh_frame section: pointer encoding not supported 0x9b at 0x3150
could not launch process: could not parse .eh_frame section: pointer encoding not supported 0x9b at 0x3150

這個報錯是由于默認的hack/make.sh中的這一段(我所編譯的版本在105)

IAMSTATIC='true'
if [ -z "$DOCKER_DEBUG" ]; then
	LDFLAGS='-w'
fi

在編譯時加了-w參數(shù)刪除了調(diào)試信息,所以在編譯時添加參數(shù)或者寫到環(huán)境變量里就行啦

# 在容器創(chuàng)建時添加debug參數(shù)
DOCKER_DEBUG=1 make BIND_DIR=. shell
# 在編譯時添加參數(shù)
DOCKER_DEBUG=1 hack/make.sh binary

以上兩種方法都可以,之后就可以使用dlv來調(diào)試docekrd了

root@f42403397fa5:/go/src/github.com/docker/docker# dlv exec --check-go-version=false /usr/local/bin/dockerd -- -D
WARNING: undefined behavior - version of Delve is too old for Go version 1.19.4 (maximum supported version 1.18)
Type 'help' for list of commands.
(dlv) 

至于為什么加上 --check-go-version=false 這個參數(shù),如果你是使用開發(fā)中的分支,docker的開發(fā)者可能忽略了更新dlv的版本,導(dǎo)致dlv的版本有那么一絲落后于go的版本。如果你要解決這個問題可以通過修改Dockerfile中的 Delve鏡像拖取的版本,像是如下這樣,把AELVE_VERSION修改為1.9.1即可。

ARG DELVE_VERSION=v1.8.1
# Delve on Linux is currently only supported on amd64 and arm64;
# https://github.com/go-delve/delve/blob/v1.8.1/pkg/proc/native/support_sentinel.go#L1-L6
RUN --mount=type=cache,target=/root/.cache/go-build \
    --mount=type=cache,target=/go/pkg/mod \
        case $(dpkg --print-architecture) in \
            amd64|arm64) \
                GOBIN=/build/ GO111MODULE=on go install "github.com/go-delve/delve/cmd/dlv@${DELVE_VERSION}" \
                && /build/dlv --help \
                ;; \
            *) \
                mkdir -p /build/ \
                ;; \
        esac

至于delve調(diào)試工具如何使用就不在本文里細述,可通過help的方式知道如何使用,類似于gdb,上手十分的簡單。

參考

https://github.com/moby/moby/tree/master/docs/contributing
https://github.com/moby/moby/blob/master/docs/contributing/debug.md
https://github.com/moby/moby/blob/master/docs/contributing/set-up-dev-env.md

到此這篇關(guān)于從源碼構(gòu)建docker-ce的文章就介紹到這了,更多相關(guān)從源碼構(gòu)建docker-ce內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker鏡像分層的原理詳解

    Docker鏡像分層的原理詳解

    這篇文章主要介紹了Docker鏡像分層的原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 解決Docker必須使用sudo操作的問題

    解決Docker必須使用sudo操作的問題

    這篇文章主要介紹了解決Docker必須使用sudo操作的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Docker完整卸載的兩種方法詳細教程

    Docker完整卸載的兩種方法詳細教程

    在使用Docker的過程中,有時我們需要卸載Docker以清理系統(tǒng)環(huán)境或進行重新安裝,下面這篇文章主要給大家介紹了關(guān)于Docker完整卸載的兩種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Docker拉取ubuntu鏡像并建立環(huán)境的詳細過程

    Docker拉取ubuntu鏡像并建立環(huán)境的詳細過程

    在Docker實戰(zhàn)中Ubuntu是一個常見的基礎(chǔ)鏡像,用于構(gòu)建其他應(yīng)用服務(wù)的容器,這篇文章主要給大家介紹了關(guān)于Docker拉取ubuntu鏡像并建立環(huán)境的詳細過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • docker搭建nginx實現(xiàn)負載均衡的示例代碼

    docker搭建nginx實現(xiàn)負載均衡的示例代碼

    本隨著互聯(lián)網(wǎng)應(yīng)用規(guī)模不斷擴大,原有的單一服務(wù)器已經(jīng)無法滿足高并發(fā)和高可用性的要求,本文就來介紹docker搭建nginx實現(xiàn)負載均衡的示例代碼,感興趣的可以了解一下
    2023-12-12
  • Docker制作鏡像的兩種實現(xiàn)方式

    Docker制作鏡像的兩種實現(xiàn)方式

    本文主要介紹了Docker制作鏡像的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤

    Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤

    這篇文章主要介紹了Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Docker v1.13 新功能介紹

    Docker v1.13 新功能介紹

    本篇文章主要介紹了Docker v1.13 新功能介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 在docker容器中安裝vi命令的簡單操作

    在docker容器中安裝vi命令的簡單操作

    這篇文章主要介紹了在docker容器中安裝vi命令的簡單操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Docker中安裝寶塔的詳細教程

    Docker中安裝寶塔的詳細教程

    這篇文章主要介紹了Docker中安裝寶塔的詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論