多阶段构建Golang程序Docker镜像

内容导读

互联网集市收集整理的这篇技术教程文章主要介绍了多阶段构建Golang程序Docker镜像,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6758字,纯文字阅读大概需要10分钟

内容图文

Docker简介

Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议。Docker自开源后,受到广泛的关注和讨论。

Docker在开发和运维中的优势
  • 更快的交付和部署

使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境,开发完后,测试和运维人员可以直接使用完全相同的环境来部署代码,实现了生产环境的无缝运行。

  • 更高效的资源利用

Docker容器的运行不需要额外的虚拟化管理程序支持,它是内核级的虚拟化 ,可以实现更高的性能,同时对资源的额外需求很低。

  • 更轻松的迁移和扩展

Docker容器几乎可以在任意的平台上运行,支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。

  • 更简单的更新管理

使用Dockerfile,只需要修改一点点配置,就可以替代以往大量的更新工作。并且所有的修改都以增量的方式被分布和更新,从而实现自动化且高效的容器管理。

首先需要知道以下几个概念
Docker镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制和创建和更新现有的镜像,用户可以直接从网上下载一个已经做好的应用镜像,并直接使用。

Docker容器

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的,互不可见的。

可以把容器看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间)以及运行在其中的应用程序打包而成的盒子。

Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。它的设计理念与Git类似。Docker镜像库分公开仓库和私有仓库。最大的公开仓库是官方提供的Docker Hub。当然,如果不想公开镜像,可以搭建自己的私有仓库。

Dockerfile

一般介绍完以上三个概念就结束了,但我在这里要介绍下Dockerfile,因为镜像的好坏很大程度取决于Dockerfile。Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。

多阶段构建Golang应用Docker镜像

一般Golang的Dockerfile文件会像这样:

# Go语言环境基础镜像
FROM golang:latest

# 将源码拷贝到镜像中
COPY server.go /go/release/

# 指定工作目录
WORKDIR /go/release

# 编译镜像时,运行 go build 编译生成 app 可执行的二进制文件
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o app server.go

# 指定容器运行时入口程序 app
ENTRYPOINT ["/go/release/app"]

这种方式构建的Docker镜像体积非常大,构建时间长,占用磁盘空间,部署速度慢。

多阶段构建(multi-stage builds)
多阶段构建FROMFROM
多阶段构建

项目结构图

Dockerfile
# 构建:使用golang:1.13版本
FROM golang:1.13 as build

# 容器环境变量添加,会覆盖默认的变量值
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct

# 设置工作区
WORKDIR /go/release

# 把全部文件添加到/go/release目录
ADD . .

# 编译:把cmd/main.go编译成可执行的二进制文件,命名为app
RUN GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build -ldflags="-s -w" -installsuffix cgo -o app cmd/main.go

# 运行:使用scratch作为基础镜像
FROM scratch as prod

# 在build阶段复制时区到
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 在build阶段复制可执行的go二进制文件app
COPY --from=build /go/release/app /
# 在build阶段复制配置文件
COPY --from=build /go/release/config ./config

# 启动服务
CMD ["/app"]

构建阶段,以golang:1.13为基础镜像,把项目编译成Linux x64位系统可执行的二进制文件(命名为app)。运行阶段,把必要的配置文件和app复制到scratch镜像中运行。最后的镜像只包括运行阶段的文件,所以体积很小,只有10多M。

  • golang编译知识
GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build -ldflags="-s -w" -installsuffix cgo -o app cmd/main.go
GOOSlinux
CGO_ENABLED10
GOARCH386amd64
-ldflags
-s-w
-installsuffix
-o
cmd/main.gomain
scratch镜像

scratch是一个空镜像,只能用于构建其他镜像,比如你要运行一个包含所有依赖的二进制文件,如Golang程序,可以直接使用scratch作为基础镜像。scratch本身是不占空间的,所以使用它构建的镜像大小几乎和二进制文件本身一样大,从而让Golang应用的Docker镜像体积非常小。
参考:https://mp.weixin.qq.com/s/S1Ib08SpQbf1SCbCutUoqQ

制作Golang程序Docker镜像

这里直接使用Linux服务器制作Docker镜像,也可以使用Docker for windows在windows上制作Docker镜像。

DockerGolang
go get -x github.com/bingjian-zhu/gin-vue-admin/cmd
config/config.ymldatabaserun-moderelease

(3)生成Docker镜像

zhubingjian/gin-vue-admin1.0.
docker build -t zhubingjian/gin-vue-admin:1.0 .
zhubingjianDocker HubDocker HubDocker Hub账号/tag
docker images
nonedocker rmi 镜像ID

(4)运行镜像

docker run -d --name gin-vue-admin -p 8000:8000 zhubingjian/gin-vue-admin:1.0
-d--name-p
docker ps -a
STATUSUp 10 secondsExited 6 days
VUE

制作VUE程序Docker镜像

Dockernodejsnpm
vue-adminnpm
npm install
vue-admin.env.production
distnpm run build:prod
docker build -t zhubingjian/vue-admin:1.0 .
docker run -p 80:80 -d --name vue-admin zhubingjian/vue-admin:1.0

最后,在浏览器上打开:http://zbj-home.picp.io

就可以看到程序已经在服务器上跑了。

把镜像推送到Docker Hub上

首先需要注册Docker Hub账号,我注册时候是有坑的,注册系统需要做人机检测,需要翻墙才能完成。官网地址:https://hub.docker.com/

docker login

然后输入用户名和密码

(2)推送镜像

docker push zhubingjian/gin-vue-admin:1.0
docker push zhubingjian/vue-admin:1.0

总结

本篇主要介绍如何使用多阶段构建Golang程序的Docker镜像,此方法可以精简Docker镜像。

参考:

内容总结

以上是互联网集市为您收集整理的多阶段构建Golang程序Docker镜像全部内容,希望文章能够帮你解决多阶段构建Golang程序Docker镜像所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。

内容手机端