Go语言实战 (12) Docker 部署 Gin+MySQL+Redis 项目
Posted 小生凡一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言实战 (12) Docker 部署 Gin+MySQL+Redis 项目相关的知识,希望对你有一定的参考价值。
目录
写在前面
今天我们用 docker 部署我们的商城项目,主要有项目Mall、mysql、Redis。
基于CentOS 7
系统
项目地址
https://github.com/CocaineCong/gin-mall
项目结构
1. 安装docker
- 更新源
yum update
- 安装docker
yum install docker
- 启动docker
systemctl start docker
- 查看是否启动成功
systemctl status docker
- 查看所有的镜像
docker images
- 查看所有的容器状态
docker ps -a
2. 镜像启动
2.1 MySQL
2.1.1 拉取
docker pull mysql:tag
我这里的tag
是mysql 的 8.0
版本,如果不指定就默认是最新版本
docker images
查看镜像
2.1.2 启动
启动mysql容器要保证宿主机的3306没有被占用,或者你也可以用其他端口进行映射,我这里把宿主机的3306端口停了,所以就用3306端口进行映射了。
docker run --name mysql -v /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8.0
说明一下这些参数
--name mysql
表示将这个容器命名为mysql
-v /var/lib/mysql:/var/lib/mysql
表示将宿主机的 /var/lib/mysql 卷映射到容器里的 /var/lib/mysql 卷中,这里是为了我们能够把这个数据保存在宿主机中,防止容器删掉就没了。
-e MYSQL_ROOT_PASSWORD=root
表示MySQL的密码我这里设置了root
-p 3306:3306
将宿主机的3306端口映射到容器的3306端口
-d
后台运行
mysql:8.0
使用mysql:8.0这个镜像
2.2 Redis
2.2.1 拉取
docker pull redis
这里我们没有指定版本,所以是 latest
最新版本
2.2.2 启动
docker run --name redis -v /usr/local/redis:/usr/local/redis -p 6379:6379 -d redis:latest
3. Dockerfile
- 首先以
golang1.16
为基础镜像 - 设置系统环境和代理
- 指定工作区
app
- 复制项目并且进行项目的编译
- 将编译好的 main 和 conf 复制到镜像中 (也可以进行映射)
- 再基于busybox镜像进行构建多一层终端
- 暴露3000端口
- 最后./main运行
FROM golang:1.16 as builder
ENV GO111MODULE=on \\
GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o main
RUN mkdir publish \\
&& cp main publish \\
&& cp -r conf publish
FROM busybox:1.28.4
WORKDIR /app
COPY --from=builder /app/publish .
# 指定运行时环境变量
ENV GIN_MODE=release
EXPOSE 3000
ENTRYPOINT ["./main"]
- 将我们的项目git下来
- 然后我们再进行项目的配置文件的编写config.ini
这里注意要填宿主机的ip地址,因为docker是进程隔离的状态,所以我们不能填127.0.0.1!并且要确保这几个端口的安全组已经开了!
然后我们就可以进行docker build了
docker build -t mall:tag .
我这里tag指定的是1.0,如果不指定的话就是latest了
检查每一个step有没有对应的序列号出来,全都有就是成功了。
我们跑一下
docker run --name mall -p 3000:3000 -d mall:1.0
发现没跑起来,所以就
docker logs NAMES
查看日志,发现mysql忘记创建数据库了
我们docker exec进入mysql中进行数据库表的创建
然后重启一下我们的容器
因为我们的mall容器的id是a开头的,所以直接a也可以代表这个容器!
全部都up起来就好了
我们postman测试一下
有响应即可!
4. docker-compose.yml
当我们有多个容器需要启动的时候,我们可以用docker-compose.yml进行容器的管理
version: '2'
services:
civil:
build: ./
image: mall:2.0
container_name: mall
restart: always
environment:
MYSQL_DSN: "root:root@tcp/mall_db?charset=utf8&parseTime=True&loc=Local"
ports:
- 3000:3000
depends_on:
- mysql
- redis
mysql:
container_name: mysql
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mall_db
volumes:
- /var/lib/mysql:/var/lib/mysql
ports:
- 3306:3306
redis:
container_name: redis
image: redis:latest
restart: always
volumes:
- /usr/local/redis:/usr/local/redis
ports:
- 6379:6379
使用
docker-compose -f docker-compose.yml up -d
都启动成功了
再进行测试
成功即可!
最后
在此非常感谢运维大佬 愿许浪尽天涯 的帮助,帮我排查了镜像的问题!
Dockerfile文件我本来是写FROM scratch的,但是好像没有执行成功,才换成了busybox镜像
大家有什么问题也可以问这位运维大佬! 愿许浪尽天涯
以上是关于Go语言实战 (12) Docker 部署 Gin+MySQL+Redis 项目的主要内容,如果未能解决你的问题,请参考以下文章
Go语言实战 (15) Gin+gRPC 微服务实现备忘录 (下) | 备忘录模块
Go实战--通过gin-gonic框架搭建restful api服务(github.com/gin-gonic/gin)