「容器管理系统」开发篇: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 命令解读
相关推荐
攸攸太上32 分钟前
Docker学习
java·网络·学习·docker·容器
Sylvan Ding40 分钟前
Docker+PyCharm远程调试&环境隔离解决方案
docker·容器·pycharm
_道隐_4 小时前
如何在Windows上安装Docker
windows·docker
孙强_05254 小时前
使用docker创建zabbix服务器
服务器·docker·zabbix
shelby_loo8 小时前
通过 Docker 部署 MySQL 服务器
服务器·mysql·docker
prcyang11 小时前
Docker Compose
运维·docker·容器
蜗牛^^O^11 小时前
Docker和K8S
java·docker·kubernetes
脚踏实地的大梦想家11 小时前
【Docker】安装全流程与配置完整镜像源(可安装 nginx)
运维·docker·容器
Zww089111 小时前
docker部署个人网页导航
运维·docker·容器
PeterJXL12 小时前
Docker-compose:管理多个容器
运维·docker·容器