【Docker學習之四】Docker自定義容器鏡像


環境
  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

 

參考:

Dockerfile語法簡介

docker build 命令

創建docker鏡像的兩種方式
Docker 創建鏡像、修改、上傳鏡像


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM