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

你可能感兴趣的:(docker 基础镜像)