从零使用Docker部署Gin项目


为啥要用Docker

大家平时肯定遇到过在开发环境下运行得好好的程序,放到线上环境就出现奇奇怪怪的 bug 甚至无法启动,这往往是线上环境与开发环境不同导致的。为了解决这个问题,Docker 应运而生,它可以让开发人员将应用打包到容器(可以理解为轻量虚拟机)中,容器包含了程序及对应的运行环境,且可以在任何主流的 linux 机器上运行,从而保持了开发与上线时程序的运行环境一致,十分方便 。今天我们就重点聊聊怎么从零开始使用 Docker 部署项目。

安装Docker

篇幅所限,本文只介绍 CentOs 环境下的安装方式,其余系统可自行 Google

注:非 root 用户以下命令前均添加 sudo

更新 yum 包

yum -y update

安装所需软件包

yum install -y yum-utils device-mapper-persistent-data lvm2

设置 yum 源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看可用版本

yum list docker-ce --showduplicates | sort -r

image-20210628200427053

选择一个版本安装

yum install docker-ce-20.10.3

启动 Docker

systemctl start docker

设置开机自启

systemctl enable docker

查看是否安装成功

docker version

image-20210628201410975

创建 Mysql 容器

拉取 Mysql 镜像

docker pull mysql

创建并运行一个 Mysql 容器

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=testPass -d mysql

进入容器

docker exec -it 9a35fc886fec4(容器id) /bin/bash

登录 Mysql

mysql -uroot -p

密码使用创建容器时设置的密码,接下来就可以创建/迁移数据库啦

构建 Scratch 镜像

编写 Dockerfile

在项目根目录创建名为 Dockerfile 的文件,添加内容

FROM scratch

WORKDIR $GOPATH/src/msf-backend-web
COPY . $GOPATH/src/msf-backend-web

EXPOSE 8888
CMD ["./msf-backend-web"]

其中项目路径/目标路径/运行端口等根据自己项目情况修改即可

编译可执行文件

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o msf-backend-web .

构建镜像

$ docker build -t msf-backend-web .
Sending build context to Docker daemon  33.44MB
Step 1/5 : FROM scratch
 ---> 
Step 2/5 : WORKDIR $GOPATH/src/msf-backend-web
 ---> Using cache
 ---> 6b8e45c136a9
Step 3/5 : COPY . $GOPATH/src/msf-backend-web
 ---> 7ffb12cabe52
Step 4/5 : EXPOSE 8888
 ---> Running in 263232b68cfe
Removing intermediate container 263232b68cfe
 ---> 243f8e8a2913
Step 5/5 : CMD ["./msf-backend-web"]
 ---> Running in 06441170cf66
Removing intermediate container 06441170cf66
 ---> 369328eb2861
Successfully built 369328eb2861
Successfully tagged msf-backend-web:latest

运行容器

$ docker run --link mysql:mysql -p 8888:8888 msf-backend-web
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /api/login                --> msf-backend-web/routers/api.Login (3 handlers)
[GIN-debug] POST   /api/token/refresh        --> msf-backend-web/routers/api.RefreshToken (3 handlers)
[GIN-debug] POST   /api/project/publish      --> msf-backend-web/routers/api.PublishProject (3 handlers)
[GIN-debug] GET    /api/project/detail/basic --> msf-backend-web/routers/api.GetProjectBasicDetail (3 handlers)
[GIN-debug] GET    /api/project/list         --> msf-backend-web/routers/api.GetProjectList (3 handlers)
[GIN-debug] GET    /api/project/detail/list  --> msf-backend-web/routers/api.GetProjectDetailList (3 handlers)
[GIN-debug] POST   /api/project/delete       --> msf-backend-web/routers/api.DeleteProject (3 handlers)
[GIN-debug] POST   /api/project/detail/option/delete --> msf-backend-web/routers/api.DeleteClientOption (3 handlers)
[GIN-debug] POST   /api/project/rebuild      --> msf-backend-web/routers/api.PublishProjectByOldProject (3 handlers)
[GIN-debug] GET    /api/project/detail/client/search --> msf-backend-web/routers/api.GetAllClientsByProjectId (3 handlers)

测试一下

[GIN] 2021/06/28 - 13:01:54 | 200 |    254.6702ms |      172.17.0.1 | GET      "/api/project/detail/basic?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBZG1pbklkIjoxLCJleHAiOjE2MjQ4OTIyODN9.aHqWSyqOtCpSKITgoOO0Yr-sdUNHyw2jwpGem98VAh0&project_id=1"
[GIN] 2021/06/28 - 13:20:15 | 200 |    260.0823ms |      172.17.0.1 | GET      "/api/project/detail/basic?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBZG1pbklkIjoxLCJleHAiOjE2MjQ4OTIyODN9.aHqWSyqOtCpSKITgoOO0Yr-sdUNHyw2jwpGem98VAh0&project_id=1"

image-20210628212427225

请求成功啦~

至此我们成功创建了一个可以使用的 Scratch 镜像,它可以运行在任何一个安装了 docker 的机器上,当代码编写完成需要上线的时候,我们只需要按这个流程制作一个最新的镜像交给运维同学即可,再也不会遇到开发环境与线上环境不同的困扰。

这样我们就将使用 Docker 部署 Gin 项目的流程介绍完了。不过,这篇博客可以教会你如何按流程刻板地 Docker 化部署 Gin项目,却不能满足每个人的定制化需求,如果你有更多需求(比如部署 Springboot 项目),则需要学习更多 Docker 知识,做到知其然并知其所以然,如果这正是你所需要的,那就继续去学习吧。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM