當前位置:首頁 » 編程軟體 » docker自製鏡像靜態編譯

docker自製鏡像靜態編譯

發布時間: 2022-11-27 23:59:34

① 如何在"特殊"的網路環境下編譯 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 。

② 構建Docker鏡像應該遵循哪些原則

整體遠側上,盡量保持鏡像功能的明確和內容的精簡,要點包括:
(1)盡量選取滿足需求但較小的基礎系統鏡像,建議選擇debian:wheezy鏡像,僅有86MB大小
(2)清理編譯生成文件、安裝包的緩存等臨時文件
(3)安裝各個軟體時候要指定準確的版本號,並避免引入不需要的依賴
(4)從安全的角度考慮,應用盡量使用系統的庫和依賴
(5)使用Dockerfile創建鏡像時候要添加.dockerignore文件或使用干凈的工作目錄
我推薦你去看看時速雲,他們是一家全棧雲原生技術服務提供商,提供雲原生應用及數據平台產品,其中涵蓋容器雲PaaS、DevOps、微服務治理、服務網格、API網關等。大家可以去體驗一下。 如果我的回答能夠對您有幫助的話,求給大大的贊。

③ aria2 編譯docker

docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。
操作方法:
1.在dockerHub上注冊一個共有賬戶。
2.編譯系統下(假設ubuntu)安裝docker,並登錄hub賬戶。
3.編譯系統下創建一個docker鏡像,安裝並調試好aria2。
4.鏡像保存好後,就可以將本地docker鏡像推送到hub上了。
5.通過dockerhub,大家就可以直接pull你的aria2鏡像了。

④ docker鏡像構建

基本的構建命令為: docker build -t name:tag -f Dockerfile .
-t : 表示構建出來的鏡像名稱
-f : 表示構建使用的dockerfile文件名稱
. : 表示構建使用當前路徑作為上下文(contex),如果你是在根目錄 / 下面構建,不建議使用 . (不建議使用根路徑作為上下文),因為根路徑下面有虛擬文件系統,如 /proc 之類的,構建的時候會報找不到文件的錯誤。

鏡像構建流程為首先將指定的上下文(contextpath)路徑下的文件打包,發送到服務端。服務端再將收到的文件解壓,然後以解壓後的路徑作為上下文,進行鏡像構建。

docker構建命令中如果沒有以 -f 指定Dockerfile,則以上下文中的Dockerfile文件作為構建文件;如果通過 -f 指定了Dockerfile文件路徑及名稱,則在構建上下文中尋找指定的文件。

docker build的時候,如果某一層無法使用上一次的構建緩存,則後續層均無法使用,故若大多數層均未改變,建議將未改動的層放在前面。如 RUN apt get install -y tmux 命令,如果tmux版本有變化,則無法繼續使用構建緩存,建議將該語句放到後面。
參考: https://blog.orenoid.com/2019/12/17/docker-build-optimize/ 。
--no-cache=true 可以不使用緩存,不知道能否解決構建時提示緩存不足的問題。

可以直接編譯得到最終鏡像: docker build -t go/helloworld:3 .

也可以只構建 builder 階段的鏡像: docker build --target builder -t username/imagename:tag .

構建時,可以復制上一階段的鏡像中的文件,也可以復制任意鏡像中的文件。

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

as 後面的名字可以任意填寫,主要作用是作為一個標識,方便單獨構建其中一個鏡像,或者是其他鏡像從中獲取部分文件。

參考: https://yeasy.gitbook.io/docker_practice/image/multistage-builds/laravel

沒有守護進程,不需要 root 特權,而且生成的是符合 OCI 的鏡像,因此你的鏡像的運行方式與使用 Docker 構建的鏡像完全相同。它還能使用 Dockerfile 或 Containerfile 構建鏡像, Dockerfile 與 Containerfile 實際上是同一個東西,只是叫法不同罷了。除此之外,Buildah 還提供了對鏡像層更精細的控制,支持提交大量的變更到單個層。我認為,它與 Docker 之間有一個出乎意料的區別(但這個區別是好事),那就是使用 Buildah 構建的鏡像特定於用戶,因此你可以只列出自己構建的鏡像。

Google 發布了「 Kaniko 」,一種用於在未授權容器或 Kubernetes 集群中構建容器鏡像的開源工具。雖然 Kaniko 也是根據用戶給定的 Dockerfile 構建鏡像,但是並不依賴於 Docker 守護進程,而是在用戶空間中完全執行每個命令,並對所導致的文件系統更改做快照。一般多用於在流水線中執行的編譯構建。它與 Buildah 的主要區別在於,Kaniko 更加側重於 Kubernetes 中的鏡像構建。

