• Docker学习-Docker部署Golang项目和Mysql镜像


    前言

    友情提示
    本文学习需要了解一些Linux简单命令和Docker的一些命令
    使用的项目我已经上传到github:https://github.com/Gopherlinzy/gin-gorm-example
    个人博客:https://linzyblog.netlify.app/

    一、获取一个可执行的项目

    我自己写了一个简单的gin-gorm项目,github下载地址:https://github.com/Gopherlinzy/gin-gorm-example
    在这里插入图片描述

    1、拉取项目

    打开Windows终端,输入命令:

    go get github.com/Gopherlinzy/gin-gorm-example
    
    • 1

    2、配置

    只需要拉取下来,修改 conf/app.ini 配置文件

    [database]
    Type = mysql
    User = 数据库名称
    Password = 数据库密码
    //数据库的IP地址
    Host = 127.0.0.1:3306
    //数据库名称 
    Name = blog
    TablePrefix = blog_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、编写Dockerfile文件

    Dockerfile文件就是单纯的文件并没有文件后缀,我们来了解一下,Dockerfile的作用。

    FROM golang:latest
    
    ENV GOPROXY https://goproxy.cn,direct
    WORKDIR $GOPATH/github.com/Gopherlinzy/go-gorm-example
    COPY . $GOPATH/github.com/Gopherlinzy/go-gorm-example
    RUN go build .
    
    EXPOSE 8080
    ENTRYPOINT ["./gin-gorm-example"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1、作用

    1. golang:latest 镜像为基础镜像,将工作目录设置为 $GOPATH/src/gin-gorm-example ,并将当前上下文目录的内容复制到 $GOPATH/src/gin-gorm-example 中。
    2. 在进行 go build 编译完毕后,将容器启动程序设置为 ./gin-gorm-example,也就是我们所编译的可执行文件。
    3. 注意:gin-gorm-example 在 docker 容器里编译,并没有在宿主机现场编译

    2、说明

    Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像

    1)FROM

    指定基础镜像(必须有的指令,并且必须是第一条指令)

    2)WORKDIR

    使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如果目录不存在,WORKDIR 会帮你建立目录

    格式: WORKDIR <工作目录路径>

    3)COPY

    COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

    COPY <源路径>... <目标路径>
    COPY ["<源路径1>",... "<目标路径>"]
    
    • 1
    • 2

    4)RUN

    用于执行命令行命令

    格式:RUN <命令>

    5)EXPOSE

    EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务

    格式: EXPOSE <端口 1> [<端口 2>…]

    在 Dockerfile 中写入这样的声明有两个好处

    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
    • 运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口

    6)ENTRYPOINT

    ENTRYPOINT 指令是指定容器启动程序及参数

    ENTRYPOINT 的格式和 RUN 指令格式一样,分为两种格式

    • exec 格式:
     ""
    
    • 1
    • shell 格式:
    ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
    
    • 1

    三、构建Docker镜像

    gin-gorm-example 的项目根目录下执行 docker build -t gin-gorm-docker .
    该命令作用是创建/构建镜像,-t 指定名称为 gin-gorm-docker,. 构建内容为当前上下文目录
    在这里插入图片描述

    四、验证镜像

    查看所有的镜像,确定刚刚构建的 gin-gorm-docker 镜像是否存在
    在这里插入图片描述

    五、创建并运行一个新容器

    执行命令 docker run -p 8080:8080 gin-gorm-docker
    在这里插入图片描述

    测试我们项目的API文档网址:http://localhost:8080/swagger/index.html

    在这里插入图片描述

    运行成功了么?

    我们再测试一下用户登录这块,我在用户表自动创建这块自动插入了一条用户信息用户:admin和密码:123456,用我们的postman测试一下,测试网址:http://localhost:8080/auth?username=admin&password=123456
    在这里插入图片描述

    我们仔细看看控制台的输出了一条错误
    在这里插入图片描述

    我们可以发现问题是在访问MySQL数据库的时候,连接数据库超时了!

    这就是我们接下来要解决的问题

    六、MySQL

    1、拉取镜像

    从 Docker 的公共仓库 Dockerhub 下载 MySQL 镜像(国内建议配个镜像),用pull指令拉取镜像,格式指令 docker pull 镜像名:版本号,不写版本号默认拉取最新版。

    我们这里就用5.7版本的MySQL数据库就好了。

    docker pull mysql:5.7
    
    • 1

    2、创建并运行一个MySQL容器

    用run指令创建并运行容器

    docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    
    • 1

    说明:
    –name mysql:指定容器名称为mysql,方便查找和使用
    -p xxxx:yyyy:宿主机上xxxx端口对应容器中yyyy端口,在外部访问时用的是宿主机上的端口
    -e MYSQL_ROOT_PASSWORD=123456:给root用户设置默认密码为123456
    -d:容器后台运行
    mysql:镜像名称

    3、连接数据库

    我用的是Navicat连接MySQL。
    在这里插入图片描述

    初始化的 Mysql 应该如图
    在这里插入图片描述
    创建我们的blog数据库,后续测试需要
    在这里插入图片描述

    七、关联Golang项目和MySQL

    1、删除原来的项目镜像

    由于原本的镜像存在问题,我们需要修改Dockerfile文件里的数据库的地址,我们需要删除它,此处有几种做法

    • 删除原本有问题的镜像,重新构建一个新镜像
    • 重新构建一个不同 name、tag 的新镜像

    删除原本的有问题的镜像,-f 是强制删除及其关联状态

    若不执行 -f,你需要执行 docker ps -a 查到所关联的容器,将其 rm 解除两者依赖关系

    docker rmi -f gin-gorm-docker
    
    • 1

    2、修改配置文件

    将项目的配置文件 conf/app.ini,内容修改为

    #debug or release
    RUN_MODE = debug
    
    [app]
    PAGE_SIZE = 10
    JWT_SECRET = 233
    
    [server]
    HTTP_PORT = 8080
    READ_TIMEOUT = 60
    WRITE_TIMEOUT = 60
    
    [database]
    TYPE = mysql
    USER = root
    PASSWORD = 123456
    //IP地址为 容器名称:端口号
    HOST = mysql:3306
    NAME = blog
    TABLE_PREFIX = blog_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3、重新构建镜像

    重复先前的步骤,回到 gin-gorm 的项目根目录下执行

    docker build -t gin-gorm-docker .
    
    • 1

    4、创建关联并运行一个新容器

    我们如何将项目容器和MySQL容器创建关联?

    在run指令内增加命令 –link mysql:mysqlGolang 容器与 Mysql 容器互联;通过 –link,可以在容器内直接使用其关联的容器别名进行访问,而不通过 IP,但是–link只能解决单机容器间的关联,在分布式多机的情况下,需要通过别的方式进行连接。

    执行命令

    docker run --link mysql:mysql -p 8080:8080 gin-gorm-docker
    
    • 1

    在这里插入图片描述
    MySQL容器的数据库也成功自动创建了三个数据表。
    在这里插入图片描述

    我们测试一下数据库是否已经关联,用户登录测试网址:http://localhost:8080/auth?username=admin&password=123456
    在这里插入图片描述
    大功告成!

  • 相关阅读:
    【stack】【queue】【priority_queue】【deque】详解
    解决 VSCode 配置远程连接,过程试图写入的管道不存在
    计算机专业,不擅长打代码,考研该怎么选择?
    第一范式&第二范式&第三范式学习笔记
    在Github上封神的JDK源码,看完竟吊打了面试官,厉害了
    [AugSeg笔记] 半监督语义分割--基于cutmix改进的自适应注入标记增强方法
    代码 Revert 后再次 Merge 会丢失的问题,已解决
    机器学习代码问题总结
    R语言绘制不同颜色的带观测次数的条形图
    在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家
  • 原文地址:https://blog.csdn.net/weixin_46618592/article/details/126333707