如何獲取目標軟件的Docker鏡像
1、服務相關術語

術語
介紹
備注
鏡像
類似于操作系統的快照,比如ghost系統光盤。
若無特殊說明,都是指docker鏡像
dockerFile
制作Docker鏡像的描述文件
2、Docker容器
Docker 出現之前,你要安裝一個軟件,你需要下載軟件包,下載該軟件所的庫文件,編譯,安裝,配置,最終讓該軟件跑起來。一旦中間有個步驟出錯,還需從頭再來。本來想搞業務,卻不得不先面對各種環境調試安裝,痛苦之處可想而知。
而用了 Docker 之后,你只需要pull一個鏡像,run一個容器,你的軟件就跑起來。所有的依賴,都在鏡像里幫你做好了,你完全不用care這個軟件怎么安裝的,只需要會用就行了。
Docker容器技術使得應用程序可以在幾乎任何地方以相同的方式運行。開發人員在自己筆記本上創建并測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理服務器或公有云主機上運行。
它可以很好的解決測序軟件的各種版本運行在各種環境下的問題。比如,同一個VM上同時運行兩個不同版本的GATK軟件。這在傳統的VM模型中是不具備的,這就給基因測序構建復雜業務場景,提供了便捷性。因為環境如果損壞,可以通過容器技術,輕松的恢復。
2.1、Docker容器鏡像
Docker鏡像和Docker容器的關系,就像軟件和進程的關系。跑起來叫容器,還沒跑的文件叫鏡像。
一個Docker鏡像是運行一個軟件所需要所有依賴的最小集。并不需要將整個OS系統放入鏡像,所以Docker鏡像相比VM鏡像,會小很多。
2.2 如何獲取一個軟件對應的Docker鏡像
要獲取一個軟件對應的Docker鏡像,并不一定需要自己制作。有很多方式來獲得一個Docker鏡像:
首先就是從DockerHub倉庫搜索
然后可以Google搜索一下軟件名+docker關鍵字,也許會有Github倉庫收錄
再不然可以自己制作,自己制作鏡像又分兩個門派。快照派 vs? DockerFile派
最后就是求助華為容器鏡像團隊,協助幫忙制作啦。
下面我們分別介紹各個方法。
3、從DockerHub搜索
作為全球最大的Docker鏡像中心,DockerHub網站提供了40萬+的各類軟件的公開Docker鏡像下載,并以每周5K的速度在持續增長。所以除了是你自己開發的軟件,一般都可以在這里找到對應的鏡像版本。https://hub.docker.com/
舉例來說,我們需要 bwa軟件的鏡像,可以搜索得到:
選擇需要的軟件版本就可以了。
PS:有以下幾類軟件,我們推薦從DockerHub獲取,而不是自己制作的。
3.1?基礎運行OS環境
像Ubuntu,Suse,Centos等這類基礎OS類的鏡像,我們建議直接從DockerHub獲取官方認證版的。
3.2?基礎編程語言類
像Java,Python,R語言,Golang等這類基礎編程語言類的鏡像,我們也建議直接從DockerHub獲取官方認證版的。
3.3?基礎通用類軟件
像Tomcat,Mysql,Ngnix等這類常見的通用類的軟件,我們也建議直接從DockerHub獲取官方認證版的。
4、從Google搜索
基礎運行OS環境雖然DockerHub可以搜索解決80%軟件的問題。不過有些軟件如果位于第三方的鏡像倉庫中,我們可以通過Google搜索來查找相關鏡像。只需要把軟件名加上docker關鍵就可以。比如:
可以看到,一般排第一個的也就是DockerHub倉庫。
5、自己制作Docker鏡像
自己制作Docker鏡像,主要有兩種:
找一個干凈的基礎鏡像,比如Ubuntu,然后登陸系統里面把軟件安裝上。然后整體打個快照,就擁有了想要的軟件的Docker鏡像。這個就跟Ghost光盤一樣。
第二種就是把軟件安裝的流程寫成DockerFile,使用Docker build構建。
兩個的構建原理是一樣的,可以理解為第二種是對第一種的自動化。
5.1 打快照方式獲得鏡像(偶爾制作的鏡像)
示例圖如上,具體操作:
找一臺主機,安裝好Docker
啟動一個空白的基礎容器,并進入容器。比如啟動一個 CentOS的容器。docker run -it centos.
執行安裝任務。敲你平常敲的那些
退出容器。exit:退出容器
給剛才的容器,打個快照。docker commit -m "xx" -a "tsj" container-id tsj/image:tag
container-id : 剛才跑命令的容器id。可以使用 docker ps -a 查詢得到;
-m : 提交時的說明文字;
tsj/image:tag : 倉庫名/鏡像名:TAG名
最后通過 docker images 查看得到的Docker鏡像。
5.2??????Dockerfile方式構建(經常更新的鏡像)
上一步做鏡像的方法,如果后續鏡像都不變化,還行。如果經常要換(比如某個軟件更新版本),那么你打鏡像得累死。因為每變一次你就得重新執行那么多命令。
這時就需要使用自動化打鏡像的方法。
就是把第一種打鏡像的方法,用文件寫出來(這個文件叫做DockerFile)。?然后執行:
docker build -t tsj/image:tag
命令,它就自動完成鏡像制作了。
簡單的DockerFile舉例:
#Version 1.0.1
FROM centos:latest
MAINTAINER ***u?"***u@163.com"
#設置root用戶為后續命令的執行者
USER root
#執行操作
RUN yum update -y
RUN yum install -y java
#使用&&拼接命令
RUN touch test.txt && echo?"abc"?>>abc.txt
#對外暴露端口
EXPOSE?80?8080?1038
#添加文件
ADD abc.txt /opt/
#添加文件夾
ADD /webapp /opt/webapp
#添加網絡文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#設置環境變量
ENV WEBAPP_PORT=9090
#設置工作目錄
WORKDIR /opt/
#設置啟動命令
ENTRYPOINT ["ls"]
#設置啟動參數
CMD ["-a",?"-l"]
#設置卷
VOLUME ["/data",?"/var/www"]
#設置子鏡像的觸發操作
ONBUILD?ADD?. /app/src
ONBUILD?RUN?echo?"on build excuted"?>> onbuild.txt
詳細的可以參考:https://docs.docker.com/engine/reference/builder/
或者《華為云容器倉庫SWR?最佳實踐》
5.3??????DockerFile基本語法
這里給出一些基礎的信息
FROM:
指定待擴展的父級鏡像(基礎鏡像)。除了注釋以外,在文件開頭必須是一個FROM指令,接下來的指令便在這個父級鏡像的環境中運行,直到遇到下一個FROM指令。通過添加多個FROM命令,可以在同一個Dockerefile文件中創建多個鏡像。
MAINTAINER:
RUN:
用來修改鏡像的命令,常用來安裝庫、程序以及配置程序。一條RUN指令執行完畢后,會在當前鏡像上創建一個新的鏡像層,接下來對的指令會在新的鏡像上繼續執行。RUN 語句有兩種形式:
RUN yum update:是在/bin/sh環境中執行的指令的命令
RUN ["yum", "update"]:直接使用系統調用exec來執行行。
RUN yum update && yum install nginx:使用&&符號將多條命令連接在同一條RUN語句中。
EXPOSE:
用來指明容器內進程對外開放的端口,多個端口之間使用空格隔開。運行容器時,通過參數-P(大寫)即可將EXPOSE里所指定的端口映射到主機上另外的隨機端口,其他容器或主機就可以通過映射后的端口與此容器通信。同時,我們也可以通過-p(小寫)參數將Dockerfile中EXPOSE中沒有列出的端口設置成公開的。
ADD:
向新鏡像中添加文件,這個文件可以是一個主機文件,也可以是一個網絡文件,也可以使一個文件夾。
?第一個參數:源文件(夾)。如果是相對路徑,它必須是相對于Dockerfile所在目錄的相對路徑。如果是URL,會先下載下來,再添加到鏡像里去。
?第二個參數:目標路徑。如果源文件是主機上zip或者tar形式的壓縮文件,Docker會先解壓縮,然后將文件添加到鏡像的指定位置。如果源文件是一個通過URL指定的網絡壓縮文件,則不會解壓。
VOLUME:
在鏡像里創建一個指定路徑(文件或文件夾)的掛載點,這個容器可以來自主機或者其它容器。多個容器可以通過同一個掛載點共享數據,即便其中一個容器已經停止,掛載點也仍熱可以訪問。
WORKDIR:
為接下來執行的指令指定一個新的工作目錄,這個目錄可以使絕對目錄,也可以是相對目錄。根據需要,WORKDIR可以被多次指定。當啟動一個容器時,最后一條WORKDIR指令所指的目錄將作為容器運行的當前工作目錄。
ENV:
設置容器運行的環境變量。在運行容器的時候,通過-e參數可以修改這個環境變量值,也可以添加新的環境變量:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...
CMD:
用來設置啟動容器時默認運行的命令。
ENTRYPOINT:
與CMD類似,也是用來指定容器啟動時的默認運行的命令。區別在于:運行容器時添加在鏡像之后的參數,對ENTRYPOINT是拼接,CMD是覆蓋。
? ENTRYPOINT [ "ls", "-l"]
? docker run centos ==> docker run centos ls -l
? docker run centos -a ==> docker run centos ls -l -a
? 我們在運行容器的時候可以通過--entrypoint來覆蓋Dockerfile中的指定:docker run gutianlangyu/test --entrypoint echo "hello world"
USER:
為容器的運行及接下來RUN、CMD、ENTRYPOINT等指令的運行指定用戶或UID。
ONBUILD:
觸發器指令。構建鏡像時,Docker的鏡像構建器會將所有的ONBUILD指令指定的命令保存到鏡像的元數據中,這些命令在當前鏡像的構建過程中并不會執行。只有心的鏡像使用FROM指令指定父鏡像為這個鏡像時,便會觸發執行。
?? 使用FROM以這個Dockerfile構建出的鏡像為父鏡像,構建子鏡像時:
???ONBUILD ADD . /app/src:自動執行ADD . /app/src
5.4??????把本地鏡像上傳到華為云鏡像倉庫
華為云Docker鏡像倉庫SWR服務,在它的界面有提示你如何把本地的鏡像提交到云上。
6??????華為云容器團隊幫忙制作
如果客戶已經存在一定業務量,或者開始POC,可提供適當的免費制作服務。
如果制作鏡像需求上量后,可提供培訓課程關于如何制作Docker鏡像。并收取一定的合理費用。
Docker鏡像 Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。