分享

【Go语言实战】 (12) Docker 部署 Gin+MySQL+Redis 项目

 小生凡一 2022-03-31

目录

写在前面

今天我们用 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://,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镜像
在这里插入图片描述
大家有什么问题也可以问这位运维大佬! 愿许浪尽天涯

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多