docker 基礎鏡像

dokcer 基礎鏡像選擇

目前常用的Linux發行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列。前者以自帶軟件包版本較新而出名;后者則宣稱運行更穩定一些。選擇哪個操作系統取決于讀者的具體需求。同時,社區還推出了完全基于Docker的Linux發行版CoreOS。

使用Docker,只需要一個命令就能快速獲取一個Linux發行版鏡像,這是以往包括各種虛擬化技術都難以實現的。這些鏡像一般都很精簡,但是可以支持完整Linux系統的大部分功能。

常用的操作系統鏡像預覽

REPOSITORY TAG IMAGE ID SIZE
busybox latest 020584afccce 1.22MB
alpine 3.9.5 82f67be598eb 5.53MB
centos 7.2.1511 9aec5c5fe4ba 195MB
debian buster 1b686a95ddbf 114MB

docker 鏡像制作選擇最佳實踐

在制作docker鏡像時,使用 multi stage 構建各個不同階段的命令文件,最終copy到busybox或alpilne中執行。這樣做得好處有二:

  1. 保持鏡像最小,busybox,alpine 是最小的操作系統鏡像

  2. 有各種linux工具使用,busybox本身是一個linux工具集

  3. 構建stage建議使用alpine和其它的官方包, 主要理由是此鏡像比busybox稍大,但是比其他的系統鏡像都小,有人就問了,為撒不用busybox呢,因為busybox沒有包管理工具,這帶來很多不便;這點也是busybox和alpine的主要區別

下面是一個 go protoc的Dockerfile示例:


## stage 1 : install protoc
FROM alpine:3.9.5 as stage1

## install protobuf
RUN apk update && apk add --no-cache protobuf
RUN protoc --version
RUN type protoc

## stage 2 : install protoc-gen-go
FROM golang:1.14 as stage2
# Build Delve
RUN go get github.com/golang/protobuf/protoc-gen-go && go install $GOPATH/src/github.com/golang/protobuf/protoc-gen-go
RUN go get google.golang.org/grpc/cmd/protoc-gen-go-grpc && go install $GOPATH/src/google.golang.org/grpc/cmd/protoc-gen-go-grpc
RUN ls $GOPATH/bin && echo $GOPATH

#COPY --from=stage1 /usr/bin/protoc /go/bin/

## stage 3 : copy command file to buxybox
FROM  stage1
RUN mkdir -p /go/bin
#COPY --from=stage1 /usr/bin/protoc /go/bin/
COPY --from=stage2 /go/bin/protoc-gen-go /go/bin/
COPY --from=stage2 /go/bin/protoc-gen-go-grpc /go/bin/
#
ENV PATH=$PATH:/go/bin

RUN ls /go/bin

ENTRYPOINT ["protoc"]
CMD ["--version"]

  • build
docker build -t kekek/grpc:v1 .

  • run
docker run --rm -v $(pwd):$(pwd) -w $(pwd) kekek/grpc:v1 --go-grpc_out=. --go_out=.  --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative helloworld.proto

BusyBox

BusyBox是一個集成了一百多個最常用Linux命令和工具(如cat、echo、grep、mount、telnet等)的精簡工具箱,它只有幾MB的大小,很方便進行各種快速驗證,被譽為“Linux系統的瑞士軍刀”。BusyBox可運行于多款POSIX環境的操作系統中,如Linux(包括Android)、Hurd、FreeBSD等。

busybox鏡像雖然小巧,但包括了大量常見的Linux命令,可以用它快速熟悉Linux命令。

alpine

Alpine操作系統是一個面向安全的輕型Linux發行版。它不同于通常的Linux發行版,Alpine采用了musl libc和BusyBox以減小系統的體積和運行時資源消耗,但功能上比BusyBox又完善得多。在保持瘦身的同時,Alpine還提供了自己的包管理工具apk,可以通過https://pkgs.alpinelinux.org/packages查詢包信息,也可以通過apk命令直接查詢和安裝各種軟件。

Alpine Docker鏡像也繼承了Alpine Linux發行版的這些優勢。相比于其他Docker鏡像,它的容量非常小,僅僅只有5MB左右(Ubuntu系列鏡像接近200MB),且擁有非常友好的包管理機制。官方鏡像來自docker-alpine項目。

目前Docker官方已開始推薦使用Alpine替代之前的Ubuntu作為基礎鏡像環境。這樣會帶來多個好處,包括鏡像下載速度加快,鏡像安全性提高,主機之間的切換更方便,占用更少磁盤空間等。

