docker打包鏡像

今天從一個小白的角度來使用docker,第一次使用docker,碰到了一個比較棘手的項目。一個大的工程分爲了兩個子項目,一個是core,一個是service,代碼都上傳在git上,再打包爲鏡像的時候,只會有一個Dockerfile,這裏可能就要麻煩運維的同學,需要將Dockerfile拷到和項目根目錄相同的位置。

對docker我一開始是一點都不瞭解的,因此在這裏我會比較接地氣的講解一下:

首先我們需要安裝一個docker,我用的是centos系統,

yum install -y docker

接下來就要開始製作鏡像,其實這個就是大家最爲頭疼的地方,我們需要在要打包的根目錄下建立一個Dockerfile文件,

touch Dockerfile

大家完全就可以把剛剛創建的文件當作一個shell腳本來寫,當然這樣想的也比較簡單。Dockerfile的第一行就是我們要製作一個什麼基礎環境的鏡像,比如我的是在centos中比較方便,因爲我打包的鏡像也是centos7的鏡像

FROM centos:7 

完成第一句就可以運行一下,如果想要看看效果的,使用

docker build -i -t semantic -f Dockerfile .

就可以構建我們的鏡像,大家要仔細理解每個字符的含義,-i -t 其實就是我們創建的一個交互,和終端一樣的操作環境,semantic就是我們製作的鏡像的名字,後面我們也可以打上tag,也就是標籤,例如semantic:v1其中v1就是標籤,代表着第幾版,-f 指的就是路徑,要構建的Dockerfile的路徑,我們可以在當前目錄進行構建,也可以在別的路徑對其進行構建。最後有個‘.’,這個大家要注意,也要了解其含義,代指上下文,在此處指的是當前路徑。

我們當然不會創建一個空的鏡像,要繼續執行我們打包的步驟,centos還是不能滿足我的工程要求,還需要安裝一些庫。

RUN yum install -y gcc gcc-c++ c++ make cmake automake curl-devel \
 && cd /usr/include/curl && ln -s curl.h types.h

我們每執行一次run,就建立了一層新的鏡像。爲了不讓我們的鏡像太繁瑣,這些安裝的指令可以在一層就安裝完。接下來需要將本地的工程拷貝過去。

COPY ./semantic_understanding /src/

docker的拷貝指令也是隻支持上下文的範圍,../../../這種路徑就無能爲力了,因爲超越了能夠拷貝的範圍。對於copy大家可能想add呢,他們有什麼區別呢,用我自己的話說就是add要比copy高級,copy只能執行簡單的,copy只是將相對路徑下的文件拷貝過去,ADD還可以是一些下載地址,將相應的內容放到特點的位置。如果是壓縮包,ADD能夠解壓好放到特定的位置,但是ADD也會有些超出預期的操作,其結果也是不可預期的,除非必要大家還是老老實實的使用copy就好。

接下來就是編譯了

RUN cd /src/src/semantic_understanding && ../../tool/build_run.sh -c make_release.conf 

RUN 就是執行的意思,我們需要到特定的目錄下執行,使用&&操作符連接,這樣就可以保證我們是在同一層執行,如果分成兩層,就會報錯,,找不到文件,,因爲大家要謹記,我們每一個指令就創建了一層,執行相應的指令時要考慮周到。

我的項目是兩個工程,需要將第一個項目生成的庫放到第二個庫中,如果你們也需要這樣的操作,就需要將開始的第一句修改一下,類似於打tag ,,

FROM centos:7.4.1708 as BUILD

開始第二個項目的構建,一樣的步驟、

FROM centos:7.4.1708 

RUN yum install gcc gcc-c++ make openssl-devel boost-devel zlib-devel -y

COPY ./service_envienment /src/

COPY --from=BUILD /src/output/ /src/semantic——understanding_service/semantic/semantic_understanding/output

RUN cd /src/semantic_understanding_service/semantic && mkdir bin

RUN cd /src/semantic_understanding_service/semantic/ && make clean && make 

大家可以自己分析一下第二步構建,有什麼想問的問題可以留言,學會的都說簡單,不會都感覺很難,,我也是這麼過來的。。

對於鏡像的要求,還是小巧一些比較好,因此會將配置文件,數據庫掛載到鏡像,

docker run -it -v /data/src/semantic/semantic_understanding/data:/src/semantic_understanding_service/semantic/bin semantic:v1 /bin/bash

-it大家應該瞭解就是開始後端,便於我們操作,:冒號前的代表我們的本地地址,後面的是鏡像的相對地址,semantic:v1就是我們要掛在的鏡像,這樣就能夠簡單快速完成大容量數據的掛載,操作比較優雅,不要全部封裝進去

 

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