寫在前面
近期,組織了第三期暑期培訓,想想也有四個年頭。另外,分別給本科生和碩士生均分別講過一學期的生物信息數據分析課程,其中實踐部分,以往使用的是 VituralBox。好處在于可以完全模擬服務器環境,從硬件到軟件。而不好的地方在于,對應的環境幾乎只適合與學習或練習,無法直接使用到生產環境。
如此,即使學生掌握得再熟練,真正到生產環境時,也就是他們的服務器時,需要重新配置一次環境。盡管,conda等方式已經比較方便,但還是不夠方便。
基于此,我一直使用 docker 的想法。經過一年左右的籌備,終于還是下定決定使用 docker 環境作為學生聯系。此舉最大好處在于:
- 跨平臺,無論是Windows、MacOS、Linux均可以直接使用
- 鏡像可以遷移到不同環境
- 計算集群可以使用安裝的 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 的優勢:
- 在使用Singurlity過程下,幾乎是沒有使用到權限。方便了集群普通用戶使用已經打包好的沙盒/鏡像文件。Docker不管是安裝、使用、修改都必須要有權限。
- 進入Singurlity 的環境,并沒有封閉的空間。因此不需要提前映射本機路徑,再進入環境。
- 沒有容器的說法,只有可寫的沙盒(sandbox)/不可寫的鏡像(sif),便于傳輸分發。
寫在最后
感覺不錯,一直想折騰的事情也確定可行了。