文章目錄
- 一、鏡像分層原理
- 1.1初級了解鏡像
- 1.2如何堆疊鏡像
- 1.3涉及技術
- 二、Dockerfile撰寫
- 2.1dockerfile操作指令
- 2.2撰寫dockerfile檔案–部署nginx
- 三、Dockerfile優化
- 3.1優化方式
- 2.2優化Nginx-Dockerfile
一、鏡像分層原理
1.1初級了解鏡像
鏡像包含以下:
- 基礎鏡像(base image):比如centos7
- 依賴環境:比如gcc、gcc-c++、make、jdk、jre、gd
- 應用服務軟體包
- 應用服務的相關組態檔
- 啟動方式/容器開啟時運行時的腳本/命令/指令
1.2如何堆疊鏡像
- docker鏡像分層(基于AUFS構建) :
Docker鏡像位于bootfs之上
每一層鏡像是下一層的父鏡像
第一層鏡像:base image ( 作業系統環境鏡像)
最頂層writable容器層:可讀可寫
容器層以下都是readonly - Linux檔案系統之aufs
aufs是一種可疊加式的檔案系統,全稱是advanced multi-layered unification filesystem,主要功能是把多個檔案夾的內容合并到一起,提供一個統一的視圖, 主要用于各個Linux發行版的livecd中,以及docker里面用來組織image
1.3涉及技術
-
bootfs(boot file system)
主要包含bootloader和kernel
bootloader:主要是引導加載kernel, Linux剛啟動時會加載bootfs檔案系統,在Docker鏡像的最底層是bootfs
①這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核,當boot加載完成之后整個內核就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs
②在linux作業系統中(不同版本的linux發行版本),linux加載bootfs時會將rootfs設定為read-only,系統自檢后會將只讀改為讀寫,讓我們可以在作業系統中進行操作 -
rootfs (root file system)
在bootfs之上(base images,例如centos 、ubuntu)
包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案
rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等
二、Dockerfile撰寫
2.1dockerfile操作指令
- FROM 鏡像(必寫):指定新鏡像所基于的鏡像,第 條指必須為from指令,每創建一個鏡像就需要一條from指令
- MAINTAINER名字(選寫):說明新鏡像的維護人資訊
- RUN 命令:在所基于的鏡像上執行命令,并提交到新的鏡像中;docker內每執行一條命令都是run開頭
舉例:安裝nginx
run yum -y install -y -gcc gcc-c++ make
run useradd -s -M
run tar zxvf nginx-1.12.0.tar.gz -C /opt - CMD[“要運行的程式”,“引數1”,“引數2”]:指令啟動容器時要運行的命令或者腳本,Dockerfile只能有一條CMD命令, 如果指定多條則只能最后一條被執行
- EXPOSE埠號:指定新鏡像加載到Docker時要開啟的埠
- ENV 環境變數 變數值:設定一個環境變數的值,會被后面的run使用
舉例:
RUN $workdir (無法識別)
ENV workdir= /usr/local/nginx
RUN $workdir (可識別) - ADD 源檔案/目錄 目標檔案/目錄:具體識別壓縮格式并且自動解壓,;將源檔案復制到目標檔案,源檔案要與dockerfile位于相同目錄中,或者一個URL
- COPY 源檔案/目錄 目標檔案/目錄:將本地主機上的檔案/目錄復制到目標地點,源檔案/目錄要
與Dockerfile在相同的目錄中 - VOLUME [“目錄"]:在容器中創建一個掛載點
- USER 用戶名/UID:指定運行容器時的用戶
- WORKDIR 路徑:為后續的RUN、CMD、ENTRYPOINT指定作業目錄
舉例:
cd /usr/local/nginx/conf
run sed i xxxxnginx.conf(在workdir上面只會識別是根目錄)
workdir /usr/local/nginx/conf(相當于cd命令)
run sed i xxxxnginx.conf - ONBUILD命令:指定所生成的鏡像作為一個基礎鏡像時所要運行的命令
- HEALTHCHECK:健康檢查
2.2撰寫dockerfile檔案–部署nginx
構想nginx鏡像撰寫步驟:
- 創建一個對應的目錄(mkdir nginx)
- 撰寫dockerfile檔案(最簡單的方式,nginx部署腳本放進去,每條命令用run執行,環境變數使用ENV,移 動到對應目錄使用workdir,最后使用CMD進行啟動設定)
- 在nginx目錄中上傳nginx-1.12.2.tar.gz軟體包等檔案
- docker build 創建
- docker run 運行容器
- 檢驗
以下具體撰寫內容:
mkdir nginx
cd nginx
mkdir Dokerfile
FROM centos:7 ##基于基礎鏡像(centos需小寫)
MAINTAINER THIS IS NGINX IMAGE ##用戶資訊(可選)
RUN yum -y update ##添加環境包
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src ##傳入、解壓nginx軟體包
WORKDIR /usr/local/src/ ##指定作業目錄
WORKDIR nginx-1.12.2
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80 ##指定http和https埠
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx
docker build -f Dockerfile -t nginx:new .
docker build:基于dockerfile 構建鏡像
-f :指定dockerfile 檔案(默認不寫的話指的是當前目錄)
-t : (tag) 打標簽---------》nginx : new
. :專業說法:指的是構建鏡像時的背景關系環境,簡單理解:指的當前目錄環境中的檔案
watch -n 1 docker ps -a
docker ps -a


- docker run -d -P nginx:new


三、Dockerfile優化
3.1優化方式
- 減少RUN 指令的使用
RUN yum -y update
RUN yum install -y gcc gcc-c++
整合為yum install -y gcc gcc-c++ && yum -y update - 將執行后的快取/不用的輸出丟入黑洞 (減少快取)
yum install -y gcc gcc-c++ && yum -y update > /dev/null - 多階段構建
- 使用更小體積的linux發行版本
更加輕量級的centos的版本
2.2優化Nginx-Dockerfile
- 不需要輸出的指令丟入/dev/null(需要確定執行命令是正確的)
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
#關閉debug日志
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
RUN rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx""-g","daemon off;"]
docker build -t nginx:v1 .
- 減少RUN構建
FROM centos:7
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &> /dev/null && make install &> /dev/null &&\
rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"] ##掛載;若是不指定掛載點,默認是/var/lib/docker/volumes/容器id/_data
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -f Dockerfile -t nginx:v1 .
- 多階段構建
FROM centos:7 as build
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all &&\
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &>/dev/null && \
make install &>/dev/null && \
rm -rf /mnt/nginx-1.12.2
FROM centos:7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -t nginx:v3 .
- 使用更輕量級的linux發行版本
docker pull nginx
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299638.html
標籤:其他
上一篇:Linux自我學習筆記
