前面的兩篇文章分別講了,docker的基礎概念,設計思路以及docker的基本操作。
感興趣的同學可以查閱:
https://www.cnblogs.com/jilodream/p/18177695
https://www.cnblogs.com/jilodream/p/18184687
本文我們將介紹如何使用自己的映象。
一、製作自己映象
docker本身已經提供了映象製作的能力。我們只需要透過編寫指令碼檔案來製作滿足業務需要的新映象。
這裡要注意,我們製作的映象都是基於基礎的映象來完成,不能從0開始創造一個映象。
而這些基礎映象都是各大廠商提供的,可以直接使用的原始映象,比如上篇文章中介紹的tomcat映象。
我們所編寫的指令碼檔案,有一個專屬名稱:Dockerfile。
話不多說,來看看dockerfile 如何編寫:
Dockerfile 類似於 shell 指令碼,是一個面相過程的檔案指令碼。
指令碼中常用的關鍵字如下(注意全部都是大寫):
FROM:
選擇所繼承的基礎映象,類似於java中的extends
MAINTAINER:
維護者,一般就是docker映象的作者
WORKDIR:
指定工作路徑,也就是進入系統中的預設路徑。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )
我們的所有操作都是基於該工作路徑進行操作的,無法透過cd 等shell 命令,來回跳轉工作路徑。
COPY:
複製命令,從當前宿主機中,複製檔案到製作的容器中
ADD:
新增命令,和COPY命令很相似,但要更強大,如複製源不一定為宿主機、複製壓縮檔案後自動解壓等。
ENV:
配置容器的環境變數
RUN:
執行命令,後面可以接要執行的shell命令
VOLUME:
掛載卷命令,簡單來說,就是將宿主機中的某個檔案(或)資料夾對映到容器中。
這樣做的好處就是當容器刪除後,宿主機中仍然持有該檔案。一般常用於資料庫的磁碟檔案儲存,服務的日誌檔案記錄等。
EXPOSE:
宣告要暴露的埠號
USER:
映象中的使用者,常用於指定容器使用的預設使用者,切換指定使用者來處理設定許可權的檔案等。
CMD:
容器啟動時的執行命令
ENTRYPOINT:
容器啟動時的執行命令
注意CMD 和ENTRYPOINT命令是有區別的。CMD命令可以有多個,但是隻有最後一個命令會被執行,之前的命令會被覆蓋。
我一般是使用ENTRYPOINT來追加shell指令碼,然後透過shell指令碼來跑自己想執行的命令,這樣更加靈活和易於維護。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )
以上就是我們常用的製作映象的dockerfile檔案中的命令。一次性全部要記住會有些吃力,有些命令之間又會比較模糊,所以我們動手製作一個簡單的dockerfile 來體驗下:
以前文中tomcat映象為例,由於最新的tomcat映象,啟動後無法直接訪問,需要手動調整檔案,我們這裡就製作一個可以直接訪問的tomcat服務。
1 vi Dockerfile 2 3 #指定基礎映象 4 FROM tomcat:my-tomcat-image 5 6 #指定維護人員 7 MAINTAINER wangruoyi "encijietuo@123.com" 8 9 # 設定環境變數 10 ENV BASE_DIR="/usr/local/" 11 12 #指定工作路徑 13 WORKDIR /$BASE_DIR 14 15 #刪除原有的webapps 資料夾 16 RUN rm -rf ./tomcat/webapps && cp -r ./tomcat/webapps.dist ./tomcat/webapps 17 18 #暴露8080埠,其實沒有必要,因為原有的 19 EXPOSE 8080
wq 儲存好Dockerfile之後
我們使用 docker build -t 映象名:tag .
開始製作映象,注意執行命令時,最後有一個 . 表示,表示使用當前路徑中的 Dockerfile檔案
1 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker build -t my-building-image:0.1 . 2 [+] Building 0.1s (7/7) FINISHED docker:default 3 => [internal] load build definition from Dockerfile 0.0s 4 => => transferring dockerfile: 475B 0.0s 5 => [internal] load metadata for docker.io/library/tomcat:my-tomcat-image 0.0s 6 => [internal] load .dockerignore 0.0s 7 => => transferring context: 2B 0.0s 8 => [1/3] FROM docker.io/library/tomcat:my-tomcat-image 0.0s 9 => CACHED [2/3] WORKDIR //usr/local/ 0.0s 10 => CACHED [3/3] RUN rm -rf ./tomcat/webapps && cp -r ./tomcat/webapps.dist ./tomcat/webapps 0.0s 11 => exporting to image 0.0s 12 => => exporting layers 0.0s 13 => => writing image sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9 0.0s 14 => => naming to docker.io/library/my-building-image:0.1 0.0s 15 16 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images 17 REPOSITORY TAG IMAGE ID CREATED SIZE 18 my-building-image 0.1 5bab70215cf8 13 minutes ago 684MB
製作好映象之後,直接啟動容器
1 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker run -d -p 9090:8080 --name myTomcat my-building-image:0.1 2 1f181ab958e72993ef889572d798a88d66a86f91f2733193bf86bed7989d0b69
啟動之後,我們就可以直接透過瀏覽器訪問,注意這裡的埠號變為宿主機的9090 埠了,因為我們在docker run 時指定了9090作為對映埠。
http://ip:9090
二、遷移映象
由於網路或安全等考慮,我們常常需要遷移映象到其他機器。
主要分為兩部分操作,以我們之前做的my-building-image:0.1 映象為例,操作如下:
1、將映象儲存到磁碟檔案中
docker save -o 指定的檔案路徑 映象名/映象Id
1 docker save -o mytom.tar 5bab70215cf8 2 3 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker save -o mytom.tar 5bab70215cf8 4 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# ls 5 calico.yaml Dockerfile mytom.tar
2、將tar檔案傳入到指定機器中,並重新載入到檔案中
傳入到指定機器,大家可以用ftp工具傳輸,這裡就不說了,載入操作如下:
docker load -i 指定的檔案路徑
1 #docker load -i 指定的檔案路徑 2 docker load -i mytom.tar 3 4 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images 5 REPOSITORY TAG IMAGE ID CREATED SIZE 6 my-building-image 0.1 5bab70215cf8 31 minutes ago 684MB 7 8 #刪除掉映象 9 10 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker rmi 5bab70215cf8 11 Untagged: my-building-image:0.1 12 Deleted: sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9 13 14 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker load -i mytom.tar 15 Loaded image ID: sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9 16 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images 17 REPOSITORY TAG IMAGE ID CREATED SIZE 18 <none> <none> 5bab70215cf8 35 minutes ago 684MB
注意重新匯入的映象的映象id和之前一樣,5bab70215cf8。這是由於映象檔案沒有發生變化,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )因此sha256生成的雜湊值沒有變化,而映象id實際就是sha256的前幾位,因此也相等。
新匯入的映象名稱和TAG為none ,可以使用docker tag 來重新更改為所需值。