20-Docker鏡像製作

查看鏡像構建的歷史

docker image history 26a5       #查看鏡像26a5的構建歷史

使用commit命令構建鏡像

使用commit命令可以將容器構建成鏡像。

  • 將容器webserver製作爲鏡像nginx:v2
docker commit \
    --author "Tao Wang <[email protected]>" \     #指定鏡像作者
    --message "修改了默認網頁" \    #指定鏡像的描述信息。 
    webserver \		#容器名
    nginx:v2		#新鏡像名

實驗

docker container run -d -p 8080:80 --name "webserver" nginx
docker exec -it webserver bash
cd /usr/share/nginx/html
echo "hello" > index.html       #修改主頁文件index.html
exit        #退出容器
docker commit webserver nginx:v2    #將容器webserver構建成鏡像nginx:v2
docker container run -d -p 8090:80 --name "webserver2" nginx:v2    #根據新構建的鏡像啓動容器
#測試:curl 127.0.0.1:8090,會返回hello

commit命令的弊端

鏡像是分層的,如上例中的nginx:v2比nginx多了一層(將webserver的可寫層製作成了鏡像)
當我們多次使用commit製作鏡像,鏡像就會變得很臃腫,擁有很多層,這導致鏡像的管理,傳輸等過程中效率低下。
如,我們將nginx中的index.html修改爲123,下一次又修改爲456,修改了很多次,最後又變成了123。那麼中間的鏡像就是多餘了。
使用Dockerfile可以解決這個問題。


使用Dockerfile製作鏡像

Dcokerfile是一個文件,裏面說明了鏡像如何製作。

  • 用一個例子來入門
vim Dockerfile
    FROM centos:7
    MAINTAINER flight
    CMD [ "sh", "-c", "echo $HOME" ]
docker build -t centos:v1 .
docker run centos:v1    #輸出家目錄後退出
docker run centos:v1 echo hello     #輸出hello之後退出

#Dockerfile文件解釋:
#FROM centos:7      #指定base鏡像(根據bash鏡像製作新的鏡像)
#MAINTAINER flight  #維護者(作者)
#CMD [ "sh", "-c", "echo $HOME" ]       #啓動鏡像後運行此命令(使用docker run時可以在命令最後添加新的命令將CMD替換)

通常會使用centos、ubuntu等base鏡像進行製作。

Dockerfile的參數
FROM centos			#指定base鏡像
MAINTAINER flight	#指定作者
ENV WELCOME "hello"	#設置環境變量,ENV a=123 b="456 789"
ARG WELCOME[=hello]	#設置環境變量,但容器中不存在這些變量。可以用--build-arg WELCOME=hi來覆蓋
EXPOSE	8080 8888	#指定容器監聽端口
VOLUME	/data		#定義匿名卷(/var/lib/docker/volumes下)
WORKDIR	/testdir	#設置當前工作目錄
RUN	touch 1.txt		#運行命令(一條RUN指令建立一層鏡像,可使用&&將命令串起來)
COPY ./src dst	#將文件從本機複製到鏡像中(目標路徑不存在則自動創建)
ADD ./src dst	#與COPY類似,但可以複製壓縮文件(會自動解壓)
CMD [ "sh", "-c", "echo $HOME" ]	#默認執行命令(啓動鏡像時就會執行),docker run最後使用新的命令替換CMD
ENTRYPOINT [ "sh", "-c", "echo $HOME" ]	#docker run之後得參數作爲參數傳遞給ENTRYPOINT
docker build -t ryan/nginx:v3 .
    -t	#指定新鏡像name和tag
    -f	#可以指定Dockerfile文件名(默認文件名爲Dockerfile)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章