一起學習docker系列:
一、關於鏡像
鏡像是 Docker 的三大組件之一。
Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載(默認是Docker Hub 公共註冊伺服器中的倉庫)。一般公司內部會搭建私有倉庫,公司自己的鏡像會放到私有倉庫裡。
二、下載鏡像,了解基本信息
1、先找一個鏡像下載下來(選擇一個較小的,下載快)
docker search java
下載,並運行確認版本
docker run -it java java -version
也可以通過docker pull下載docker pull docker.io/hello-world 然後執行其他命令
查看系統
docker run -it java uname
查看鏡像ip
docker run java ip addr
查看環境變量
docker run java env
以上了解鏡像裡面是什麼。
以上了解了鏡像內容後我們可以下載運行一個鏡像,了解平時需要查看鏡像的那些信息。
下載鏡像
docker pull docker.io/hello-world
注意:倉庫地址,docker.io,沒有指明tag,默認就是latest.運行這個鏡像
查看鏡像
docker images 查看是否下載
運行鏡像
docker run docker.io/hello-world
查看鏡像信息(這裡信息較多)
docker inspect docker.io/hello-world
刪除鏡像
docker rmi docker.io/hello-world -f
刪除所有未打標籤的鏡像 docker rmi $(docker images -q -f dangling=true) 刪除所有鏡像 docker rmi $(docker images -q)
三、手工製作鏡像
一般情況下,公司內部使用的鏡像都是經過內部情況進行優化處理的,所有需要進行修改,然後傳到私有倉庫。
我們這裡先通過剛剛下載的java鏡像來做我們自己需要的鏡像
docker create --name wolfjava -it java /bin/bash
# docker create --name wolfjava -it java /bin/bash
271e96acb33a0afdc4b4101e00aa1cb343bb959b844db2817584cd499016d523
啟動
#docker start wolfjava
#docker ps
進去查看一下
# docker exec -it 271e96acb33a /bin/bash
root@271e96acb33a:/#
我們這裡創建一個wolf目錄
打開另一個窗口,執行commit操作。
# docker commit 271e96acb33a wolfjava-01
sha256:31bb307101b0ee3e52a239ec1ca80df3b9e147d69e9a3b4bb43e5c1256e9674a
通過docker images查看是否成功,通過下圖發現已經成功。
我們在通過我們製作的鏡像來啟動,看看裡面是否有我們創建的wolf目錄
docker run -it wolfjava-01 ls 這裡發現有wolf目錄存在,說明我們成功了。
我們昨天搭建了harbor,這裡提交一下
docker tag 31bb307101b0 10.101.200.159/wolf/wolfjava-01
上傳到倉庫
docker push 10.101.200.159/wolf/wolfjava-01
看到這裡說明,沒問題,我們登錄網頁查看一下
這裡發現很快就創建了一個新的容器這種做法的優點:最方便、最快速,學習製作鏡像更易理解這種做法的缺點:不規範、無法自動化(完全手工)、不科學
四、dockerfile製作鏡像
Dockerfile的官方手冊如下
https://docs.docker.com/engine/reference/builder/
在Dockerfile中用到的命令有FROM
FROM指定一個基礎鏡像, 一般情況下一個可用的 Dockerfile一定是 FROM 為第一個指令。至於image則可以是任何合理存在的image鏡像。 FROM 一定是首個非注釋指令 Dockerfile. FROM 可以在一個 Dockerfile 中出現多次,以便於創建混合的images。 如果沒有指定 tag ,latest 將會被指定為要使用的基礎鏡像版本。
MAINTAINER 這裡是用於指定鏡像製作者的信息RUN
RUN命令將在當前image中執行任意合法命令並提交執行結果。命令執行提交後,就會自動執行Dockerfile中的下一個指令。
層級 RUN 指令和生成提交是符合Docker核心理念的做法。它允許像版本控制那樣,在任意一個點,對image 鏡像進行定製化構建。
RUN 指令緩存不會在下個命令執行時自動失效。比如 RUN apt-get dist-upgrade -y 的緩存就可能被用於下一個指令. --no-cache 標誌可以被用於強制取消緩存使用。
ENV ENV指令可以用於為docker容器設置環境變量
ENV設置的環境變量,可以使用 docker inspect命令來查看。同時還可以使用docker run --env <key>=<value>來修改環境變量。
USER USER 用來切換運行屬主身份的。
Docker 默認是使用 root,但若不需要,建議切換使用者身份,畢竟 root 權限太大了,使用上有安全的風險。
WORKDIR WORKDIR 用來切換工作目錄的。Docker 默認的工作目錄是/,只有 RUN 能執行 cd 命令切換目錄,而且還只作用在當下下的 RUN,也就是說每一個 RUN 都是獨立進行的。如果想讓其他指令在指定的目錄下執行,就得靠 WORKDIR。WORKDIR 動作的目錄改變是持久的,不用每個指令前都使用一次 WORKDIR。
COPY COPY 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。 <src> 必須是相對於源文件夾的一個文件或目錄,也可以是一個遠程的url,<dest> 是目標容器中的絕對路徑。 所有的新文件和文件夾都會創建UID 和 GID 。事實上如果 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。
ADD ADD 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。 <src> 必須是想對於源文件夾的一個文件或目錄,也可以是一個遠程的url。<dest> 是目標容器中的絕對路徑。 所有的新文件和文件夾都會創建UID 和 GID。事實上如果 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。
VOLUME 創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的數據等。
EXPOSE EXPOSE 指令指定在docker允許時指定的埠進行轉發。
CMD Dockerfile.中只能有一個CMD指令。 如果你指定了多個,那麼最後個CMD指令是生效的。 CMD指令的主要作用是提供默認的執行容器。這些默認值可以包括可執行文件,也可以省略可執行文件。 當你使用shell或exec格式時, CMD 會自動執行這個命令。ONBUILD ONBUILD 的作用就是讓指令延遲執行,延遲到下一個使用 FROM 的 Dockerfile 在建立 image 時執行,只限延遲一次。 ONBUILD 的使用情景是在建立鏡像時取得最新的源碼 (搭配 RUN) 與限定系統框架。
ARG ARG是Docker1.9 版本才新加入的指令。 ARG 定義的變量只在建立 image 時有效,建立完成後變量就失效消失LABEL 定義一個 image 標籤 Owner,並賦值,其值為變量 Name 的值。(LABEL Owner=$Name )ENTRYPOINT 是指定 Docker image 運行成 instance (也就是 Docker container) 時,要執行的命令或者文件。
我們來製作一個java鏡像
#vi Dockerfile
FROM 10.101.200.159/wolf/wolfjava-01
MAINTAINER nimmis <1098331428@qq.com>
# disable interactive functions
ENV DEBIAN_FRONTEND noninteractive
# set default java environment variable
ADD hello.sh /bin/hello.sh
RUN /bin/hello.sh
開始執行製作
docker build -t 10.101.200.159/wolf/wolfjava-02 .
製作成功,我們看一下docker iamges
上傳到倉庫
docker push 10.101.200.159/wolf/wolfjava-02
Dockerfile的命令,要多用,就熟悉了,後面我們會逐步使用,這裡先熟悉一下製作過程。
五、導入備份生成鏡像
我們這裡隨意導出一個(這裡是到處一個容器快照)
docker export f393a847db63 >myimage.tar
我們導入,導入容器快照,生成鏡像
docker import myimage.tar import-test/myimage:v1.0
使用此外也可以使用url來 docker import
*註:用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息