Docker 必知必會3----使用自己製作的鏡像

前面的兩篇文章分別講了,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 "[email protected]"  
 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 來重新更改爲所需值。

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