为啥要用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
选择一个版本安装
yum install docker-ce-20.10.3
启动 Docker
systemctl start docker
设置开机自启
systemctl enable docker
查看是否安装成功
docker version
创建 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"
请求成功啦~
至此我们成功创建了一个可以使用的 Scratch 镜像,它可以运行在任何一个安装了 docker 的机器上,当代码编写完成需要上线的时候,我们只需要按这个流程制作一个最新的镜像交给运维同学即可,再也不会遇到开发环境与线上环境不同的困扰。
这样我们就将使用 Docker 部署 Gin 项目的流程介绍完了。不过,这篇博客可以教会你如何按流程刻板地 Docker 化部署 Gin项目,却不能满足每个人的定制化需求,如果你有更多需求(比如部署 Springboot 项目),则需要学习更多 Docker 知识,做到知其然并知其所以然,如果这正是你所需要的,那就继续去学习吧。