查看鏡像構建的歷史
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)