本教程教大家如何使用Dockerfile文件创建自己的镜像,我们使用一个简短的go代码作为演示,它的作用是开启一个http端口,下面是我们的go代码
package main
import (
"log"
"github.com/gin-gonic/gin"
)
func main() {
g := gin.Default()
g.GET("/hello:name", func(c *gin.Context) {
log.Println("hello")
name := c.Param("name")
c.String(200, "Hello %s", name)
})
g.Run(":3000")
}
拿到代码后要先确保电脑安装了go的环境,如果有我们运行下面的命令,先来运行一下看看效果
go mod init test
go mod download
go run .
curl http://127.0.0.1:3000/hello:name
# 输出
Hello name
输出如上就表示运行成功了,下面我们开始讲解如何使用docker制作一个容器来运行这个代码
# syntax=docker/dockerfile:1
FROM golang:1.23.4 AS build-go
WORKDIR /app
# 设置国内镜像源
ENV GOPROXY=https://goproxy.cn,direct
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-go-test
FROM alpine
WORKDIR
COPY --from=build-go /docker-go-test /docker-go-test
EXPOSE 3000
CMD ["/docker-go-test"]
我们使用多阶段构建的形式来制作镜像,这种方式的好处是使程序运行在一个更稳定的环境中,还可以大大减少镜像的大小,接下来我们逐行解析
- 第一行是- 指定使用 Dockerfile 的版本 1 语法。这是必须添加的并且必须在第一行!!!
- FROM 指定一个镜像作为基础镜像,这里使用了golang:1.23.4,AS的作用是命名当前阶段
- WORKDIR 创建一个目录并设置为工作目录,以后的操作都在这个目录
- ENV 设置环境变量,这里的作用是使用go的国内镜像
- COPY 主要用于将宿主机的文件复制到镜像中,这里将mod和sum文件拷贝到app中
- RUN 用于执行指定命令
- 第二个FROM表示进入的第二阶段,一阶段用于构建我们的程序,二阶段用于运行也是最终阶段
- 这里我们设置了一个/工作目录
- –from表示文件来自哪里,不设置这个默认为宿主机,这里我们设置了来自一阶段,将构造好的二进制文件拷贝到二阶段
- EXPOSE 暴力3000端口用于外部访问
- CMD 是启动容器时运行的命令,这里我们启动docker-go-test
Dokcerfile文件解释完了,我们再使用docker build
命令构建镜像
docker build --tag docker-go-test .
–tag 指定镜像的名字,最后我们使用run命令来运行镜像
# 运行镜像
docker run -p 3123:3000 --name go-test -d docker-go-test
# 测试
curl http://127.0.0.1:3123/hello:789
# 输出
Hello 789