【docker】拉取一個基礎鏡像然後製作自己的鏡像並複用

今天下午,我再一次地被部署一個模型時因爲沒有網絡而導致的複雜無比的環境依賴而折騰的手忙腳亂。因此,我覺得必須要把docker的基本操作路線打通一下了。

軟件環境
docker:19.03.8
操作系統:CentOS7

1. 問題說明

我用python寫了一個簡單的算法服務,要部署到linux操作系統下,需要用到很多依賴包。爲了簡便起見,可以將這個算法服務打包成docker鏡像,然後發佈。這樣只需要配置好了docker環境,做好端口映射,基於該鏡像啓動容器即可調用。

2. Step-by-step

2.1 拉取一個基礎操作系統

我的理解是,python環境要基於一個操作系統而運行。這就好比必須要有水,船才能行駛。對於python的“水”,我選擇了ubuntu。當然也可以選擇linux的其他發行版本,這裏不做討論。

拉取的操作是非常簡單的,也不會有問題:

docker pull ubuntu

拉取成功之後,可以查看一下:

docker images

2.2 基於鏡像啓動一個容器

我的docker是裝在centos虛擬機上的,虛擬機可以訪問網絡,爲了確保生成的容器可以訪問網絡,在執行docker run命令時,需要注意設置一下參數:

docker run -it --network host ubuntu /bin/bash

與一般的操作不同的是,這裏我指定了--network的值,這個參數的默認值是bridge,如果不加更改,在我的嘗試中容器內是無法訪問網絡的。參數值host的意思就是說,容器可以和其所在主機共用一個網絡。

2.3 從apt-get到conda

進入容器之後,就需要安裝python環境了。爲了方便python包管理,強烈建議利用conda!同時,爲了減小體積,建議安裝Miniconda。

如無意外,基礎的ubuntu鏡像裏面可連接網絡的就只有apt-get了,而這個命令是無法安裝conda的。所以,我們需要先安裝wget命令:

apt-get update  # 同步一下本地的包列表,這是一個良好的習慣。
apt-get install wget

安裝完wget之後,接着就可以從網絡上下載Miniconda的安裝包了(網絡真是個好東西啊):

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

Miniconda安裝包的路徑可以去官網找到,還有各種不同的python版本,就不多說明了。

這樣,下載的*.sh文件就出現在了當前路徑下。接下來是安裝:

sh Miniconda3-latest-Linux-x86_64.sh

按幾次回車,一路採用默認的設置就好。

安裝完成之後,可能需要重新生效一下配置文件(如果你沒有按照默認設置而是修改了conda的安裝路徑,那麼下面的路徑也可能改變,我沒試過,需要注意):

source /root/.bashrc

好了,至此,python環境就安裝好了,接下來就是安裝需要的第三方包,不管是用pip還是conda就隨心所欲吧,因爲聯網了(網絡真是個好東西啊!)。

2.4 生成鏡像

當我們在容器裏面的工作完成之後,輸入exit跳出容器,然後利用docker commit命令基於該容器生成一個新的鏡像:

docker commit -a "An author name" d23ss my-first-image 

當然,不指定-a也是沒有問題的。想了解每一個參數的意思,查看幫助文檔吧,這個命令很簡單。

2.5 鏡像到文件

最後一步,就是將鏡像保存爲文件:

docker save -o /a-python-base-image dsx21

-o指定了輸出文件的地址,dsx21是新生成的鏡像的唯一標識(實際上只是唯一標識的前幾位,只要能夠與其他鏡像區分,只取一位也是可以的。容器也是同理)。

3. 未完待續

上面羅列了大概的流程,當然不夠全面,有一些內容我沒寫,例如將鏡像文件從虛擬機裏面考到主機上,我覺得這個沒啥難度了。還有一些我準備下次再寫,就是端口映射問題。因爲這確實是個問題,我還沒有搞懂。

下一篇文章,我將用一個例子把這個流程走通,即:在容器內利用flask部署一個服務,容器外進行GET/POST請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章