涉及知识点
- Go + Docker
本文目标
go-gin-exampledockerDocker
在这里简单介绍下 Docker,建议深入学习
image
Docker 是一个开源的轻量级容器技术,让开发者可以打包他们的应用以及应用运行的上下文环境到一个可移植的镜像中,然后发布到任何支持 Docker 的系统上运行。 通过容器技术,在几乎没有性能开销的情况下,Docker 为应用提供了一个隔离运行环境
- 简化配置
- 代码流水线管理
- 提高开发效率
- 隔离应用
- 快速、持续部署
dockerGolang
一、编写 Dockerfile
go-gin-example作用
golang:latest$GOPATH/src/go-gin-example$GOPATH/src/go-gin-examplego build./go-gin-examplego-gin-exampledocker说明
Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像
你可以认为用于快速创建自定义的 Docker 镜像
1、 FROM
指定基础镜像(必须有的指令,并且必须是第一条指令)
2、 WORKDIR
WORKDIRWORKDIRWORKDIR3、COPY
格式:
COPY4、RUN
用于执行命令行命令
RUN5、EXPOSE
EXPOSEEXPOSE在 Dockerfile 中写入这样的声明有两个好处
docker run -PEXPOSE6、ENTRYPOINT
ENTRYPOINTRUNexecshellENTRYPOINT二、构建镜像
go-gin-exampledocker build -t gin-blog-docker .-tgin-blog-docker.三、验证镜像
gin-blog-docker四、创建并运行一个新容器
docker run -p 8000:8000 gin-blog-docker运行成功,你以为大功告成了吗?
dial tcp 127.0.0.1:3306: connect: connection refusedMysqlMysql
一、拉取镜像
DockerDockerhubMySQL二、创建并运行一个新容器
Mysql连接 Mysql
MysqlGolang + Mysql
一、删除镜像
由于原本的镜像存在问题,我们需要删除它,此处有几种做法
nametag-f-fdocker ps -arm二、修改配置文件
conf/app.ini三、重新构建镜像
gin-blogdocker build -t gin-blog-docker .四、创建并运行一个新容器
关联
GolangMysql--link mysql:mysqlGolangMysql--link--link运行
docker run --link mysql:mysql -p 8000:8000 gin-blog-docker结果
GolangMysqlReview
思考
虽然应用已经能够跑起来了
GolangDockergin-blog-dockerdocker ps -as | grep gin-blog-dockerMysql创建超小的 Golang 镜像
Q:第一个问题,为什么这么镜像体积这么大?
FROM golang:latestgolang这是有问题的,我们可以不在 Golang 容器中现场编译的,压根用不到那些东西,我们只需要一个能够运行可执行文件的环境即可
构建 Scratch 镜像
Scratch 镜像,简洁、小巧,基本是个空镜像
一、修改 Dockerfile
二、编译可执行文件
scratch三、构建镜像
注意,假设你的 Golang 应用没有依赖任何的配置等文件,是可以直接把可执行文件给拷贝进去即可,其他都不必关心
这里可以有好几种解决方案
- 依赖文件统一管理挂载
- go-bindata 一下
...
COPY四、运行
成功运行,程序也正常接收请求
docker ps -asScratchMysql 挂载数据卷
Mysql数据卷
docker rm -v数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。
如何挂载
/data/docker-mysql--namemysqldocker rm/data/docker-mysql验证
接下来交由你进行验证,目标是创建一些测试表和数据,然后删除当前容器,重新创建的容器,数据库数据也依然存在(当然了数据卷指向要一致)
我已验证完毕,你呢?
参考
本系列示例代码
- go-gin-example
书籍
- Docker —— 从入门到实践