Docker(三)实战:-Docker部署Golang项目并关联Mysql容器

2023-11-17

前言

友情提示
本文学习需要了解一些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

2、配置

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

[database]
Type = mysql
User = 数据库名称
Password = 数据库密码
//数据库的IP地址
Host = 127.0.0.1:3306
//数据库名称 
Name = blog
TablePrefix = blog_

二、编写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、作用

  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>",... "<目标路径>"]

4)RUN

用于执行命令行命令

格式:RUN <命令>

5)EXPOSE

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

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

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

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

6)ENTRYPOINT

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

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

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

三、构建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

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

用run指令创建并运行容器

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

说明:
–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

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_

3、重新构建镜像

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

docker build -t gin-gorm-docker .

在这里插入图片描述

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

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

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

执行命令

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

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

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

八、持久化数据库

我们在每次启动一个 Mysql 容器时,数据库都是空的。另外容器删除之后,数据就丢失了。
我们学习了Docker Volume卷技术,了解了如何将数据生命周期独立于容器的生命周期之外,来更新一下我们的Mysql容器吧!

Docker Volume文章:https://blog.csdn.net/weixin_46618592/article/details/126591142?spm=1001.2014.3001.5501

1、数据卷

数据卷 是被设计用来持久化数据的,数据卷的生命周期独立于容器的生命周期,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用。
  • 对数据卷的修改会立马生效。
  • 对数据卷的更新,不会影响镜像。
  • 数据卷默认会一直存在,即使容器被删除。

注意:
数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

2、如何挂载?

  1. 首先创建一个目录用于存放数据卷;示例目录 E:/home/docker-mysql。
docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v E:/home/docker-mysql:/var/lib/mysql mysql:5.7

在这里插入图片描述

  1. 检查目录 E:/home/docker-mysql,多了很多数据库文件。

在这里插入图片描述

3、验证

  1. 新建一个blog数据库,并启动我们的gin-gorm-docker容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 登录验证一下:http://localhost:8080/auth?username=admin&password=123456

在这里插入图片描述

  1. 用我们的token,去新增tags数据表的记录
    http://localhost:8080/api/v1/tags?token=(登录后拿到的token)&name=linzy&state=1&created_by=linzy

在这里插入图片描述
在这里插入图片描述
4. 删除MySQL容器,在重新用镜像启动

# 查看容器列表
E:\goWorkspace\github.com\Gopherlinzy\gin-gorm-example>docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                               NAMES
e57733001baa   gin-gorm-docker   "./go-gin-example"       7 minutes ago    Up 7 minutes    0.0.0.0:8080->8080/tcp              beautiful_curran
c44788bd68d4   mysql:5.7         "docker-entrypoint.s…"   35 minutes ago   Up 21 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

# 停止正在运行的MySQL容器
E:\goWorkspace\github.com\Gopherlinzy\gin-gorm-example>docker stop c44788bd68d4
c44788bd68d4

# 删除MySQL容器
E:\goWorkspace\github.com\Gopherlinzy\gin-gorm-example>docker rm c44788bd68d4
c44788bd68d4

# 重新将容器挂载到原来的目录
E:\goWorkspace\github.com\Gopherlinzy\gin-gorm-example>docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v E:/home/docker-mysql:/var/lib/mysql mysql:5.7
2de27acad62b21693c79cc0687453ae2c7cb3d0f8f1f478c8715303afcdf497a

在这里插入图片描述

在这里插入图片描述

