帮酷LOGO
0 0 评论
文章标签:Docker  DOCK  图像  DOC  images  optimize  

介绍

在本教程中,你将在几个简单步骤中优化Docker镜像,使它更小,更快,更适合生产,你将在几个不同的Docker容器中为示例Go API构建映像,首先从Ubuntu和特定于语言的映像开始,然后继续进行Alpine发行。阅读完本教程后,你将能够将这些技术应用于自己的项目。

注意:本教程以Go语言编写的API为例。

前提条件

在你开始之前,你需要:

具有具有sudo特权的非root用户帐户的Ubuntu 18.04服务器。按照ubuntu 18 04的初始服务器设置教程进行配置。

Docker安装在你的服务器上。

步骤1-下载go API 例子

在服务器上,从克隆例子go API开始:


git clone https://github.com/do-community/mux-go-api.git

克隆项目后,你的服务器上将有一个叫mux-go-api的目录,使用cd移动到此目录:


cd mux-go-api

这将是你的项目的主目录,你将从这个目录构建你的Docker镜像。

步骤2-构建基本的Ubuntu镜像

首先编写一个指示Docker创建Ubuntu镜像,安装Go并运行例子API的Dockerfile ,确保在克隆的repo目录中创建Dockerfile ,如果你克隆到主目录,它应该是$HOME/mux-go-api

创建一个名为Dockerfile.ubuntu的新文件,在nano或你喜爱的文本编辑器中打开它:


nano ~/mux-go-api/Dockerfile.ubuntu

在此Dockerfile中,你将定义一个Ubuntu镜像并安装Golang ,然后,你将继续安装所需的依赖项并构建,将以下内容添加到Dockerfile.ubuntu

~/mux-go-api/Dockerfile.ubuntu

FROM ubuntu:18.04

RUN apt-get update -y 
 && apt-get install -y git gcc make golang-1.10

ENV GOROOT /usr/lib/go-1.10
ENV PATH $GOROOT/bin:$PATH
ENV GOPATH /root/go
ENV APIPATH /root/go/src/api

WORKDIR $APIPATH
COPY . .

RUN 
 go get -d -v 
 && go install -v 
 && go build

EXPOSE 3000
CMD ["./api"]

WORKDIR指定我们要复制代码的目录,COPY命令从目录中的目录中获取代码并将它复制到镜像中,最终RUN命令安装需要编译的源代码,以便编译和运行API 。

注意:使用

保存并退出文件,现在可以运行build命令从刚才创建的Dockerfile创建一个Docker镜像:


docker build -f Dockerfile.ubuntu -t ubuntu .

build命令从Dockerfile生成镜像,-f标志指定要从Dockerfile.ubuntu文件构建,而-t代表标记,这意味着你用名称ubuntu标记它,最后一个点代表Dockerfile.ubuntu所在的当前上下文。

这需要一段时间,所以你可以休息一下,完成构建后,你将有一个准备运行你的API的Ubuntu镜像,但是,镜像的最终大小可能并不理想;

运行以下命令列出所有Docker镜像,并查找你的Ubuntu镜像的大小:


docker images


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 61b2096f6871 33 seconds ago 636MB
. . .

步骤3-建立特定于语言的基础镜像

预先构建基础镜像已经包含了需要构建和运行应用程序的工具,你可以显著减少构建时间,

继续,创建另一个Dockerfile并将它命名为Dockerfile.golang,在文本编辑器中打开它:


nano ~/mux-go-api/Dockerfile.golang

现在,添加以下行:

~/mux-go-api/Dockerfile.golang

FROM golang:1.10

WORKDIR /go/src/api
COPY . .

RUN 
 go get -d -v 
 && go install -v 
 && go build

EXPOSE 3000
CMD ["./api"]

从顶部开始,你会发现FROM语句现在是,golang:1.10 ,这意味着Docker将从Docker Hub获取预安装的go镜像,该镜像已经安装了所有必需的go工具。

现在,再次构建Docker镜像,使用:


docker build -f Dockerfile.golang -t golang .

使用以下命令检查镜像的最终大小:


docker images

这将产生类似以下内容的输出:


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
golang latest eaee5f524da2 40 seconds ago 744MB
. . .

预构建Golang镜像大约为744MB,大小相当可观。

这是构建Docker镜像的首选方法,

但是如果你想优化部署,那么你需要尽量尽量让你的镜像尽可能小。

现在你已经测试了一个语言特定的镜像,你可以继续使用轻量级高级Linux分发作为Docker镜像。

步骤4-建立基础Alpine镜像

