本文目录一览:
docker联合文件系统
(Union filesystem)联合文件系统允许我们把多个文件系统逻辑上合并成一个文件系统,组成Union filesystem的文件系统不必相同(它们可以是ext2/3/4,vfat,ntfs,jffs...)。overlay是联合文件系统的一种(aufs...),overlay文件系统构建于其他文件系统之上,overlay其实更像是个挂载系统(mount system),功能是把不同的文件系统挂载到统一的路径。
overlay是个分层的文件系统,底层文件系统通常叫 lower ,顶层文件系统系统通常叫 upper ,两者通常合并挂载到 merged 目录,最终用户看到的就是 merged 中的文件。
lower 文件系统是readonly,对 merged 中所有的修改都只对 upper 操作,记住这点很重要。下面我们在linux上创建一个overlay文件系统,用以说明overlay文件系统挂载,文件读写,文件新增和删除。
创建 lower upper merged work 目录,把 lower和upper 挂载到 merged , work 是空目录,必须和 merged 的文件系统类型一样。
挂载: sudo mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work merged/ ,挂载后 merged 目录结构如下:
可以看到 lower 和 upper 中的文件合并到了 merged 中,当 lower 和 upper 有相同路径的文件时, merged 中只显示 upper 中的。也就是说 upper 会遮住 lower 中同名的文件(同路径下)。
overlay提供了对只读文件系统的读写功能,适合用在需要维持一个只读镜像,又需要提供读写功能的系统中,比如openwrt和docker,下面我们介绍docker中overlay的应用。
docker的基础镜像其实就是个readonly的根文件系统,从基础镜像构建的镜像其实都只是把修改部分和基础镜像合并重新打包,我们从ubuntu镜像构建一个具有golang环境的镜像,用来说明overlay在docker中的应用。
Dockerfile 如下:
构建镜像
启动容器
查看容器
查看GraphDriver
从上面可以看到docker采用的是overlay2文件系统,LowerDir有多层。
/var/lib/docker/overlay2/1d65e86e54373a5b01afe28d0878a953fa2e9eb7cd14552a17d4a8628b476978/diff
/var/lib/docker/overlay2/b56e1dd54abdf8300b2f9726e3e92d3b32b78c8bf5b5cd807e27be78c671af40/diff
/var/lib/docker/overlay2/44c045232b8f3510d28965fbebcaad458263855785cc38e1a784a6731df7433d/diff
为什么会有这么多层,其实很好理解,查看Dockerfile中写了哪些规则:
现在我们核对下最地城镜像是否是ubuntu的镜像文件:
ubuntu是基础镜像,没有LowerDir, UpperDir就是我新建ubuntu:golang镜像LowerDir的最底层文件系统
Go语言安装与镜像配置
安装网址
国内镜像
Go 1.13 及以上(推荐
打开你的终端并执行
macOS 或 Linux
或
如果是zsh
请这样设置
Windows
打开PowerShell 并执行
或者
然后你就可以
Golang项目部署3,容器部署
容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。
跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。
使用以下指令可以静态编译 Linux 平台 amd64 架构的可执行文件:
生成的 main 便是我们静态编译的,可部署于 Linux amd64 上的可执行文件。
我们需要将该可执行文件 main 编译生成 docker 镜像,以便于分发及部署。 Golang 的运行环境推荐使用 alpine 基础系统镜像,编译出的容器镜像约为 20MB 左右。
一个参考的 Dockerfile 文件如下:
其中,我们的基础镜像使用了 loads/alpine:3.8 ,中国国内的用户推荐使用该基础镜像,基础镜像的 Dockerfile 地址: ,仓库地址:
随后使用 " docker build -t main . " 指令编译生成名为 main 的 docker 镜像。
需要注意的是,在某些项目的架构设计中, 静态文件 和 配置文件 可能不会随着镜像进行编译发布,而是分开进行管理和发布。
例如,使用 MVVM 模式的项目中(例如使用 vue 框架),往往是前后端非常独立的,因此在镜像中往往并不会包含 public 目录。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的项目中,也往往并不需要 config 目录。
因此对于以上示例的 Dockerfile 的使用,仅作参考,根据实际情况请进行必要的调整。
使用以下指令可直接运行刚才编译成的镜像:
容器的分发可以使用 docker 官方的平台: ,国内也可以考虑使用阿里云: 。
在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。
容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:
golang编写的项目,使用alpine制作镜像遇到的一个问题解决
GraphicsMagick,一款高性能的图片处理工具,由于项目需要,用到它,自然而然用到了关于gm的第三方库 这个库按照作者的提示,要安装GraphicsMagick-devel依赖。
项目写完了,接下来用alpine做为基础镜像,准备制作项目的镜像。
golang项目,是在ubuntu下编写的,编译成二进制文件了,只要把二进制文件放进镜像里即可,遇到的问题有2个
1 容器跑起来,一直报二进制文件no found
我认认真真的确认了文件,以及它的路径,确实是存在的,怎么会报文件找不到呢?!
原来是musl和glibc是兼容的问题,在Dockerfile里要加以下两步
2 Error loading shared library libGraphicsMagickWand-Q16.so.2: No such file or directory
明明按要求安装GraphicsMagick-devel依赖,为啥还报这种错
于是想到了,是不是也要ln做一下软链接呢?于是学着上面的样子在Dockerfile里补上
再跑,问题依旧,莫非是软连接的地址写错了!回到开发的电脑上用ldd命令查看一下
果然,编译后的二进制文件依赖路径是/lib,而不是/lib64
于是,修改Dockerfile里的写法
问题解决,开心:)
参考资料: