02.29 Docker之容器命令

1、獲取鏡像

Docker 運行容器前需要本地存在對應的鏡像,如果本地不存在該鏡像,Docker 會從鏡像倉庫下載該鏡像。

<code>docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]/<code>
<code>$ docker pull ubuntu:16.0416.04: Pulling from library/ubuntubf5d46315322: Pull complete9f13e0ac480c: Pull completee8988b5b3097: Pull complete40af181810e7: Pull completee6f7c7e5c03e: Pull completeDigest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbeStatus: Downloaded newer image for ubuntu:16.04/<code>

上面的命令中沒有給出 Docker 鏡像倉庫地址,因此將會從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:16.04,因此將會獲取官方鏡像 library/ubuntu 倉庫中標籤為 16.04 的鏡像。 相當於 docker pull registry.hub.docker.com/ubuntu:16.04命令。

從下載過程中可以看到我們之前提及的分層存儲的概念,鏡像是由多層存儲所構成。下載也是一層層的去下載,並非單一文件。下載過程中給出了每一層的 ID 的前 12 位。並且下載結束後,給出該鏡像完整的 sha256 的摘要,以確保下載一致性。

2、搜尋鏡像

docker search命令可以搜索遠程倉庫中共享的鏡像,默認搜索Docker Hub官方倉庫中的鏡像。

<code>[root@node02 ~]# docker search javaNAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDnode                                         Node.js is a JavaScript-based platform for...   6428      [OK]       tomcat                                       Apache Tomcat is an open source implementa...   2105      [OK]       java                                         Java is a concurrent, class-based, and obj...   1872      [OK]       openjdk                                      OpenJDK is an open-source implementation o...   1297      [OK]       ghost                                        Ghost is a free and open source blogging p...   860       [OK]       anapsix/alpine-java                          Oracle Java 8 (and 7) with GLIBC 2.28 over...   361                  [OK]jetty                                        Jetty provides a Web server and javax.serv...   278       [OK]       groovy                                       Apache Groovy is a multi-faceted language ...   58        [OK]       ibmjava                                      Official IBM® SDK, Java™ Technology Editio...   56        [OK]  /<code>

返回了很多包括關鍵字的鏡像,其中包括名稱、描述、星級(標識該鏡像的受歡迎度)、是否官方創建、是否自動創建。

3、查看鏡像信息

<code>$ docker imagesREPOSITORY           TAG                 IMAGE ID            CREATED             SIZEubuntu               16.04               1e0c3dd64ccd        4 weeks ago         188 MBubuntu               latest              1e0c3dd64ccd        4 weeks ago         127 MBredis                alpine              501ad78535f0        3 weeks ago         21.03MB/<code>

列表包含了 倉庫名、標籤、鏡像 ID、創建時間 以及 所佔用的空間

鏡像 ID 則是鏡像的唯一標識,一個鏡像可以對應多個標籤。因此,在上面的例子中,我們可以看到 ubuntu:16.04 和 ubuntu:latest 擁有相同的 ID,因為它們對應的是同一個鏡像,只是別名不同而已。標籤在這裡起到引用和快捷方式的作用。

列出特定的某個鏡像,也就是說指定倉庫名和標籤

<code>docker image ls ubuntu:16.04/<code>

查看該鏡像的詳細信息,返回的是一個JSON格式的消息。

<code> docker inspect 1e0c3dd64ccd/<code>

4、刪除鏡像

更多的時候是用 短 ID 來刪除鏡像,一般取IMAGE ID 前3個字符以上,只要足夠區分於別的鏡像就可以了。

<code>docker rmi 501/<code>

我們也可以用鏡像名,也就是 :,來刪除鏡像。

<code>docker rmi redis/<code>

強制刪除鏡像(不推薦使用-f參數來強制刪除一個存在容器依賴的鏡像,這樣會造成一些遺留問題。)

<code>docker rmi -f redis/<code>

