前言:
我们现在有一个很简单的一个项目,只有一个hello路由方法,访问路径是xxx.xxx.xxxx.xxx:8080/hello,访问之后就会打印出来:"hello,test!"
Dockerfile
首先的话就是Dockerfile这个文件,这个文件你可以将其看做是一个脚本文件,里面写的全部都是我们构建项目镜像的指令。我拿一个最简单的也是我们项目中最常用的Dockerfile来说一下吧。
plain
#第一步:获取一个包含go编译环境的Linux系统镜像
FROM golang:1.23-alpine AS builder
#第二步:在刚刚pull下来的镜像里面基于根目录创建一个app文件夹
WORKDIR /app #创建并进入到app目录下面
#第三步:将项目的go.mod 和go.sum 复制到app目录下面
COPY go.mod go.sum ./
#第三步的等价写法还有:COPY go.mod go.sum . 还有COPY go.mod go.sum /app
#第四步:下载依赖资源
RUN go mod download
#第五步:将本地项目的其它代码全部复制到app目录下面
COPY . .
#将go项目文件编译成为可执行的二进制文件
RUN go build -o xxx-app . #这个.就表明了main.go是在项目的根目录下面的。
#但是我们的项目一般是放在项目根目录/cmd/xxx/main.go下面的,这是就要写成为
RUN go build -o xxx-app ./cmd/xxx
#此时我们已经将我们的项目编译成为一个可执行的二进制文件了
#我们此时还需要将我们的可执行的二进制文件复制到更小的镜像里面去
#第五步:构建一个更小的Linux系统镜像
FROM alpine:latest
#第六步:创建并进入到app目录下面
WORKDIR /root
#将在 golang:1.23-alpine中构建好的可执行的二进制文件复制到改系统镜像里面去
COPY --from=builder /app/xxx-app /root
#执行这个可执行的二进制文件
CMD["./xxx-app"]
构建镜像
写好了Dockerfile之后,我们应该如何打包构建项目镜像呢?在本地项目的根目录执行下面docker指令就可以了
plain
docker build -f xxxx/Dockerfile -t xxxx-xxx .
# -f xxxx/Dockerfile是你实际Dockerfile存放的地方
#-t就是将镜像的名称命名为xxxx-xxxx
#后面的 . 就是构建上下文仍然是当前目录(项目根目录)
镜像推送
现在我们在本地已经打包好了项目的镜像:我们需要将我们的镜像推送到我们的要发布的云服务器上面去,现在有两种方法。
第一种方法:
将我们的本地镜像push到DockerHub(和Github一样,就是托管的仓库)上面去,然后我们在我们的云服务器在pull下来就可以了。
plain
docker login
# 输入你的 Docker Hub 用户名和密码
# 格式:docker tag 本地镜像名 dockerhub用户名/仓库名:标签
docker tag xxxx-app yourusername/xxxx-app:v1.0
docker push yourusername/xxxx-app:v1.0
#登录云服务器
docker pull yourusrename/xxxx-app:v1.0
第二种方法:
第一种方法是我们标准的推送方法,但是我在实际工作的时候,我们要求我们的镜像信息不对外公开,所以我每次在本地打包之后,还要在本地连接到我们的云服务器,然后将本地打包好的镜像上传到云服务器上去。其实那种方法都可以,主要是将本地的镜像上传到我们要发布的云服务器上面去。
镜像运行
这个的话我们写一个docker run的命令就可以了。
plain
docker run -d \
--name xxx-app-container \
-p 8080:8080 \
-v ./logs:/root/logs \
-v ./config:/root/config \
--restart unless-stopped \
yourusername/xxxx-app:v1.0
#上面的-v 就是将你项目的日志挂载到宿主机上面对应的文件夹
#-p就是进行一个端口映射,将容器中的端口映射到宿主机上去
#--restart unless-stopped 重启策略-除非手动停止否则重启
#-d 表示容器在后台运行
#-name 将容器命名为你想要的名称
访问测试
获取你云服务器的公网IP,在防火墙中开放8080端口。然后访问xxxx.xxxx.xxx.xxxx:8080/hello就会有响应信息了。就说明你的项目已经被部署到云服务上去了。