验证完毕,你也可以操作一下:创建一些测试表和数据,然后删除当前容器,重新创建的容器,数据库数据也依然存在(当然了数据卷指向要一致)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker(三)实战:-Docker部署Golang项目并关联Mysql容器 的相关文章

  • 如何从主机连接到 Docker Postgres 容器

    我按照以下说明搭建了一个 Rails 开发环境https docs docker com compose rails https docs docker com compose rails 它可以工作 但我无法从主机连接到 Postgres
  • 无法在 Google Cloud Run 上部署 Ubuntu 20.04 Docker 容器

    我正在尝试通过 Google Cloud Run 部署一个基于 Ubuntu 20 04 的简单的基于 Python 的 Docker 容器 我已经成功构建了映像 但是当我尝试部署 Cloud Run 服务时 出现以下错误 省略了项目详细信
  • Nginx - Heroku Docker - 是否可以在 Heroku 上运行 Nginx 作为反向代理

    我试图弄清楚如何使用 Nginx 在 Heroku 应用程序上构建反向代理 问题是 Heroku 似乎每个应用程序只接受一个容器 但我的应用程序系统至少会使用三个容器 一个用于 Nginx 一个用于我的应用程序前端 一个用于我的业务逻辑服务
  • 在 Flask 应用程序中设置和检索环境变量

    我想使用 python3 flask 构建一个非常简单的 REST api 比如说我想设置我的SECRET KEY要求由flask作为环境变量 推荐的方法是什么 我知道python dotenv允许 或者我应该说requires the f
  • 使用 tc 限制 Docker 容器的传出网络带宽

    我正在尝试对 Docker 容器进行带宽限制 为了限制下行带宽 我可以先找到容器的veth接口并使用tc tc qdisc add dev vethpair1 root tbf rate 1mbit latency 50ms burst 1
  • 无法使用 Docker 运行 Strapi

    我正在尝试 Docker 化我的Strapi应用程序 所以首先在项目的根目录中我创建了一个 env文件包含以下内容 HOST 0 0 0 0 PORT 3002 然后 里面backend config server js I have mo
  • Docker EXPOSE 使用运行时环境变量

    我的 Dockerfile 设置了一些环境变量的默认值 然后公开了两个应该是提供的环境变量的端口 FROM python 3 6 5 stretch ENV MY SERVICE PORT 8080 ENV MY SERVICE PORT
  • 如何使用 Compose 创建具有用户定义的 IP 和 MAC 地址的 Docker macvlan

    我有一个使用 MAC 地址执行硬件许可证的 Docker 项目 我无法更改此设置 ISV 使用包含 MAC 地址的硬件指纹 我正在尝试创建一个 macvlan 网络 它将使用物理适配器并从我的网络 DHCP 服务器获取 IP 地址 或者我将
  • 在 Mac OS X 上从 boot2docker 迁移到 Vagrant+NFS 的最快方法是什么?

    我有一个从官方 mysql 构建的数据库容器docker pull mysql 我有一个前端应用程序app用蛋糕建造 我有一个后端应用程序cms使用 Symfony 构建 我为两者都设置了容器链接app and cms自动启动并连接到db
  • /var/lib/docker/中docker目录结构的作用

    当我启动一个新的 docker 守护进程时 docker 目录如下 var lib docker aufs diff layers mnt containers graph init dockerinit 0 7 3 linkgraph d
  • 在docker中,存储驱动程序和支持文件系统有何不同?

    The docker info命令列出两个存储驱动程序 例如设备映射器和支持文件系统 例如XFS 这两个属性的含义是什么 它们有何不同 存储驱动程序 是docker用来管理存储的软件组件 这可能是其中之一overlay驱动程序 它使用ove
  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 使用 Docker 文件分配附加功能

    我需要部署 Docker 映像 但我只想使用 Docker run 命令而不使用其任何参数 我想在运行容器时分配特殊权限 这是我的 Docker 运行命令 docker run cap add SYS ADMIN cap add DAC R
  • 从镜像创建 Docker 容器而不启动它

    作为我的部署策略的一部分 我使用 Upstart 管理 Docker 容器 为此 我需要从注册表中提取图像并创建一个命名容器 如建议的那样 用于运行容器的新贵脚本不会管理生命周期 https stackoverflow com questi
  • FreeBSD 可以在 Docker 中运行吗?

    我一直在寻找一个Docker的图像FreeBSD但找不到 FreeBSD可以在docker中运行吗 如果没有 为什么不呢 从未来编辑 不 你不能 以下项目都没有超越原型 从技术上讲是可以的 但是你需要一个 FreeBSD 主机来完成它 而
  • Windows 上的 boot2docker 缺少 apt-get / 包管理器

    我在 boot2docker 中 我不确定我完全理解它 但它似乎是我正在进行的项目所需要的 我已经通过 ssh 登录了 并且尝试对我们的项目进行 make 但是我得到了 make not found 然后我尝试了一个 apt get ins
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • 如何使用 Docker 访问输出文件

    我正在编写一个 C 程序 并想在其上使用 Docker 这Dockerfile看起来像下面这样 FROM gcc 7 2 0 ENV MYP repo WORKDIR MYP COPY MYP RUN bin sh c make ENTRY
  • ECS相当于docker-compose的命令

    我有一个使用 docker compose 运行的应用程序 现在我正在将应用程序迁移到 ECS 上托管 我正在将 docker compose 设置转换为 boto3 ECS 等效项 不幸的是我没有找到相当于 docker compose

随机推荐