需要刪除所有倉庫名為 redis 的鏡像:

<code>docker rmi $(docker image ls -q redis)/<code>

刪除所有鏡像

<code>docker rmi $(docker images -q)/<code>

5、鏡像創建

創建鏡像的方式有三種:基於已有鏡像的容器創建、基於Dockerfile創建。

5.1 基於已有鏡像的容器創建

該方式主要用docker commit命令,其命令格式為:

<code>docker commit [選項]  [[:]]/<code>

主要選項為:

  • -a, –author=”” 作者信息
  • -m, –message=”” 提交信息
  • -p, –pause=true 提交時暫停容器運行

對已啟動的鏡像進行修改,我們做的任何文件修改都會被記錄於容器存儲層裡。而 Docker 提供了一個 docker commit 命令,可以將容器的存儲層保存下來成為鏡像。換句話說,就是在原有鏡像的基礎上,再疊加上容器的存儲層,並構成新的鏡像。 我們可以用下面的命令將容器保存為鏡像:

<code>docker commit \\    --a "gmg" \\    --m "update page" \\    webserver \\    nginx:v2/<code>

至此,我們第一次完成了定製鏡像,使用的是 docker commit 命令,手動操作給舊的鏡像添加了新的一層,形成新的鏡像,對鏡像多層存儲應該有了更直觀的感覺。

5.2 基於Dockerfile創建

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

基本結構:基礎鏡像、維護者信息、鏡像操作命令、容器啟動時指令。例如:

<code># 第一行必須指定基於的容器鏡像FROM ubuntu# 維護者信息MAINTAINER docker_user [email protected]# 鏡像的操作指令RUN echo “deb http://archive.ubuntu.com/ubuntu/ raring main universe” >> /etc/apt/sources.listRUN apt-get update && apt-get install -y nginxRUN echo “\\ndaemon off;” >> /etc/nginx/nginx.conf# 容器啟動時執行指令CMD /usr/sbin/nginx/<code>

Dockerfile命令詳解:

