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'