1、Docker 鏡像管理
鏡像特性 -1
容器建立時需要指定鏡像,每個鏡像都由唯一的标示 Image ID ,和容器的 Container ID 一樣,預設 128 位,可以使用前 16 為縮略形式,也可以使用鏡像名與版本号兩部分組合唯一标示,如果省略版本号,預設使用最新版本标簽 ( latesr )
鏡像的分層:Docker 的鏡像通過聯合檔案系統 ( union filesystem ) 将各層檔案系統疊加在一起
鏡像特性 -2
bootfs:用于系統引導的檔案系統,包括 bootloader 和 kernel,容器啟動完成後會被解除安裝以節省記憶體資源
rootfs:位于 bootfs 之上,表現為 Docker 容器的跟檔案系統
傳統模式中,系統啟動時,核心挂載 rootfs 時會首先将其挂載為“隻讀”模式,完整性自檢完成後将其挂載為讀寫模式
Docker 中,rootfs 由核心挂載為“隻讀”模式,而後通過 UFS 技術挂載一個“可寫” 層
鏡像特性 -3
已有的分層隻能讀不能修改
上層鏡像優先級大于底層鏡像
2、Docker 鏡像的建構
1、容器 —> 鏡像
docker commit 容器名 鏡像名
#不支援啟動指令封裝
#示例:nginx鏡像制作
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wangyanglinux/centos7.3 run 2c23e47f438a 4 days ago 192 MB
#運作一個容器
$ docker run --name nginx -p 80:80 -d 2c23e
#進入容器
$ docker exec -it nginx /bin/bash
$ yum -y install lrzsz gcc gcc-c++ pcre pcre-devel zlib zlib-devel make
#上傳或下載下傳nginx壓縮包,然後解壓
$ tar -zxvf nginx-1.13.8.tar.gz
$ cd nginx-1.13.8
$ ./configure --prefix=/usr/local/nginx
$ make && make instal
$ /usr/local/nginx/sbin/nginx # 此時可以網頁通路nginx http://192.168.1.11
$ exit # 退出容器
$ docker ps -a
$ docker commit nginx txb_nginx:v1 #将容器轉換為鏡像
2、DockerFile
Dockfile 是一種被 Docker 程式解釋的腳本,Dockerfile 由一條一條的指令組成,每條指令對應 Linux 下面的一條指令。Docker 程式将這些 Dockerfile 指令翻譯真正的 Linux 指令。Dockerfile 有自己書寫格式和支援的指令,Docker 程式解決這些指令間的依賴關系,類似于 Makefile。Docker 程式将讀取 Dockerfile,根據指令生成定制的 image
#生成指令:
$ docker build -t wangyang/jdk-tomcat .
#導出:
$ docker save -o 壓縮後的name.tar images_name
#導入:
$ docker load -i xx.xx.xx.tar
dockerfile 文法
1、FROM(指定基礎 image):
建構指令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴于該指令指定的image。FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位于本地倉庫
example:
FROM centos:7.2
FROM centos
2、MAINTAINER(用來指定鏡像建立者資訊):
建構指令,用于将image的制作者相關的資訊寫入到image中。當我們對該image執行docker inspect指令時,輸出中有相應的字段記錄該資訊。
example:
MAINTAINER wangyang "[email protected]"
3、RUN(安裝軟體用):
建構指令,RUN可以運作任何被基礎image支援的指令。如基礎image選擇了Centos,那麼軟體管理部分隻能使用Centos 的包管理指令
example:
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN ["/bin/bash", "-c", "echo hello"]
4、CMD(設定container啟動時執行的操作):
設定指令,用于container啟動時指定的操作。該操作可以是執行自定義腳本,也可以是執行系統指令。該指令隻能在檔案中存在一次,如果有多個,則隻執行最後一條
example:
CMD echo "Hello, World!"
CMD /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log
5、ENTRYPOINT(設定container啟動時執行的操作):
設定指令,指定容器啟動時執行的指令,可以多次設定,但是隻有最後一個有效。
example:
ENTRYPOINT ls -l
#該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。當獨自使用時,如果你還使用了CMD指令且CMD是一個完整的可執行的指令,那麼CMD指令和ENTRYPOINT會互相覆寫隻有最後一個CMD或者ENTRYPOINT有效
# CMD指令将不會被執行,隻有ENTRYPOINT指令被執行
CMD echo “Hello, World!”
ENTRYPOINT ls -l
#另一種用法和CMD指令配合使用來指定ENTRYPOINT的預設參數,這時CMD指令不是一個完整的可執行指令,僅僅是參數部分;ENTRYPOINT指令隻能使用JSON方式指定執行指令,而不能指定參數
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
6、USER(設定container容器的使用者):
設定指令,設定啟動容器的使用者(虛拟的),預設是root使用者
example:
USER daemon = ENTRYPOINT ["memcached", "-u", "daemon"]
7、EXPOSE(指定容器需要映射到主控端器的端口):設定指令,該指令會将容器中的端口映射成主控端器中的某個端口。當你需要通路容器的時候,可以不是用容器的IP位址而是使用主控端器的IP位址和映射後的端口。要完成整個操作需要兩個步驟,首先在Dockerfile使用EXPOSE設定需要映射的容器端口,然後在運作容器的時候指定 -p 選項加上EXPOSE設定的端口,這樣EXPOSE設定的端口号會被随機映射成主控端器中的一個端口号。也可以指定需要映射到主控端器的那個端口,這時要確定主控端器上的端口号沒有被使用。EXPOSE指令可以一次設定多個端口号,相應的運作容器的時候,可以配套的多次使用-p選項。
example:
映射一個端口
EXPOSE 22
相應的運作容器使用的指令
docker run -p port1 image
映射多個端口
EXPOSE port1 port2 port3
相應的運作容器使用的指令
docker run -p port1 -p port2 -p port3 image
還可以指定需要映射到主控端器上的某個端口号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
8、ENV(用于設定環境變量):建構指令,在image中設定一個環境變量
example:
設定了後,後續的RUN指令都可以使用,container啟動後,可以通過docker inspect檢視這個環境變量,也可以通過在docker run --env key=value 時設定或修改環境變量。假如你安裝了JAVA程式,需要設定JAVA_HOME,那麼可以在Dockerfile中這樣寫:
ENV JAVA_HOME /path/to/java/dirent
9、ADD(從src複制檔案到container的dest路徑)
example:
ADD <src> <dest>
<src> 是相對被建構的源目錄的相對路徑,可以是檔案或目錄的路徑,也可以是一個遠端的檔案url;
<dest> 是container中的絕對路徑
10、COPY (從src複制檔案到container的dest路徑)
example:
COPY <src> <dest>
11、VOLUME(指定挂載點):
設定指令,使容器中的一個目錄具有持久化存儲資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,當容器關閉後,所有的更改都會丢失。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令
examp:
FROM base
VOLUME ["/tmp/data"]
12、WORKDIR(切換目錄):設定指令,可以多次切換(相當于cd指令),對RUN,CMD,ENTRYPOINT生效
example:
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
13、ONBUILD(在子鏡像中執行):ONBUILD 指定的指令在建構鏡像時并不執行,而是在它的子鏡像中執行
example:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
示例一:Tomcat 使用 dockerfile 生成鏡像
$ mkdir tomcat
$ mv apache-tomcat-7.0.42.tar.gz jdk-7u25-linux-x64.tar.gz Dockerfile tomcat/
$ cd tomcat/
$ vim Dockerfile
#生成鏡像
$ docker build -t taoxiaoning_tomcat:v1 .
-t 指定标簽,即鏡像叫什麼
#使用生成的鏡像啟動一個容器
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
taoxiaoning_tomcat v1 1b75dfcb7fe7 8 minutes ago 851 MB
$ docker run --name tomcat -p 80:8080 -d 1b75d
網頁通路:192.168.1.11:80
示例二:讓 nginx 鏡像随着使用者每次啟動,環境變量不同,而實作展現的内容不一樣,第一次運作為容器的時候網頁内容為 taoxiaobing ,後面還可以是自定義
$ vim Dockerfile
FROM txb_nginx:v1
ENV INDEX_DATA index.html
ADD ./startup.sh /root
CMD /bin/bash /root/startup.sh
$ vim /root/startup.sh
#!/bin/bash
echo $INDEX_DATA > /usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx
tail -f /usr/local/nginx/logs/access.log
$ chmod a+x /root/startup.sh
#生成鏡像
$ docker build -t txb_nginx:v2 .
#結果圖一所示
$ docker run --name nginx1 -p 80:80 -d txb_nginx:v2
#結果圖二所示
$ docker run --name nginx2 -p 81:80 --env INDEX_DATA=taoxiaobong -d txb_nginx:v2
圖一

圖二
總結:
1.鏡像制作
容器 > 鏡像
優點
更符合我們工作習慣
無需調試,一次成型
缺點
很多功能無法實作
鏡像重用性低
2.dockerfile build 鏡像
優點
更能全
重用性高
缺點
需要調試,浪費時間
3.結合使用:docker 容器 > exec 進去安裝部署環境應用程式 > Dockerfile 封裝功能