<code>1、FROM   ```格式為 FROM <image> 或 FROM <image>:```Dockerfile 的第一條指令必須為 FROM 指令。並且,如果在同一個 Dockerfile 中創建多個鏡像時,可以使用多個 FROM 指令。2、MAINTAINER   ```格式為 MAINTAINER <name>,指定維護者信息。```3、RUN   有兩種格式,分別為:```RUN <command>RUN [“executable”, “param1”, “param2”]。```前者將在 shell 終端中運行命令,即 /bin/sh -c,後者則使用 exec 執行。指定使用其他終端可以通過第二種方式實現,例如 RUN  [“/bin/bash”, “-c”, “echo hello”]。  每條 RUN 指令將在當前鏡像的基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 \\ 來換行。4、CMD   ```CMD [“executable”, “param1”, “param2”] 使用 exec 執行,推薦方式。CMD command  在/bin/sh 中執行,提供給需要交互的應用。CMD [“param1”, “param2”] 提供給 ENTRYPOINT 的默認參數。```指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條 CMD 命令,只有最後一條會被執行。如果用戶在啟動容器時指定了要運行的命令,則會覆蓋掉 CMD 指定的命令。5、EXPOSE  EXPOSE 指令是聲明運行時容器提供服務端口。告訴 Docker 服務,容器需要暴露的端口號,供互聯繫統使用。格式為:```EXPOSE <port> [<port>…]```6、ENV  格式有兩種  ```ENV  
<value>ENV <key1>=<value1> <key2>=<value2>...```指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。例如:```ENV PG_MAJOR 9.3ENV PG_VERSION 9.3.4RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH```7、ADD 格式為:```ADD src dest```該命令將複製指定的 src 到容器中的 dest。其中 src 可以是 Dockerfile 所在目錄的一個相對路徑(文件或目錄);也可以是一個 URL;還可以是一個 tar 文件(自動解壓為目錄)。8、COPY 格式為: ```COPY src dest```複製本地主機的 src (為 Dockerfile 所在目錄的相對路徑,文件或目錄) 為容器中的 dest。目標路徑不存在時,會自動創建。當使用本地目錄為源目錄時,推薦使用 COPY。9、ENTRYPOINT 兩種格式:```ENTRYPOINT [“executable”, “param1”, “param2”]ENTRYPOINT command param1 param2 (shell 中執行)```ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程序及參數。ENTRYPOINT 在運行時也可以替代,不過比 CMD 要略顯繁瑣,需要通過 docker run 的參數 --entrypoint 來指定。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個 ENTRYPOINT 時,只有最後一個生效。10、VOLUME 格式:```VOLUME ["", ""...]VOLUME ```創建一個可以從本地或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。 11、USER格式: ```USER ```USER 指令和 WORKDIR 相似,都是改變環境狀態並影響以後的層。WORKDIR 是改變工作目錄,USER 則是改變之後層的執行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份。USER 只是幫助你切換到指定用戶而已,這個用戶必須是事先建立好的,否則無法切換。```RUN groupadd -r redis && useradd -r -g redis redisUSER redisRUN [ "redis-server" ]```12、WORKDIR 格式:```WORKDIR ```為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如: ```WORKDIR /aWORKDIR bWORKDIR cRUN pwd```則最終路徑為 /a/b/c。13、ONBUILD 格式:```ONBUILD ```ONBUILD 是一個特殊的指令,它後面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當前鏡像構建時並不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。Dockerfile 中的其它指令都是為了定製當前鏡像而準備的,唯有 ONBUILD 是為了幫助別人定製自己而準備的。 ### 參考文檔 - Dockerfie 官方文檔:https://docs.docker.com/engine/reference/builder//<value2>/<key2>/<value1>/<key1>/<value>
/<port>/<port>/<command>/<name>
/<image>/<image>/<code>
  • Dockerfile 最佳實踐文檔:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
  • Docker 官方鏡像 Dockerfile:https://github.com/docker-library/docs

創建鏡像

編寫完成 Dockerfile 之後,可以通過 docker build 命令來創建鏡像。基本的格式為 docker build [選項] 路徑,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile ,並將該路徑下所有內容發送給 docker 服務端,由服務端來創建鏡像。因此一般建議放置 Dockerfile 的目錄為空目錄。

另外,可以通過 .dockerignore 文件來讓 docker 忽略路徑下的目錄和文件。 要指定鏡像的標籤信息,可以通過 -t 選項來實現。 例如,指定 Dockerfile 所在路徑為 /tmp/docker_builder/,並且希望生成鏡像標籤為 build_repo/first_image,可以使用下面的命令:

<code>$ sudo docker build -t build_repo/first_image /tmp/docker_builder/# 如果不想使用上次 build 過程中產生的 cache 可以添加 --no-cache 選項$ sudo docker build --no-cache -t build_repo/first_image /tmp/docker_builder/<code>

6、存出和載入鏡像

  • 存出鏡像 如果想存出文件到本地文件,可以用docker save命令。例如將本地的鏡像ubuntu:14.04鏡像為文件ubuntu_14.04.tardocker save -o ubuntu_14.04.tar ubuntu:14.04
  • 載入鏡像 可以使用docker load 從存入的本地文件中導入到本地鏡像庫。例如從文件ubuntu_14.04.tar導入鏡像到本地鏡像列表。docker load --input ubuntu_14.04.tar 7、上傳鏡像使用docker push命令上傳鏡像到倉庫。默認上傳到DockerHub官方倉庫(需要登錄)。命令格式:docker push NAME[:TAG] 例如用戶user上傳本地的test:latest鏡像,可以添加新的標籤user/test:latest,啟用docker push命令上傳鏡像。docker tag test:latest user/test:latest docker push user/test:latest 第一次使用時,會提示輸入登錄信息。


分享到:


相關文章: