環境
docker-ce-19.03.1-3.el7.x86_64
centos 7
一、使用已有容器創建鏡像-docker commit
1、查看本地已有鏡像
[root@node105 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5a3221f0137b 9 days ago 126MB hello-world latest fce289e99eb9 7 months ago 1.84kB training/webapp latest 6fae60ef3446 4 years ago 349MB
查看本地正在運行的容器
[root@node105 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15ff843a3404 training/webapp "python app.py" 21 minutes ago Up 21 minutes 0.0.0.0:32768->5000/tcp stoic_moore db8b3e2f1c64 nginx "nginx -g 'daemon of…" About an hour ago Up 36 minutes 0.0.0.0:8081->80/tcp nginx-test [root@node105 ~]#
查看所有容器運行情況
[root@node105 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cdb6408b8370 training/webapp "/bin/bash" 20 minutes ago Exited (0) 15 minutes ago funny_ramanujan 15ff843a3404 training/webapp "python app.py" 22 minutes ago Up 22 minutes 0.0.0.0:32768->5000/tcp stoic_moore db8b3e2f1c64 nginx "nginx -g 'daemon of…" About an hour ago Up 37 minutes 0.0.0.0:8081->80/tcp nginx-test [root@node105 ~]#
2、以交互方式進入容器並進行修改
[root@node105 ~]# docker run -ti training/webapp /bin/bash root@cdb6408b8370:/opt/webapp# ls Procfile app.py requirements.txt tests.py root@cdb6408b8370:/opt/webapp# touch app1.py root@cdb6408b8370:/opt/webapp# ls Procfile app.py app1.py requirements.txt tests.py root@cdb6408b8370:/opt/webapp# exit exit [root@node105 ~]#
3、提交修改生成新的鏡像
[root@node105 ~]# docker commit -m "Added app1.py" -a "cac2020" 15ff843a3404 training/webapp:v2 sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251 [root@node105 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE training/webapp v2 71b135d88d62 7 seconds ago 349MB nginx latest 5a3221f0137b 9 days ago 126MB hello-world latest fce289e99eb9 7 months ago 1.84kB training/webapp latest 6fae60ef3446 4 years ago 349MB
-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a 可以指定更新的用戶信息;之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名和 tag 信息。創建成功后會返回這個鏡像的 ID 信息
4、刪除鏡像-dcoker rmi
[root@node105 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE training/webapp v2 71b135d88d62 8 minutes ago 349MB nginx latest 5a3221f0137b 9 days ago 126MB hello-world latest fce289e99eb9 7 months ago 1.84kB training/webapp latest 6fae60ef3446 4 years ago 349MB [root@node105 ~]# docker rmi 71b135d88d62 Untagged: training/webapp:v2 Deleted: sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251 [root@node105 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5a3221f0137b 9 days ago 126MB hello-world latest fce289e99eb9 7 months ago 1.84kB training/webapp latest 6fae60ef3446 4 years ago 349MB
二、使用Dockerfile創建鏡像-docker build
1、Dockerfile語法:
(1)#是注釋符
(2)FROM 指定一個依賴的鏡像,一個鏡像不能超過 127 層
(3)LABEL 為鏡像生成元數據標簽信息
(4)MAINTAINER 作者信息,寫在FROM后
(5)COPY 當復制一個目錄時,並不會復制目錄本身,而是會遞歸復制其下子目錄 至目標目錄下
(6)ADD ADD指令類似於COPY指令,ADD支持使用TAR文件和URL路徑
(7)WORKDIR 用於為Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令設定工作目錄
(8)RUN 接受命令作為參數並用於創建鏡像,在之前的commit層上形成新的層。
(9)CMD 類似於RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,二者的運行時間點不同
RUN 指令運行於映像文件構建過程中,而CMD指令運行於基於Dockerfile構建出的新鏡像文件啟動一個容器時。
CMD指令的首要目的在於為啟動的容器指定默認要運行的程序,且其運行結束后,容器也將終止;不過,CMD指定的命令其可以被docker run的命令行選項所覆蓋
在Dockerfile中可以存在多個CMD指令,但僅最后一個生效;
CMD會在啟動容器的時候執行,build時不執行,而RUN只是在構建鏡像的時候執行,后續鏡像構建完成之后,啟動容器就與RUN無關了。這個命令就相當於在/etc/rc.d/rc.local中寫命令
(10)ENTRYPOINT 類似CMD指令的功能,用於為容器指定默認運行程序,從而使得容器像是一具單獨的可執行程序
(11)EXPOSE 用來指定端口,使容器內的應用可以通過端口和外界交互。
(12)ENV ENV指令可以用於docker容器設置環境變量
(13)USER 用於指定運行image時的或運行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序時的用戶名或UID
默認情況下,container的運行身份為root用戶
(14)ONBUILD 用於在Dockerfile中定義一個觸發器
Dockerfile用於build映像文件,此映像文件亦可作為base image被另一個Dockerfile用作FROM指令的參數,並以之構建新的映像文件
在后的這個Dockerfile中的FROM指令在build過程中被執行時,將會“觸發”創建其base image的Dockerfile文件中的ONBUILD指令定義的觸發器
(15)HEALTHCHECK Docker 1.12版本后引入的判斷容器狀態是否正常
2、docker build 語法
docker build [OPTIONS] PATH | URL | -
build執行過程:它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據 Dockerfile 來進行。然后,Dockfile 中的指令被一條一條的執行。每一步都創建了一個新的容器,在容器中執行指令並提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執行完畢之后,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被刪除和清理了。
三、本地文件系統導入構建鏡像-docker import
要從本地文件系統導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術)的模板來創建:openvz 的模板下載地址為templates 。
1、先下載了一個 ubuntu-14.04 的鏡像,之后使用以下命令導入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
2、然后查看新導入的鏡像
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
四、上傳鏡像-docker push
把創建的鏡像上傳到倉庫中來共享。Docker Hubhuo或者自己搭建的倉庫。
docker push 鏡像名
五、存儲和載入鏡像
1、保存鏡像為文件
docker save -o 要保存的文件名 要保存的鏡像
eg:
docker save -o java8.tar lwieske/java-8
2、從文件載入鏡像
docker load --input 文件
或者
docker load < 文件名
eg:
docker load < java8.tar
參考: