欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

GO-Gin 示例第 6 部分 将 Golang 应用程序部署到 Docker--实施

最编程 2024-03-20 07:04:46
...

编写dockerfile

在我们的项目根目录下创建dockerfile文件,写入以下内容

FROM golang:latest

ENV GOPROXY https://goproxy.cn,direct

WORKDIR $GOPATH/src/github.com/kingsill/gin-example
COPY . $GOPATH/src/github.com/kingsill/gin-example

#RUN go build main.go
RUN go build .

EXPOSE 8000

#ENTRYPOINT ["./main"]
ENTRYPOINT ["./gin-example"]
  • FROM golang:latest

指定使用最新版的官方的Golang镜像作为基础镜像,用于构建docker容器

  • ENV GOPROXY https://goproxy.cn,direct

对创建容器的全局变量进行设置,设置go模块代理环境为国内镜像

  • WORKDIR $GOPATH/src/github.com/kingsill/gin-example

设置容器内的工作目录,如果不存在会自动创建,首次出现,为进入容器后默认的工作目录,不需要cd

  • COPY . $GOPATH/src/github.com/kingsill/gin-example

将当前目录的所有内容(.指代所有文件)复制到指定目录(刚才设置的容器内的工作目录)

  • RUN go build .

Run命令等同于在终端操作的shell命令,只在build时执行。这里即相当于在创建的容器的工作目录中编译当前文件夹内的go文件,生成的exe文件名字为根目录的名称

  • EXPOSE 8000

expose声明对外暴露的端口,可以不写,docker run -p可以指定暴露端口

  • ENTRYPOINT ["./gin-example"]

entrypoint为容器启动时执行的命令,这里即运行build生成的可执行文件,让程序随容器运行而启动

拉取mysql镜像

  1. 拉取镜像
    从Docker公共仓库下载MySql镜像(国内建议先配置镜像源)
docker pull mysql
  1. 创建、运行MySql容器
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -d mysql

--name:指定容器名称

-p 3306:3306:指定端口映射,将容器内部的Mysql服务端口3306映射到主机的3306端口。

-e MYSQL_ROOT_PASSWORD=rootroot:设置MySql数据库的root用户密码为rootroot,实际通过环境变量MYSQL_ROOT_PASSWORD指定

-d 表示在后台运行容器,不会阻塞当前终端

修改配置文件

由于我们使用Mysql容器,我们需要对配置文件app.ini进行修改

#debug or release
RUN_MODE = debug

[app]
PAGE_SIZE = 10
JWT_SECRET = 23347$040412

[server]
HTTP_PORT = 8000
READ_TIMEOUT = 60
WRITE_TIMEOUT = 60

[database]
TYPE = mysql

# 这里的密码是创建MySql容器时我们定下的密码
USER = root
PASSWORD = rootroot

#127.0.0.1:3306
#HOST = localhost:3306
HOST = mysql:3306

NAME = blog
TABLE_PREFIX = blog_

构建镜像

在gin-example项目根目录下执行

docker build -t gin-blog-docker .

-t:指定名称

. :构建内容为当前上下文目录,从当前目录中寻找dockerfile文件

验证镜像

执行命令

& docker ps

CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                               NAMES
89abe529cf28   gin-blog-docker   "./gin-example"          4 hours ago   Up 4 hours   0.0.0.0:8000->8000/tcp              laughing_sammet
88606fa6bacc   mysql             "docker-entrypoint.s…"   5 hours ago   Up 5 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

存在刚刚构建的两个镜像

创建并运行容器,将golang容器和MySql容器关联

docker run --link mysql:mysql -p 8000:8000 gin-blog-docker
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 2024/03/18 06:36:18 Error 1049 (42000): Unknown database 'blog'
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /swagger/*any             --> github.com/swaggo/gin-swagger.CustomWrapHandler.func1 (3 handlers)
[GIN-debug] GET    /auth                     --> github.com/kingsill/gin-example/routers/api.GetAuth (3 handlers)
[GIN-debug] GET    /api/v1/tags              --> github.com/kingsill/gin-example/routers/api/v1.GetTags (4 handlers)
[GIN-debug] POST   /api/v1/tags              --> github.com/kingsill/gin-example/routers/api/v1.AddTag (4 handlers)
[GIN-debug] PUT    /api/v1/tags/:id          --> github.com/kingsill/gin-example/routers/api/v1.EditTag (4 handlers)
[GIN-debug] DELETE /api/v1/tags/:id          --> github.com/kingsill/gin-example/routers/api/v1.DeleteTag (4 handlers)
[GIN-debug] GET    /api/v1/articles          --> github.com/kingsill/gin-example/routers/api/v1.GetArticles (4 handlers)
[GIN-debug] GET    /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.GetArticle (4 handlers)
[GIN-debug] POST   /api/v1/articles          --> github.com/kingsill/gin-example/routers/api/v1.AddArticle (4 handlers)
[GIN-debug] PUT    /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.EditArticle (4 handlers)
[GIN-debug] DELETE /api/v1/articles/:id      --> github.com/kingsill/gin-example/routers/api/v1.DeleteArticle (4 handlers)
2024/03/18 06:58:38 Actual pid is 1

--link:可以在容器内直接使用其关联的容器别名进行访问,而不是通过ip
但是--link只能解决单机容器间的关联
在分布式多机的情况下,需要通过别的方式进行连接

当然,现在依旧是由问题的,我们可以看到这一句2024/03/18 06:36:18 Error 1049 (42000): Unknown database 'blog'
这说明在我们现在的MySql容器中没有我们之前创建的数据库和表

如果只是在当前容器内使用,可以直接在MySql容器内进行表格等建立即可

当然如果想要数据持久化,并且不随容器删除而删除,多个容器使用,就需要用到挂载数据卷

挂载主机目录

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -v /home/wang2/docker_rep:/var/lib/mysql mysql

-v /home/wang2/docker_rep:/var/lib/mysql:这里多出的一句是将宿主机的目录/home/wang2/docker_rep,挂载到容器的/var/lib/mysql,即mysql默认存储数据的位置,完成数据持久化

当然,也可以选择将我们之前的mysql数据直接复制到这里,这一种方法大家可以自己尝试

之后我们可以直接在容器中再进行数据库内容的初始化即可,我们第一部分的数据初始化部分

重新运行golang容器

docker run --link mysql:mysql -p 8000:8000 gin-blog-docker

验证

访问http://127.0.0.1:8000/auth?username=test&password=test123456
得到结果如下:

{
    "code": 200,
    "data": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZCI6InRlc3QxMjM0NTYiLCJleHAiOjE3MTA3NTU5MzQsImlzcyI6Imdpbi1ibG9nIn0.UO686FMYrBT-pXkkIEcNr7g8l-7kqEpjsd_Gim2bRWE"
    },
    "msg": "ok"
}

该项目部署到docker成功