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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像

前言


友情提示

本文学习需要了解一些Linux简单命令和Docker的一些命令

使用的项目我已经上传到github:https://github.com/Gopherlinzy/gin-gorm-example

个人博客:https://linzyblog.netlify.app/

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


我自己写了一个简单的gin-gorm项目,github下载地址:https://github.com/Gopherlinzy/gin-gorm-example

7ea28fc47db64fdf883787f006356728.png


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,. 构建内容为当前上下文目录


3f8f4349572844deb13d0a9a661017af.png


四、验证镜像


查看所有的镜像,确定刚刚构建的 gin-gorm-docker 镜像是否存在


34531df7869c4e798dd437fbbf49bcb3.png


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


执行命令 docker run -p 8080:8080 gin-gorm-docker


cc8d000e393c4587a945ec55d01003d8.png


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


5e68122e2d5745baa86b03d26dd2beb3.png


运行成功了么?


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


b3a0e9159e81490cae1be5efc4ad5261.png


我们仔细看看控制台的输出了一条错误


a887f67e60184603b5e0e9b06a4eb6e8.png


我们可以发现问题是在访问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。


be72b7977fc8457f9b1e4366cc2b1190.png


初始化的 Mysql 应该如图


d010e3f230374d01afa576ef46b80925.png


创建我们的blog数据库,后续测试需要


178ee9afd37b46dcbab1a89353eb41cb.png


七、关联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 .

b60e3db6061a4ec89074a6160351bfaa.png


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


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


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


执行命令


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

9dc8ec915698445385055d52729b788c.png


MySQL容器的数据库也成功自动创建了三个数据表。


ef50491c8f2f4bd6917f144ea7ab66f4.png


我们测试一下数据库是否已经关联,用户登录测试网址:http://localhost:8080/auth?username=admin&password=123456


9d5d4c4379b845ae8bf01c9eb4dd6645.png


大功告成!


八、持久化数据库


我们在每次启动一个 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

7cdcb282cc96423bbd38601fadc914b2.png


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


327f392aa39b4cae813729d6ea0fd497.png


3、验证


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


b9ab4f3c0dc04a90b95a085df0c03c48.png


a8194ca3c122445a9fc9447d1b8f95fa.png

2f2aea3ca7c84cc99d0c23422b5b8e7b.png



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


5f7d9a7c79b54b2e8944f514b6f0e090.png


3.用我们的token,去新增tags数据表的记录

http://localhost:8080/api/v1/tags?token=(登录后拿到的token)&name=linzy&state=1&created_by=linzy


46df34fc460c48aeb1c928e3433dbee9.png

68689b1790ad4e35b7d99a3e34746b15.png


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

dea1bca7b4af47ffb46ffa0d725ac3ec.png


aeeb6eeeb910493cb7f47f85c1493840.png


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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
8月前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
218 7
深入理解Docker:为你的爬虫项目提供隔离环境
|
12月前
|
运维 网络安全 持续交付
IDEA+Docker 远程一键部署项目:技术干货分享
【10月更文挑战第4天】在现代软件开发中,快速、可靠、自动化的部署流程是提升开发效率和运维质量的关键。IDEA(IntelliJ IDEA)作为Java开发者首选的IDE,结合Docker这一轻量级容器化技术,能够实现远程一键部署项目,极大地简化了开发到生产的流程。今天,我将和大家分享这一组合在工作学习中的实际应用和技术干货。
905 3
|
7月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
695 1
|
10月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
232 3
实战~如何组织一个多容器项目docker-compose
|
9月前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8
|
11月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
1807 10
|
12月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
2153 3
|
12月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
363 3
|
11月前
|
人工智能 Anolis 开发者
|
3月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
264 57