進(jìn)階 | 本地「Docker」鏡像轉(zhuǎn)換為「Singularity」鏡像,直接運行于任何服務(wù)器~

寫在前面

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

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

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

docker 鏡像轉(zhuǎn)換為 singularity 鏡像

準(zhǔn)備一個本地的 docker 鏡像

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

sudo docker pull centos:7
sudo docker run -it centos:7 #進(jìn)入,exit可以退出環(huán)境

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

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

在docker內(nèi)配置適用的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 鏡像倉庫(有點繞,事實上,此處就是通過構(gòu)建本地鏡像倉庫來替代 hub.docker.com 官方提供的倉庫服務(wù))

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

#設(shè)置上傳鏡像的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 轉(zhuǎn)換鏡像為 docker 鏡像
#從本地倉庫轉(zhuǎn)化成sif鏡像
singularity build --no-https  mycentos.sif  docker://127.0.0.1:5000/centos:7

如此,輸出的 mycentos.sif 即可用于分發(fā)。到任何生產(chǎn)環(huán)境,服務(wù)器或者集群,只需要

#轉(zhuǎn)成可寫讀的sandbox
singularity build --sandbox ./centos centos_centos7.9.2009.sif
#進(jìn)入centos
singularity shell -w centos
實例:導(dǎo)入xialab2022暑期培訓(xùn)docker鏡像

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

#轉(zhuǎn)換為sandbox
singularity build --sandbox  ./scauclass  scauclass.sif
#測試
singularity run scauclass conda --help

當(dāng)然,可能需要注意的是暑期培訓(xùn)鏡像有conda環(huán)境,幾乎所有軟件都是建立在conda環(huán)境下。
接下來我們需要解決怎么調(diào)用scauclass鏡像的conda環(huán)境?

singularity run scauclass conda info -e

是不能夠直接激活,需要進(jìn)行conda init


#進(jìn)入scauclass
singularity shell -w scauclass
#進(jìn)入鏡像
Singularity> conda init
Singularity> source .bashrc

接下來就可以隨意玩耍了

conda activate xiasmallrna

接下來當(dāng)然是檢查一下conda環(huán)境下的軟件可行與否?


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

寫在最后

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容