1. 程式人生 > >docker commit/Dockerfile製作映象,save/load打包映象

docker commit/Dockerfile製作映象,save/load打包映象

  • 一、commit製作映象

啟動一個容器,對容器修改操作,會儲存到容器的儲存層,當容器銷燬儲存層也銷燬。

但我們可以用commit命令把儲存層儲存為映象。

①啟動一個nginx容器

docker run --name nginx -d -p 80:80 nginx

②進入nginx容器修改訪問首頁

docker exec -it nginx bash

echo '<h1>hello,docker</h1>' > /usr/share/nginx/html/index.html

exit

③修改了容器的檔案,即修改了容器的儲存層,檢視具體改動

docker diff nginx

④commit儲存修改成為映象,映象名字為nginx:v2

docker commit --author "huang km" --message "修改了預設頁面" nginx nginx:v2

⑤檢視nginx:v2映象修改歷史

docker history nginx:v2

優缺點:

commit命令可以體現映象分層(映象只讀層,容器讀寫層)的概念,但實際環境不推薦使用。

用commit映象除了真正想要修改的東西外,由於命令的執行,還會有其他檔案被改動或新增,如果是安裝軟體包、編譯構建,將會有大量無關內容被新增進行,這會導致映象極為臃腫,docker commit意味著對映象操作都是黑箱操作,其他人很難知道里面發生了什麼,維護十分困難。

  • 二、Dockerfile定製映象

定製nginx:v2映象為例

①在一個空白目錄,新建一個文字檔案

mkdir mynginx

cd mynginx

touch Dockerfile

②vi  Dockerfile  修改Dockerfile檔案內容為

FROM nginx

RUN echo '<h1>hello,docker</h1>' > /usr/share/nginx/html/index.html

③在Dockerfile檔案所在目錄執行以構建映象(注意語句後面有一個點)

docker build -t nginx:v3 .

④docker images 即可檢視到nginx:v3映象

要點1:FROM指定基礎映象,即要修改的映象,FROM必須在檔案第一行。RUN命令是用來執行命令列,注意每用一個RUN(dockerfile指令)就是映象新增多一層(最大限制127層)。執行多個指令用&&來連線(apt-get加上-y,表示系統安裝提示都預設選擇yes,否則製作映象失敗;如果&&命令之間有換行,記得行後要帶上 \ )

FROM nginx
RUN apt-get -y update && \
apt-get install -y vim

除了上面兩個Dockerfile命令,還有

# Base images 基礎映象
FROM centos

#MAINTAINER 維護者資訊
MAINTAINER deepfeel

#ENV 設定環境變數
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  檔案放在當前目錄下,拷過去會自動解壓
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 執行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相當於cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 對映埠
EXPOSE 80

#VOLUME 掛載目錄
VOLUME ["/my-vol","/webapp"]

#CMD 執行以下命令
CMD ["nginx"]

要點2:docker build命令後面的點並不是指定Dockerfile所有路徑,而是指定上下文。

【首先要理解docker build的工作原理。Docker在執行時分為Docker引擎(即服務端守護程序,簡稱服務端)和客戶端工具,屬於C/S架構。Docker引擎提供了一組REST API,叫Docker Remote API,我們平時在本機執行的各種docker命令,實際都是以遠端呼叫API的形式讓Docker引擎來完成。】

當我們構建映象時,僅僅使用RUN是不夠的,還有COPY、ADD指令等等,而COPY、ADD指令會把本地檔案複製進映象,docker build構建的時候,並非是在本地構建,而是在服務端(Docker 引擎)中構建。

docker build命令就是打包使用者指定的上下文路徑下的所有內容,然後上傳到docker引擎,docker引擎構建的時候就能得到所需的一切檔案。

執行docker build -t nginx:v3 home,這會打包傳送home下的所有檔案,如果指定根目錄,那就打包傳送幾十GB的東西。沒有指定構建檔名稱則預設找home目錄下的Dockerfile檔案來構建。

如果想使用別的構建檔名稱,則需要指定

docker build -t nginx:v3 home -f ../myfile.txt

要點3:構建過程解讀:

從輸出結果可以看到映象的構建過程。

step1:在nginx這一層e43d811ce2f4 之上

step2:run啟動了一個容器9cdc27646c7b,執行了相應的命令,提交了這一層44aa4490ce2c,隨後刪除了所用到的容器9cdc27646c7b。

  • 三、save/load打包映象

①打包名字為alpine的映象 壓縮包名字為alpine-latest.tar.gz

docker save alpine | gzip > alpine-latest.tar.gz

②然後把alpine-latest.tar.gz複製到其他機子上,執行載入映象

docker load -i alpine-latest.tar.gz

--還可以直接一步完成

docker save alpine | alpine-latest.tar.gz | pv | ssh <使用者名稱>@<主機名> 'cat | docker load'