本文目錄一覽:
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里的寫法
問題解決,開心:)
參考資料:
原創文章,作者:EIGA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133716.html