系列文章目录
第一章 Docker介绍
第二章 2.1 Mac通过Homebrew安装Docker
第二章 2.2 CentOS安装Docker
第三章 Docker常用命令
第四章 常用命令实战
第五章 Docker镜像详解
第六章 Docker容器数据卷
第七章 Dockerfile详解
第八章 Dokcerfile部署go项目
第九章 Docker使用Buildx构建不同CPU架构镜像
第十章 Docker网络
第十一章 Docker-Compose用法
文章目录
一、前言
实践是检验真理的唯一标准,有了之前的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.go
2个文件
3.2 config.yaml文件
mysql:
url: 127.0.0.1
port: 330678
3.3 main.go文件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
"os"
)
type Config struct {
Mysql Mysql `json:"mysql"`
}
type Mysql struct {
Url string
Port 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文件
#这里的go版本最好对应本地的go版本
FROM golang:1.22.4-alpine3.20 AS builder
LABEL 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/main
FROM 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/Shanghai
WORKDIR /app
#拷贝编译后的二进制文件
COPY --from=builder /build/main .
#设置数据卷
VOLUME ["/app/config.yaml"]
#暴漏的端口
EXPOSE ["8080"]
#运行程序
ENTRYPOINT ["/app/main"]
这里第一个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.1
port: 3306
通过重启容器docker restart 容器ID
,在terminal再次执行curl 127.0.0.1:8899
,本机文件挂载容器成功。
五、总结
今天周六端午节第一天,祝大家端午节安康。