优化Docke镜像最简单的步骤之一是使用较小的基础镜像,Alpine是一个轻量级Linux分发,旨在安全和资源效率,小尺寸是由于二进制软件包被缩小和拆分,给你更多的控制你安装的环境。

创建Alpine镜像的过程与第2.步中创建Ubuntu镜像类似,创建一个名为Dockerfile.alpine的新文件:


nano ~/mux-go-api/Dockerfile.alpine

~/mux-go-api/Dockerfile.alpine

FROM alpine:3.8

RUN apk add --no-cache 
 ca-certificates 
 git 
 gcc 
 musl-dev 
 openssl 
 go

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
ENV APIPATH $GOPATH/src/api
RUN mkdir -p"$GOPATH/src""$GOPATH/bin""$APIPATH" && chmod -R 777"$GOPATH"

WORKDIR $APIPATH
COPY . .

RUN 
 go get -d -v 
 && go install -v 
 && go build

EXPOSE 3000
CMD ["./api"]

在这里添加apk add命令来使用Alpine manager的软件包安装go及它所需的所有库,

继续构建镜像:


docker build -f Dockerfile.alpine -t alpine .

再次检查镜像大小:


docker images

你将收到类似以下内容的输出:


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest ee35a601158d 30 seconds ago 426MB
. . .

大小已经降到了426MB左右。

接下来,尝试使用预先构建的Alpine镜像,

首先创建一个叫 Dockerfile.golang-alpine


nano ~/mux-go-api/Dockerfile.golang-alpine

将以下内容添加到该文件中:

~/mux-go-api/Dockerfile.golang-alpine

FROM golang:1.10-alpine3.8

RUN apk add --no-cache --update git

WORKDIR /go/src/api
COPY . .

RUN go get -d -v 
 && go install -v 
 && go build

EXPOSE 3000
CMD ["./api"]

只有Dockerfile.golang-alpineDockerfile.alpine之间的区别是FROM命令和第一个RUN命令,现在,FROM命令指定一个带有,1.10-alpine3.8 标签,并且RUN只有一个用于安装的命令Git,要使go get命令在Dockerfile.golang-alpine底部的第二个RUN命令中工作,需要使用Git 。

使用以下命令生成镜像:


docker build -f Dockerfile.golang-alpine -t golang-alpine .


docker images

你将收到以下输出:


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
golang-alpine latest 97103a8b912b 49 seconds ago 288MB

现在图像的大小为288MB左右。

即使你已经成功地缩小了尺寸,但是,你要做的最后一件事就是使镜像准备好投入生产。

步骤5-多阶段构建的排除构建工具

对于理想情况,在生产中运行的镜像不应该安装构建工具,也不应该安装依赖于生产应用程序运行的依赖,你可以使用多阶段构建从最终的Docker镜像中删除这些,

首先创建另一个名为 Dockerfile.multistage


nano ~/mux-go-api/Dockerfile.multistage

通过添加与Dockerfile.golang-alpine完全相同的代码开始,

~/mux-go-api/Dockerfile.multistage

FROM golang:1.10-alpine3.8 AS multistage

RUN apk add --no-cache --update git

WORKDIR /go/src/api
COPY . .

RUN go get -d -v 
 && go install -v 
 && go build

##

FROM alpine:3.8
COPY --from=multistage /go/bin/api /go/bin/
EXPOSE 3000
CMD ["/go/bin/api"]

保存并关闭文件,这里有两个FROM命令,第一个与Dockerfile.golang-alpine相同,只是在FROM命令中有一个附加的AS multistage,这将给它一个名称multistage,然后在Dockerfile.multistage文件的底部引用它,在第二个FROM命令中,将基于multistage映像的基本alpine映像和COPY从映像中获取到它,此过程将进一步减少最终镜像的大小,使它可以进行生产。

使用以下命令运行生成:


docker build -f Dockerfile.multistage -t prod .

使用多阶段构建后,检查镜像大小。


docker images

你将发现两个新镜像,而不仅仅是一个镜像:


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
prod latest 82fc005abc40 38 seconds ago 11.3MB
<none> <none> d7855c8f8280 38 seconds ago 294MB
. . .

FROM golang:1.10-alpine3.8 AS multistage

从初始744MB开始,你已经将镜像大小缩减为11.3 MB。

结束语

在本教程中,你使用不同的基本Docker镜像和中间镜像来编译和构建代码,从而优化了Docker镜像的生产环境。可以使用这些技术改进Docker应用程序和ci/cd管道的构建和部署速度。



文章标签:图像  DOC  images  Docker  DOCK  optimize  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语