回顾
项目已开源:基于 Golang 的 容器管理系统
- 「容器管理系统」1. 开篇:框架选型和环境搭建
- 「容器管理系统」开发篇:1. 初始化配置和日志监控
- 「容器管理系统」开发篇:2. 封装gin统一返回JSON
- 「容器管理系统」开发篇:3. JWT(JSON Web Token)的应用
- 「容器管理系统」开发篇:4. Gin 如何优雅的使用 struct 的 tag 标签
- 「容器管理系统」开发篇:5. 如何实现 RBAC 权限管理(一)
- 「容器管理系统」开发篇:5. 如何实现 RBAC 权限管理(二)
- 「容器管理系统」开发篇:6. 如何在项目中集成 casbin 策略授权库?
- 「容器管理系统」开发篇:7. 初识 ETCD
- 「容器管理系统」开发篇:8. docker 的应用
前言
大家好,我是码一行。
本章节咱们来讲一下如何把 Golang
项目部署到 Docker
容器中。这里先说一下容器的优势:
- 更高效的利用系统资源
- 进程级别的隔离
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
使用 Docker
可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。
如何通过 Dockerfile 构建镜像?
- Dockerfile
Dockerfile
FROM golang:1.21-alpine AS builder
MAINTAINER CodeLine "1145938682@qq.com"
RUN mkdir -p /home/work/app/go-cloud-native
WORKDIR /home/work/app/go-cloud-native
COPY . .
RUN echo go-cloud-native \
&& go env -w GOPROXY=https://goproxy.cn,direct \
&& go mod download \
&& go build -o build/package/main ./cmd/server/main.go
# 使用最小镜像来运行编译后的 go 项目
FROM alpine as runner
MAINTAINER go-cloud-native "1145938682@qq.com"
WORKDIR /home/work/app/go-cloud-native
COPY --from=builder /home/work/app/go-cloud-native/build/package ./build/package
COPY --from=builder /home/work/app/go-cloud-native/configs ./configs
EXPOSE 8000
CMD ["/home/work/app/go-cloud-native/build/package/main", "-c", "/home/work/app/go-cloud-native/configs/local.toml"]
说明:
构建编译环境
- 要减小镜像体积,首先多阶段构建这很重要,这样就可以把编译环境和运行环境分开。
- 在构建程序包的时候,使用带编译环境的镜像去构建,运行的时候其实完全不需要 go 的编译环境,使用空镜像
- 因为项目依赖
go1.21
的版本,所以选择golang:1.21-alpine
作为编译环境,是因为这是体积最小的golang编译环境 MAINTAINER
设置镜像作者,这里不用太关心用途- 创建项目目录
WORKDIR
定义项目目录并进入该目录- 复制目录到镜像目录
- 设置
GOPROXY
是为了提升构建速度 - 执行
go mod download
拉取项目依赖包 go build
编译go
程序到指定目录
构建运行环境
- 这里空镜像使用的是
alpine
- 建议选择
alpine
,alpine
的镜像大小是5.61MB
这个大小其实还是镜像解压后的大小,实际上下载镜像的时候,只需要下载2.68 MB
。
- 拉取最小镜像 alpine
WORKDIR
进入项目空间- 复制编译环境中
go build
之后的二进制文件 - 复制编译环境中依赖的配置文件
- 镜像使用端口
- 镜像执行命令
解读完 Dockerfile
文件,下面就是要执行构建命令了:
sh
# -t 是指定镜像名称,格式:镜像名称:版本号
# . 是指当前目录,这里跟 Dockerfile 的目录位置有关
# 如果 Dockerfile 在当前根目录,直接用 . 就可以
# 如果 Dockerfile 不在当前目录,也可以指定 Dockerfile 路径地址
docker build . -t go-cloud-native:v1.1.0
启动指定镜像的容器
docker
的容器启动命令:docker run
sh
docker run -d --name go-cloud-native -p 8000:8000 --privileged=true go-cloud-native:v1.1.0
解读一下:
-d
是让容器后台运行--name
定义容器名称-p
指定端口映射,格式为:主机(宿主)端口:容器端口--privileged=true
给容器开特权,这样 root 用户才是真正的 root 用户,否则 root 用户就是【普通用户】- 最后就是指定镜像:格式为:镜像名称:版本号
到这里容器的部署就已经完成了
结束语
本节主要讲解了:
- golang 项目如何部署到 docker
- Dockerfile 文件解读
- docker run 命令解读