另外需要制定鏡像倉庫名字,從而自動推送到目標倉庫。

--context :指定構建上下文(可以掛載本地目錄,也可以指定git地址,如 git://github.com/mycorp/my-app.git ),

--destination :指定要推送的倉庫地址,

--dockerfile :指定dockerfile文件。存在一個問題是,tag是寫死的,每次得到的鏡像會覆蓋。

k8s中使用: https://segmentfault.com/a/1190000039713484

並行構建、跳過未使用的階段、更好的增量構建以及不需要 root 許可權等構建。但是,它仍然需要運行守護進程 (buildkitd)。因此,如果你不想擺脫 Docker,同時又想要一些新的功能和改進,那麼可以考慮一下 buildkit。

⑤ 如何用Dockerfile創建鏡像

創建鏡像:

1、准備jdk、需要運行的spring boot小項目

將jdk壓縮包解壓到Dockerfile所在的目錄中,將spring boot小項目websocket.jar復制到Dockerfile所在的目錄下:

⑥ docker如何製作自己的鏡像

准備一個用來製作鏡像的容器。這里我們使用 centos 安裝 apache 的容器。容器的製作方法如下

操作步驟如下:

語法如下:

示例如下:

使用 docker build 創建鏡像時,需要使用 Dockerfile 文件自動化製作鏡像。 Dockerfile 的執行過程,很像源碼編譯時 ./configure 後產生的 Makefile 。

這里將鏡像發布到 hub.docker.com ,docker的官方倉庫。

⑦ docker能否基於已有的rabbitmq鏡像製作自已的鏡像

完全可以的。
Docker提供了自行開發鏡像的功能,可能你需要使用Dockerfile
你可以通過Dockerfile,以rabbitmq:management為基礎Image,然後通過修改entrypoint文件,添加運行你的程序的命令即可。
然後通過Docker build 命令來生成自己的Image
最後調用docker run命令來啟動容器,查看結果。

⑧ 如何用Dockerfile創建鏡像

製作鏡像的方式主要有兩種:

通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。

docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。

⑨ 如何使用docker來製作我現在正在使用的系統的鏡像

在使用Docker的過程中,我們除了從Docker Hub上下載已經做好的鏡像,很多時候需要我們自己製作鏡像。下面想在這個文章中說明一下鏡像的製作方法。

製作鏡像的方式主要有兩種:

通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。

docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。

選擇基礎鏡像
基礎鏡像的選擇要結合自己的需求。可以選擇已有的應用鏡像來改造,也可以選擇Ubuntu,Debian,OpenSuse這類基礎系統鏡像
我們以ubuntu為例子來說明
步驟1:運行ubuntu 鏡像
docker run -i -t ubuntu /bin/bash
步驟2:安裝軟體並修改軟體配置, 比如:安裝apache2
apt-get -yqq update
apt-get -y install apache2
安裝完成後,對apache2進行配置和修改
步驟3:退出docker並保存鏡像
使用「exit」命令退出容器
運行docker comit 命令, 進行保存
docker commit 61412230ae46 own-apache2

docker commit 命令參數說明

命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

-a, --author= 提交的鏡像作者
-c, --change=[] Apply Dockerfile instruction to the created image, 沒用過
-m, --message= 提交時的說明文字
-p, --pause=true 在commit時,將container 暫停

CONTAINER:

可以使用container 的名字或者ID

REPOSITORY

指定鏡像倉庫,上述例子中,指定的是本地存儲
可以指定遠程鏡像倉庫,如docker hub。也可自建倉庫來存放image

TAG:

鏡像TAG

docker build
使用docker build創建鏡像需要編寫Dockerfile.

步驟:

編寫自己的Dcokerfile
運行docker build 命令打包鏡像

仍然以apache打包為例子。以下是Dockerfile的例子

FROM ubuntu:latest
MAINTAINER sky

#Add 163 mirror for apt
ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]

編輯完成後,在與Dockerfile同一目錄下運行docker build 命令

docker build -t apache-img .

如果沒有命令出錯,docker build會持續運行直到鏡像創建完成
而創建的過程本質上是運行一個鏡像,然後在鏡像中按序執行在Dockerfile中的命令,直到執行結束。
如果中間有命令執行失敗,鏡像創建會停止。這時就需要看log,並修改Dockerfile,然後再次執行docker build

註:兩種鏡像創建方式的對比:

docker commit
docker build

難度相對容易,適合新手和對Linux不熟悉的用戶相對難,要求有一定的linux和腳本基礎知識

