dokcer 基礎(chǔ)鏡像選擇
目前常用的Linux發(fā)行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列宋距。前者以自帶軟件包版本較新而出名炫欺;后者則宣稱運(yùn)行更穩(wěn)定一些。選擇哪個操作系統(tǒng)取決于讀者的具體需求鸣峭。同時渴肉,社區(qū)還推出了完全基于Docker的Linux發(fā)行版CoreOS幽七。
使用Docker竟闪,只需要一個命令就能快速獲取一個Linux發(fā)行版鏡像离福,這是以往包括各種虛擬化技術(shù)都難以實(shí)現(xiàn)的。這些鏡像一般都很精簡炼蛤,但是可以支持完整Linux系統(tǒng)的大部分功能妖爷。
常用的操作系統(tǒng)鏡像預(yù)覽
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 鏡像制作選擇最佳實(shí)踐
在制作docker鏡像時,使用 multi stage 構(gòu)建各個不同階段的命令文件理朋,最終copy到busybox或alpilne中執(zhí)行絮识。這樣做得好處有二:
保持鏡像最小,busybox嗽上,alpine 是最小的操作系統(tǒng)鏡像
有各種linux工具使用次舌,busybox本身是一個linux工具集
構(gòu)建stage建議使用alpine和其它的官方包, 主要理由是此鏡像比busybox稍大炸裆,但是比其他的系統(tǒng)鏡像都小垃它,有人就問了,為撒不用busybox呢烹看,因?yàn)閎usybox沒有包管理工具国拇,這帶來很多不便;這點(diǎn)也是busybox和alpine的主要區(qū)別
下面是一個 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的大小,很方便進(jìn)行各種快速驗(yàn)證己儒,被譽(yù)為“Linux系統(tǒng)的瑞士軍刀”杖小。BusyBox可運(yùn)行于多款POSIX環(huán)境的操作系統(tǒng)中,如Linux(包括Android)棚点、Hurd尊搬、FreeBSD等。
busybox鏡像雖然小巧途样,但包括了大量常見的Linux命令江醇,可以用它快速熟悉Linux命令。
alpine
Alpine操作系統(tǒng)是一個面向安全的輕型Linux發(fā)行版何暇。它不同于通常的Linux發(fā)行版陶夜,Alpine采用了musl libc和BusyBox以減小系統(tǒng)的體積和運(yùn)行時資源消耗,但功能上比BusyBox又完善得多裆站。在保持瘦身的同時条辟,Alpine還提供了自己的包管理工具apk黔夭,可以通過https://pkgs.alpinelinux.org/packages查詢包信息,也可以通過apk命令直接查詢和安裝各種軟件捂贿。
Alpine Docker鏡像也繼承了Alpine Linux發(fā)行版的這些優(yōu)勢纠修。相比于其他Docker鏡像,它的容量非常小厂僧,僅僅只有5MB左右(Ubuntu系列鏡像接近200MB)扣草,且擁有非常友好的包管理機(jī)制。官方鏡像來自docker-alpine項(xiàng)目颜屠。
目前Docker官方已開始推薦使用Alpine替代之前的Ubuntu作為基礎(chǔ)鏡像環(huán)境辰妙。這樣會帶來多個好處,包括鏡像下載速度加快甫窟,鏡像安全性提高密浑,主機(jī)之間的切換更方便,占用更少磁盤空間等粗井。
目前尔破,大部分Docker官方鏡像都已經(jīng)支持Alpine作為基礎(chǔ)鏡像,因此可以很容易地進(jìn)行遷移浇衬。
例如:
ubuntu/debian -> alpine
python:2.7 -> python:2.7-alpine
ruby:2.3 -> ruby:2.3-alpine
如果使用Alpine鏡像替換Ubuntu基礎(chǔ)鏡像懒构,安裝軟件包時需要用apk包管理器替換apt工具,如 $ apk add --no-cache
Alpine中軟件安裝包的名字可能會與其他發(fā)行版有所不同耘擂,可以在https://pkgs.alpinelinux.org/packages網(wǎng)站搜索并確定安裝包的名稱胆剧。如果需要的安裝包不在主索引內(nèi),但是在測試或社區(qū)索引中醉冤,那么可以按照以下方法使用這些安裝包:
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
$ apk --update add --no-cache
Debian/Ubuntu
Debian和Ubuntu都是目前較為流行的Debian系的服務(wù)器操作系統(tǒng)秩霍,十分適合研發(fā)場景。
1.Debian系統(tǒng)簡介及使用
眾多的Linux發(fā)行版蚁阳,例如Ubuntu铃绒、Knoppix和Linspire及Xandros等,都基于Debian GNU/Linux螺捐。
官方提供了大家熟知的debian鏡像以及面向科研領(lǐng)域的neurodebian鏡像颠悬。
$ docker images debian
REPOSITORY TAG IMAGE ID CREATED SIZE
debian buster 1b686a95ddbf 5 weeks ago 114MB
debian鏡像很適合作為基礎(chǔ)鏡像,用于構(gòu)建自定義鏡像归粉。
2.Ubuntu系統(tǒng)簡介及使用
Ubuntu是一個以桌面應(yīng)用為主的GNU/Linux操作系統(tǒng)椿疗,Ubuntu基于Debian發(fā)行版和GNOME/Unity桌面環(huán)境漏峰,與Debian的不同在于它每6個月會發(fā)布一個新版本糠悼,每2年會推出一個長期支持(Long Term Support,LTS)版本浅乔,一般支持3年倔喂。
當(dāng)試圖直接使用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
這并非系統(tǒng)不支持apt-get命令。Docker鏡像在制作時為了精簡清除了apt倉庫信息席噩,因此需要先執(zhí)行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服務(wù):
root@7d93de07bf76:/# apt-get install -y apache2
啟動這個apache服務(wù)悼枢,然后使用curl來測試本地訪問:
root@7d93de07bf76:/# service apache2 start
配合使用-p參數(shù)對外映射服務(wù)端口埠忘,可以允許外來容器訪問該服務(wù)。
CentOS/Fedora
1.CentOS系統(tǒng)簡介及使用
CentOS和Fedora都是基于Redhat的常見Linux分支馒索。CentOS是目前企業(yè)級服務(wù)器的常用操作系統(tǒng)莹妒;Fedora則主要面向個人桌面用戶。
CentOS(Community Enterprise Operating System绰上,社區(qū)企業(yè)操作系統(tǒng))是基于Red Hat Enterprise Linux源代碼編譯而成的旨怠。由于CentOS與Redhat Linux源于相同的代碼基礎(chǔ),所以很多成本敏感且需要高穩(wěn)定性的公司就使用CentOS來替代商業(yè)版Red Hat Enterprise Linux蜈块。CentOS自身不包含閉源軟件鉴腻。
2.Fedora系統(tǒng)簡介及使用
Fedora是由Fedora Project社區(qū)開發(fā),紅帽公司贊助的Linux發(fā)行版百揭。它的目標(biāo)是創(chuàng)建一套新穎爽哎、多功能并且自由和開源的操作系統(tǒng)。對用戶而言信峻,F(xiàn)edora是一套功能完備的倦青、可以更新的免費(fèi)操作系統(tǒng),而對贊助商Red Hat而言盹舞,它是許多新技術(shù)的測試平臺产镐,被認(rèn)為可用的技術(shù)最終會加入到Red Hat Enterprise Linux中。
使用docker run命令直接運(yùn)行Fedora官方鏡像踢步,并登錄bash:
常見資源參考
鏡像 | 鏡像官網(wǎng) | 參考 |
---|---|---|
busybox | www.busybox.net | 可以將busybox理解為一個超級簡化版嵌入式Linux系統(tǒng) 文檔地址 https://zh.wikipedia.org/wiki/BusyBox |
Alpine | www.alpinelinux.org | Alpine是一個面向安全的癣亚、輕量級的Linux系統(tǒng),基于musl libc和busybox获印, 包管理地址 https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management |