進階 | 本地「Docker」鏡像轉換為「Singularity」鏡像,直接運行于任何服務器~

寫在前面

近期,組織了第三期暑期培訓,想想也有四個年頭。另外,分別給本科生和碩士生均分別講過一學期的生物信息數據分析課程,其中實踐部分,以往使用的是 VituralBox。好處在于可以完全模擬服務器環境,從硬件到軟件。而不好的地方在于,對應的環境幾乎只適合與學習或練習,無法直接使用到生產環境。
如此,即使學生掌握得再熟練,真正到生產環境時,也就是他們的服務器時,需要重新配置一次環境。盡管,conda等方式已經比較方便,但還是不夠方便。
基于此,我一直使用 docker 的想法。經過一年左右的籌備,終于還是下定決定使用 docker 環境作為學生聯系。此舉最大好處在于:

  1. 跨平臺,無論是Windows、MacOS、Linux均可以直接使用
  2. 鏡像可以遷移到不同環境
  3. 計算集群可以使用安裝的 singularity 來使用 docker 鏡像

有了這些為基礎,只要學生掌握課程上的內容,那么課程相關鏡像,完全直接用于他們個人電腦、服務器甚至計算集群上。
前述,關于 docker 已經做了不少介紹,感興趣的朋友可以翻看往期推文。今次,主要介紹,如何將自己創建的 docker 鏡像轉換為 singularity 鏡像,以及轉換之后,如何使用。

docker 鏡像轉換為 singularity 鏡像

準備一個本地的 docker 鏡像

為了方便演示,首先,建立本地的 docker 倉庫服務(用的也是 docker),注意:如果是windows,那么需要在 wsl2 中安裝好 docker 后執行。

sudo docker pull centos:7
sudo docker run -it centos:7 #進入,exit可以退出環境

#查看docker已有的鏡像
sudo docker images
#REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
#centos       7         eeb6ee3f44bd   9 months ago   204MB
利用docker官方提供的registry鏡像,搭建本地docker倉庫鏡像服務
sudo docker pull registry

#查看本地ip
ip addr
#ip為127:0:0:1

在docker內配置適用的ip

sudo vim /etc/docker/daemon.json

#補充以下信息/ 修改成個人的ip/ 
{
"insecure-registries": ["127.0.0.1:5000"]
}

#重新啟動docker
sudo service docker stop
sudo service docker start
 
sudo docker info #查看下圖

將本地的 docker 鏡像上傳到 本地的 docker 鏡像倉庫(有點繞,事實上,此處就是通過構建本地鏡像倉庫來替代 hub.docker.com 官方提供的倉庫服務)

sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
#查看是否建好倉庫
sudo docker ps

#設置上傳鏡像的tag
sudo docker tag centos:7 127.0.0.1:5000/centos:7
 
#上傳到本地倉庫
sudo docker push 127.0.0.1:5000/centos:7
 
#查看倉庫的鏡像
curl http://127.0.0.1:5000/v2/_catalog
使用 singularity 轉換鏡像為 docker 鏡像
#從本地倉庫轉化成sif鏡像
singularity build --no-https  mycentos.sif  docker://127.0.0.1:5000/centos:7

如此,輸出的 mycentos.sif 即可用于分發。到任何生產環境,服務器或者集群,只需要

#轉成可寫讀的sandbox
singularity build --sandbox ./centos centos_centos7.9.2009.sif
#進入centos
singularity shell -w centos
實例:導入xialab2022暑期培訓docker鏡像

根據上述的措施/先load -i 本地docker鏡像后,再上傳到本地倉庫,再被singularity轉換為sif鏡像文件。學生只需要下載培訓期間提供的scauclass.sif文件,即可用于個人服務器或集群

#轉換為sandbox
singularity build --sandbox  ./scauclass  scauclass.sif
#測試
singularity run scauclass conda --help

當然,可能需要注意的是暑期培訓鏡像有conda環境,幾乎所有軟件都是建立在conda環境下。
接下來我們需要解決怎么調用scauclass鏡像的conda環境?

singularity run scauclass conda info -e

是不能夠直接激活,需要進行conda init


#進入scauclass
singularity shell -w scauclass
#進入鏡像
Singularity> conda init
Singularity> source .bashrc

接下來就可以隨意玩耍了

conda activate xiasmallrna

接下來當然是檢查一下conda環境下的軟件可行與否?


exit
Singurlity 的優勢:
  1. 在使用Singurlity過程下,幾乎是沒有使用到權限。方便了集群普通用戶使用已經打包好的沙盒/鏡像文件。Docker不管是安裝、使用、修改都必須要有權限。
  2. 進入Singurlity 的環境,并沒有封閉的空間。因此不需要提前映射本機路徑,再進入環境。
  3. 沒有容器的說法,只有可寫的沙盒(sandbox)/不可寫的鏡像(sif),便于傳輸分發。

寫在最后

感覺不錯,一直想折騰的事情也確定可行了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容