文檔化
文檔化在通過其他文件來實現
Dockerfile本身就是比較好的文檔,可讀和可理解性比較強。也可配合其他文檔帶來詳細說明

升級,維護
後續升級和維護麻煩,需要再次運行鏡像並對內部軟體進行升級或者安裝新軟體增加特性
後續升級和維護會相對簡單,可以直接在dockerfile中更改並增加新特性

具體選擇哪種方式來製作鏡像需要結合實際情況來選擇

Dockerfile 關鍵字詳解

FROM

FROM用來指定基礎包。在上面的例子中,基礎包用的是ubuntu。

MAINTAINER

鏡像作者信息,或者維護人員信息

ADD

將文件拷貝到Container內文件系統對應的路徑
格式 ADD <src file> <dst file>
所有拷貝到Container中的文件和文件夾許可權為0755,uid和gid為0
如果需要修改owner用戶或者許可權,需要使用RUN進行修改
ADD文件,文件路徑要在docker build<PATH>中指定的<PATH>下

RUN

創建鏡像時執行

ENV

用來設置環境變數

EXPOSE

Container內部服務開啟的埠
主機上如果要使用,還需要在啟動Container時,做host-container的商品映射
使用EXPOSE後,一些自動化布署工具可以直接讀取這個信息,自動進行埠映射
EXPOSE可以有多條,指定多個埠

WORKDIR

切換工作目錄,可進行多次切換(相當於cd命令)
切換目錄對RUN,CMD,ENTRYPOINT有效

USER

執行container的用戶,如未指定,則默認使用root用戶

ENTRYPOINT

Container啟動時執行的命令,一個Dockerfile中只能有一條ENTRYPOINT
ENTRYPOINT沒有CMD的可替換特性

CMD

Container 啟動時執行的命令,一個Dockerfile 中只能有一條CMD命令,如果有多條則只執行最後一條CMD
如果有多條命令希望在啟動後執行,可以考慮使用shell 腳本
與ENTRYPOINT的區別
CMD的主要用途是為可執行的container提供默認命令
CMD在運行時是可替換的,比如
在ubuntu中,CMD指定的是/bin/bash。默認情況下運行ubuntu,container中的/bin/bash會被執行
如果使用docker run指定運行命令,那CMD會被替換掉
如:docker run ubuntu /bin/echo "this is a echo". 這時,container 啟動後會執行echo 而不是/bin/bash了
ENTRYPOINT是不會替換的,如果在ubuntu鏡像中加入ENTRYPOINT,那ENTRYPOINT在啟動後會先被執行
CMD可以為ENTRYPOINT來提供參數
例子:

FROM ubuntu:14.10

ENTRYPOINT ["top", "-b"]
CMD ["-c"]

VOLUME

語法:VOLUME [PATH]
VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移
可以將本地文件夾或者其他Container的文件夾掛載到Container中

⑩ Docker鏡像

1.像一個文件聯合系統UnionFS,是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下,Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和內核。當boot載入完成之後整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標准目錄和文件
對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。
3.鏡像分層的好處就是資源共享
列如:有多個鏡像都從相同的 base 鏡像構建而來,那麼宿主機只需在磁碟上保存一份base鏡像,

同時內存中也只需載入一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。
4.docker 鏡像都是只讀的,當容器啟動時,一個新的可寫層會載入到鏡像的頂部,這一層被稱為容器層,容器層之下都稱為鏡像層。

5.鏡像的構建可以通過 Dockfile 和docker commit 這兩種方式
docker commit 方式是在一個鏡像的基礎上,重新對該鏡像操作後重新生成的一個專屬的鏡像。
命令格式 docker commit -m "提交的描述信息" -a "作者信息" 容器ID 要創建的目標的鏡像名:[標簽名]
示例

熱點內容
手機優酷緩存視頻格式 發布:2025-05-15 04:13:45 瀏覽:209
公益電影分鏡頭腳本插畫 發布:2025-05-15 04:08:37 瀏覽:960
數據壓縮編碼 發布:2025-05-15 03:58:44 瀏覽:725
java字元為空 發布:2025-05-15 03:57:11 瀏覽:546
速訊安卓哪裡下載 發布:2025-05-15 03:55:02 瀏覽:48
緩存區數據讀寫原理 發布:2025-05-15 03:39:57 瀏覽:585
編譯器生成的是二進制文件嗎 發布:2025-05-15 03:38:42 瀏覽:955
運營為什麼區分ios和安卓 發布:2025-05-15 03:30:02 瀏覽:630
主播網站源碼 發布:2025-05-15 02:50:56 瀏覽:168
中文編程語言有哪些 發布:2025-05-15 02:48:59 瀏覽:536