系列文章目录
 第一章 Docker介绍
 第二章 2.1 Mac通过Homebrew安装Docker
 第二章 2.2 CentOS安装Docker
 第三章 Docker常用命令
 第四章 常用命令实战
 第五章 Docker镜像详解
 第六章 Docker容器数据卷
 第七章 Dockerfile详解
 第八章 Dokcerfile部署go项目
文章目录
- 一、前言
- 二、环境
- 三、新建Go项目
- 3.1 go项目目录
- 3.2 config.yaml文件
- 3.3 main.go文件
- 3.4 本地测试运行
 
- 四、编写Dockerfile文件
- 4.1 新建Dockerfile文件
- 4.2 编写Dockerfile文件
- 4.3 构建镜像
- 4.4 运行容器
- 4.5 本地测试运行
 
- 五、总结
一、前言
实践是检验真理的唯一标准,有了之前的Dockerfile基础之后,编写一个简单的go项目,并通过Dockerfile部署,Mac本机测试
二、环境
| 名称 | 备注 | 
|---|---|
| MackBook Pro | 2023年 | 
| 芯片 | Apple M2 Pro(arm64) | 
| macOS | Sonoma 14.5 | 
| 操作命令对象 | Docker 版本26.1.3 | 
| 简单go项目 | Go 版本1.22.2 | 
三、新建Go项目
有go基础的可以直接跳过,查看Dockerfile编写
3.1 go项目目录
新建个名为gindemo的项目,包含config.yaml,main.go2个文件

3.2 config.yaml文件
mysql:url: 127.0.0.1port: 330678
3.3 main.go文件
package mainimport ("fmt""github.com/gin-gonic/gin""gopkg.in/yaml.v3""os"
)type Config struct {Mysql Mysql `json:"mysql"`
}type Mysql struct {Url  stringPort int
}func main() {dataBytes, err := os.ReadFile("config.yaml")if err != nil {fmt.Println("读取文件失败:", err)return}config := Config{}err = yaml.Unmarshal(dataBytes, &config)if err != nil {fmt.Println("解析 yaml 文件失败:", err)return}r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"Mysql": config.Mysql,})})r.Run(":8080")
}
3.4 本地测试运行
依次安装gindemo需要的依赖
go get -u github.com/gin-gonic/gin
go get -u gopkg.in/yaml.v3
引用项目需要的依赖增加到go.mod文件
go mod tidy
依次执行如下代码,运行服务
go build main.go
./main
新起个terminal执行如下代码
curl 127.0.0.1:8080 
当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
 {"Mysql":{"Url":"127.0.0.1","Port":330678}}% 
四、编写Dockerfile文件
4.1 新建Dockerfile文件
在gindemo工程目录下新建Dockerfile文件,只能以Dockerfile命名,开头不能小写。
 
 编译镜像,这里main二进制文件,不需要用到,可以删除
4.2 编写Dockerfile文件
#由于我电脑是arm64的芯片所以用了1.22.4-alpine3.20的镜像
FROM golang:1.22.4-alpine3.20 AS builderLABEL author="donkor"#设置国内软件仓库镜像
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories#alpine 基础镜像中没有包含时区信息文件 所以需要安装tzdata
RUN apk update --no-cache && apk add --no-cache tzdata
#设置工作目录
WORKDIR /build
#拷贝当前所有文件到build目录
COPY . .
#安装go项目依赖
RUN go mod download
#-ldflags="-s -w" -w为去掉调试信息(无法使用gdb调试),-s为去掉符号表。 -o 编译输出的名称,代替默认的包名
RUN go build -ldflags="-s -w" -o /build/mainFROM scratch
#设置时区
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/ShanghaiWORKDIR /app
#拷贝编译后的二进制文件
COPY --from=builder /build/main .
#设置数据卷
VOLUME ["/app/config.yaml"]
#暴漏的端口
EXPOSE ["8080"]
#运行程序
ENTRYPOINT ["/app/main"]
由于mac电脑芯片不同,我的是arm64,所以用到了1.22.4-alpine3.20。这里第一个From可以理解是进行编译二进制文件,第二个From是构建镜像。其他的注释写的很清晰,我就不过多赘述。
在terminal中输入uname -a可以查到自己mac电脑芯片的处理器
 DockerHub arm64 golang镜像地址
4.3 构建镜像
在terminal中构建镜像,docker/my_gin_demo为镜像名。如果构建失败了,那你要想想是不是网络问题,或者是命令没有写对。
docker build -t docker/my_gin_demo:v1 .
成功后输出
 
 也可以通过docker images查看镜像是否创建成功
 
4.4 运行容器
交互运行的方式后台启动名称为mygindemo01,端口8080映射给8899,挂载容器内/app/config.yaml文件的容器
docker run -itd --name mygindemo01 -p 8899:8080 -v 你的主机目录/config.yaml:/app/config.yaml 容器id
也可以写成,一般建议用下面这种方式,如果太长了可以写个.sh文件。
docker run -itd --name mygindemo01 \
-p 8899:8080 \
-v 你的主机目录/config.yaml:/app/config.yaml \
容器id

4.5 本地测试运行
通过docker ps查看容器是否创建运行成功
 
 在terminal执行如下代码
curl 127.0.0.1:8899 
当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
 {"Mysql":{"Url":"127.0.0.1","Port":330678}}% 
 修改本机config.yaml文件
mysql:url: 127.0.0.1port: 3306
通过重启容器docker restart 容器ID,在terminal再次执行curl 127.0.0.1:8899 ,本机文件挂载容器成功。
 
五、总结
今天周六端午节第一天,祝大家端午节安康。