涉及知识点

  • Go + Docker

本文目标

go-gin-example
docker

Docker

在这里简单介绍下 Docker,建议深入学习



image

Docker 是一个开源的轻量级容器技术,让开发者可以打包他们的应用以及应用运行的上下文环境到一个可移植的镜像中,然后发布到任何支持 Docker 的系统上运行。 通过容器技术,在几乎没有性能开销的情况下,Docker 为应用提供了一个隔离运行环境

  • 简化配置
  • 代码流水线管理
  • 提高开发效率
  • 隔离应用
  • 快速、持续部署

docker

Golang

一、编写 Dockerfile

go-gin-example

作用

golang:latest$GOPATH/src/go-gin-example$GOPATH/src/go-gin-example
go build./go-gin-example
go-gin-exampledocker

说明

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

你可以认为用于快速创建自定义的 Docker 镜像

1、 FROM

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

2、 WORKDIR

WORKDIR
WORKDIRWORKDIR

3、COPY

格式:

COPY

4、RUN

用于执行命令行命令

RUN

5、EXPOSE

EXPOSE
EXPOSE

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

docker run -PEXPOSE

6、ENTRYPOINT

ENTRYPOINTRUN
exec
shell
ENTRYPOINT

二、构建镜像

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 refused
Mysql

Mysql

一、拉取镜像

DockerDockerhubMySQL

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

Mysql

连接 Mysql

Mysql

Golang + 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

结果

GolangMysql

Review

思考

虽然应用已经能够跑起来了

GolangDocker
gin-blog-dockerdocker ps -as | grep gin-blog-dockerMysql

创建超小的 Golang 镜像

Q:第一个问题,为什么这么镜像体积这么大?

FROM golang:latestgolang

这是有问题的,我们可以不在 Golang 容器中现场编译的,压根用不到那些东西,我们只需要一个能够运行可执行文件的环境即可

构建 Scratch 镜像

Scratch 镜像,简洁、小巧,基本是个空镜像

一、修改 Dockerfile
二、编译可执行文件
scratch
三、构建镜像

注意,假设你的 Golang 应用没有依赖任何的配置等文件,是可以直接把可执行文件给拷贝进去即可,其他都不必关心

这里可以有好几种解决方案

  • 依赖文件统一管理挂载
  • go-bindata 一下

...

COPY
四、运行

成功运行,程序也正常接收请求

docker ps -as
Scratch

Mysql 挂载数据卷

Mysql

数据卷

docker rm -v

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

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

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

如何挂载

/data/docker-mysql--namemysqldocker rm
/data/docker-mysql

验证

接下来交由你进行验证,目标是创建一些测试表和数据,然后删除当前容器,重新创建的容器,数据库数据也依然存在(当然了数据卷指向要一致)

我已验证完毕,你呢?

参考

本系列示例代码

  • go-gin-example

书籍

  • Docker —— 从入门到实践