1. 程式人生 > 實用技巧 >Docker映象製作和管理

Docker映象製作和管理

Docker映象製作和管理

docker 映象生命週期

通過docker commit手動構建映象

基於容器手動製作映象步驟具體如下:

1.下載一個系統的官方基礎映象,如: CentOS 或 Ubuntu

2.基於基礎映象啟動一個容器,並進入到容器

3.在容器裡面做配置操作

安裝基礎命令

配置執行環境

安裝服務和配置服務

放業務程式程式碼

4.提交為一個新映象 docker commit

5.基於自己的的映象建立容器並測試訪問

格式一:
[root@ubuntu1804 ~]#docker commit -a "wang<[email protected]>" -c 'CMD  /bin/httpd -f -h /data/html' -c "EXPOSE 80" b1 httpd-busybox:v1.0

格式二:
[root@ubuntu1804 ~]#docker commit -a "wang<[email protected]>" -c 'CMD ["/bin/httpd", "-f", "-h", "/data/html"]' -c "EXPOSE 80" b1 httpd-busybox:v1.0

利用Dockerfile檔案執行docker build自行構建映象

DockerFile是一種被Docker程式解釋執行的指令碼,由一條條命令組成,每條命令對應linux下面的一條命令,DOcker程式將這些Dockerfile指令再翻譯成真正的linux命令,其有自己的書寫方式和支援的命令,Docker程式讀取Dockerfile並根據指令生成Docker映象。相比手動製作映象方式,Dockerfile更能直觀的展示映象是怎麼產生的,有了Dockerfile,當後期有額外的需求時,只要在之前的Dockerfile新增或修改響應的命令即可重新生成新的Docker映象,避免了重複手動製作映象的麻煩,類似與shell指令碼一樣,可以方便高效的製作映象

Docker守護程式Dockerfile逐一執行指令,如有必要,將每個指令的結果提交到新映象,然後最終輸出新映象ID。Docker守護程式將自動清理髮送的上下文

注:每條指令 都是獨立執行的,並會導致建立新映象。比如RUN , cd /tmp 對下一條指令不會有任何影響

Docker將盡可能重用中間映像(快取),以顯著加速docker build命令的執行過程,這由Using cache控制檯輸出中的訊息指示

Dockerfile映象製作和使用流程

Dockerfile檔案的製作映象的分層結構

Dockerfile檔案說明:

  • 每一行以Dockerfile的指令開頭,指令不區分大小寫,但是慣例使用大寫

  • 使用#開始作為註釋

  • 每一行只支援一條指令,每條指令可以攜帶多個引數

  • 指令按檔案的順序從上至下進行執行

  • 每個指令的執行會生成一個新的映象層,為了減少分層和映象大小,儘可能將多條指令合併成一條指令

  • 製作映象一般可能需要反覆多次,每次執行dockerfile都按順序執行,從頭開始,已經執行過的指令已經快取,不需要再執行,如果後續有一行新的指令沒執行過,其往後的指令將會重新執行過,所以為加速映象製作,將最常變化的內容放下dockerfile的檔案後面

Dockerfile常見相關指令: ADD COPY ENV EXPOSE FROM LABEL STOPSIGNAL USER VOLUME WORKDIR

Dockerdfile 構建過程和指令總結

Dockerfile構建(docker build)過程

  • 從基礎映象執行一個容器

  • 執行一條指令,對容器做出修改

  • 執行類似docker commit的操作,提交一個新的中間映象層(可以利用中間層映象建立容器進行除錯和排錯)

  • 再基於剛提交的映象執行一個新容器

  • 執行Dockerfile中的下一條指令,直至所有指令執行完畢

檢視映象的構建歷史: docker history 映象ID

Docker直接製作Nginx映象的Dockerfile檔案:

[root@ubuntu1804 ~]#mkdir /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 ~]#cd /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 1.18.0]#vim nginx.conf
user nginx;
worker_processes 1;
#daemon off;
[root@ubuntu1804 1.18.0]#wget http://nginx.org/download/nginx-1.18.0.tar.gz

[root@ubuntu1804 1.18.0]#pwd
/data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804  1.18.0]# ls
Dockerfile nginx.conf  index.html  

[root@ubuntu1804 1.18.0]#cat Dockerfile
#Nginx Dockerfile
FROM centos:centos7.7.1908
MAINTAINER wei <[email protected]>
RUN yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl
openssl-devel \
  && useradd -r -s /sbin/nologin nginx \
  && yum clean all 
ADD nginx-1.18.0.tar.gz /usr/local/src/ 
RUN cd /usr/local/src/nginx-1.18.0 \
  && ./configure --prefix=/apps/nginx \
  && make \
  && make install \
  && rm -rf /usr/local/src/nginx*
ADD nginx.conf /apps/nginx/conf/nginx.conf
COPY index.html /apps/nginx/html/
RUN ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx 
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx"]