目前,大部分Docker官方鏡像都已經支持Alpine作為基礎鏡像,因此可以很容易地進行遷移。

例如:

ubuntu/debian -> alpine

python:2.7 -> python:2.7-alpine

ruby:2.3 -> ruby:2.3-alpine

如果使用Alpine鏡像替換Ubuntu基礎鏡像,安裝軟件包時需要用apk包管理器替換apt工具,如 $ apk add --no-cache

Alpine中軟件安裝包的名字可能會與其他發行版有所不同,可以在https://pkgs.alpinelinux.org/packages網站搜索并確定安裝包的名稱。如果需要的安裝包不在主索引內,但是在測試或社區索引中,那么可以按照以下方法使用這些安裝包:

$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories

$ apk --update add --no-cache

Debian/Ubuntu

Debian和Ubuntu都是目前較為流行的Debian系的服務器操作系統,十分適合研發場景。

1.Debian系統簡介及使用

眾多的Linux發行版,例如Ubuntu、Knoppix和Linspire及Xandros等,都基于Debian GNU/Linux。

官方提供了大家熟知的debian鏡像以及面向科研領域的neurodebian鏡像。

$ docker images debian
REPOSITORY  TAG   IMAGE ID  CREATED      SIZE
debian  buster  1b686a95ddbf  5 weeks ago      114MB

debian鏡像很適合作為基礎鏡像,用于構建自定義鏡像。

2.Ubuntu系統簡介及使用

Ubuntu是一個以桌面應用為主的GNU/Linux操作系統,Ubuntu基于Debian發行版和GNOME/Unity桌面環境,與Debian的不同在于它每6個月會發布一個新版本,每2年會推出一個長期支持(Long Term Support,LTS)版本,一般支持3年。

當試圖直接使用apt-get安裝一個軟件的時候,會提示E:Unable to locate package:

root@7d93de07bf76:/# apt-get install curl

Reading package lists... Done

Building dependency tree

Reading state information... Done

E: Unable to locate package curl

這并非系統不支持apt-get命令。Docker鏡像在制作時為了精簡清除了apt倉庫信息,因此需要先執行apt-get update命令來更新倉庫信息。更新信息后即可成功通過apt-get命令來安裝軟件:

root@7d93de07bf76:/# apt-get update

安裝curl工具:

root@7d93de07bf76:/# apt-get install curl -y

Reading package lists... Done

Building dependency tree

Reading state information... Done

...

root@7d93de07bf76:/# curl

curl: try 'curl --help' or 'curl --manual' for more information

接下來,再安裝apache服務:

root@7d93de07bf76:/# apt-get install -y apache2

啟動這個apache服務,然后使用curl來測試本地訪問:

root@7d93de07bf76:/# service apache2 start

配合使用-p參數對外映射服務端口,可以允許外來容器訪問該服務。

CentOS/Fedora

1.CentOS系統簡介及使用

CentOS和Fedora都是基于Redhat的常見Linux分支。CentOS是目前企業級服務器的常用操作系統;Fedora則主要面向個人桌面用戶。

CentOS(Community Enterprise Operating System,社區企業操作系統)是基于Red Hat Enterprise Linux源代碼編譯而成的。由于CentOS與Redhat Linux源于相同的代碼基礎,所以很多成本敏感且需要高穩定性的公司就使用CentOS來替代商業版Red Hat Enterprise Linux。CentOS自身不包含閉源軟件。

2.Fedora系統簡介及使用

Fedora是由Fedora Project社區開發,紅帽公司贊助的Linux發行版。它的目標是創建一套新穎、多功能并且自由和開源的操作系統。對用戶而言,Fedora是一套功能完備的、可以更新的免費操作系統,而對贊助商Red Hat而言,它是許多新技術的測試平臺,被認為可用的技術最終會加入到Red Hat Enterprise Linux中。

使用docker run命令直接運行Fedora官方鏡像,并登錄bash:

常見資源參考

鏡像 鏡像官網 參考
busybox www.busybox.net 可以將busybox理解為一個超級簡化版嵌入式Linux系統 文檔地址 https://zh.wikipedia.org/wiki/BusyBox
Alpine www.alpinelinux.org Alpine是一個面向安全的、輕量級的Linux系統,基于musl libc和busybox, 包管理地址 https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。