「容器管理系统」开发篇:10. Dockerfile 部署

回顾

项目已开源:基于 Golang 的 容器管理系统

前言

大家好,我是码一行。

本章节咱们来讲一下如何把 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
  • 建议选择 alpinealpine 的镜像大小是 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 命令解读
相关推荐
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
susu10830189112 小时前
Debian 11 Bullseye 在线安装docker
运维·docker·debian
love530love3 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
人生匆匆3 小时前
docker进入启动失败的容器
运维·docker·容器
Code季风5 小时前
Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)
前端·微服务·架构·go·gin
Code季风5 小时前
Gin Web 服务集成 Consul:从服务注册到服务发现实践指南(下)
java·前端·微服务·架构·go·gin·consul
魂尾ac7 小时前
Centos Docker 安装(100%成功)
linux·docker·centos
Johny_Zhao13 小时前
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
linux·网络安全·docker·信息安全·zookeeper·kubernetes·云计算·系统运维
zwjapple14 小时前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
代码老y16 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器