1. 程式人生 > >Docker 入門實戰二(映象與Dockerfile)

Docker 入門實戰二(映象與Dockerfile)

什麼是映象?

  • 映象是用於建立容器的只讀模板

  • 映象是通過Docker build命令建立

  • 映象由映象層構成

  • 映象儲存於Docker Registry

映象命令

1 docker images :列出本地映象

 docker images [OPTIONS] [REPOSITORY[:TAG]]
  • -a :列出本地所有的映象(含中間映像層,預設情況下,過濾掉中間映像層)
  • --digests :顯示映象的摘要資訊;
  • -f :顯示滿足條件的映象;
  • --format :指定返回值的模板檔案;
  • --no-trunc :
    顯示完整的映象資訊;
  • -q :只顯示映象ID。

Repository倉庫名,tag 標籤,image id 映象id ,created 建立時間 ,size 大小

2 docker search : 從Docker Hub查詢映象

docker search [OPTIONS] TERM
  • --automated :只列出 automated build型別的映象;
  • --no-trunc :顯示完整的映象描述;
  • -s :列出收藏數不小於指定值的映象。

name 映象名,description 描述,starts 關注OFFICIAL 官方認證

下載映象的時候注意是否為官方,看關注數量

3 docker pull : 從映象倉庫中拉取或者更新指定映象

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  •  -a :拉取所有 tagged 映象
  • --disable-content-trust :忽略映象的校驗,預設開啟

如果後面不寫版本號,預設是latest (最新的)

4 docker rmi : 刪除本地一個或多個映象

docker rmi [OPTIONS] IMAGE [IMAGE...]
  • -f :強制刪除;
  • --no-prune :不移除該映象的過程映象,預設移除

看報錯就知道,該映象被容器所引用無法刪除,必須強制刪除

 

5 docker login/logout : 登入、登出docker倉庫

docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
  • -u :登陸的使用者名稱
  • -p:登入的密碼
登入
$ docker login -u 使用者名稱 -p 密碼
登出
$ docker logout

6 docker tag : 標記本地映象,將其歸入某一倉庫

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
例項
[[email protected] demo]# docker tag wget:0.1 xiekcdocker/wget:0.1

7 docker push :將映象上傳至倉庫 

docker push [OPTIONS] NAME[:TAG]
  • --disable-content-trust :忽略映象的校驗,預設開啟 
[[email protected] demo]# docker push wget:0.1
The push refers to repository [docker.io/library/wget]
61bd8543f10b: Preparing
071d8bd76517: Preparing
denied: requested access to the resource is denied
[[email protected] demo]# docker push xiekcdocker/wget:0.1
The push refers to repository [docker.io/xiekcdocker/wget]
An image does not exist locally with the tag: xiekcdocker/wget
[[email protected] demo]# docker tag wget:0.1 xiekcdocker/wget:0.1
[[email protected] demo]# docker push xiekcdocker/wget:0.1
The push refers to repository [docker.io/xiekcdocker/wget]
61bd8543f10b: Pushed
071d8bd76517: Pushed
0.1: digest: sha256:b3de14f7e54e6a732c3e02b2c0f8d9606be0c0b99e8b34d365c71d444eb862ff size: 741

去hub.docker上看下倉庫,成功!

先建立一個簡單的Dockerfile 

vi Dockerfile
插入以下程式碼
FROM centos
LABEL maintainer "wget-test0.1"
RUN yum install -y wget
打包映象
[[email protected] demo]# docker build -t wget:0.1 .
[[email protected] demo]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wget                0.1                 ecae4808d003        2 minutes ago       272MB

一個簡單的centos映象就建立完畢。上面的5-7可以通過這個測試。

什麼是Dockerfile?

 

  • Dockerfile 是 Docker 的 RPM Spec檔案

  • Dockerfile 是一個包含使用者建立Docker映象所有指令的文字檔案

  • Dockerfile 中的指令指定在建立Docker 映象時做什麼操作

  • Docker 讀取Dockerfile中指令建立Docker映象

  • 每個指令將建立新的Docker映象層

下面我來介紹dockerfile的各個引數的作用以及用法

DockerFile檔案

  • Dockerfile必須以FROM 開頭,指定baseimage

  • 語法

    • FROM <images> [AS <name>]

    • FROM <image> [:<tag>] [AS <name>

WORKDIR指令

  • WORKDIR指令設定RUN,CMD,ENTRYPOINT,COPY和ADD的工作目錄

  • 語法

    • WORKDIR /path/to/directory

  • 預設WORKDIR是根目錄/,任何通過WORKDIR指令設定的WORKDIR都相對於根目錄/

  • 在同一Dockerfile中可設定多個WORKDIR指令,如果設定WORKDIR為絕對路徑,後續WORKDIR指令設定的相對路徑被附加到初始絕對路徑

COPY和ADD指令

  • COPY和ADD指令實現從主機到容器的檔案傳輸功能

  • COPY支援簡單 的檔案服務

  • ADD除了COPY支援的功能外還支援其他功能如:tar包,自動解壓,遠端url等

  • 語法

    • ADD <source><destination>

    • COPY <source><destination>

    • ADD -–chown=<user>:<group><source><destination>

    • COPY -–chown=<user>:<group><source><destination>

使用注意點:

  • 如果destination不存在,則自動建立

  • 所有新建立的檔案或者資料夾UID和GID為0,即root使用者,通過–chown選項修改

  • 如果destination 末以/結尾,則認為destination為檔案,source內容將寫入檔案

  • 如果source包含萬用字元,則destination必須為目錄,且以/結尾,否則build失敗

  • source 必須在build上下文存在,不能build上下文之外

  • 針對ADD指令

    • 如果source是url,而destination不是目錄不以/結尾,則從url下載的檔案寫入destination;

    • 如果destination是目錄且以/結尾,則URL對應的檔案被下載到destination所在目錄,如<destination>/<filename>;

    • 如果source是本地tar包,tar包被自動解壓為目錄,而遠端tar包暫時不支援

RUN指令

  • 語法

    • RUN <command>

    • RUN [“executable”,“parameter 1”,“parameter 2”]

  • RUN指令在容器的可寫入層被執行命令,並commit容器為新的映象

  • 上一步RUN指令生成的映象被接下來RUN使用,每次RUN指令生成一個新的映象

  • Dockerfile中最好用鏈式輸入命令以減少建立映象層數量 command && command

CMD/ENTRYPOINT指令

  • 如何指定啟動容器時執行什麼命令

  • 語法

    • CMD [“executable”,“param1”,“param2”](exec形式)

    • CMD[“param1”,“param2”](作為ENTRYPOINT的預設引數)

    • CMD command param1 param2(shell 形式)

    • ENTRYPOINT [“executable”,“param1”,“param2”] (exec形式 )

    • ENTRYPOINT command param1 param2 (shell 形式)

  • 如果在Dockerfile中不指定CMD/ENTRYPOINT指令,Docker將使用基礎映象提供的預設命令

  • CMD/ENTRYPOINT指令在建立Docker映象時不執行,只有在容器啟東時才執行

  • 既可以使用exec形式也可以shell形式指定要執行的指令

 

  No ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT [“exec_entry”,“p1_entry”]
No CMD error,not allowed /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD[“exec_cmd”,“p1_cmd”] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry exec_cmd p1_cmd
CMD[“p1_cmd”,“p2_cmd”] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd /bin/sh -c exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
  • ENTRYPOINT 指令最好以exec形式執行,如果以shell形式則一些引數不能正確傳入或不能正常工作

  • shell形式整個命令作為引數傳入,可執行子命令,管道等

  • exec形式不會呼叫shell命令,這意味著shell的一些特性如變數替換,管道等不能正常工作

  • shell形式下將以/bin/sh -c 呼叫可執行程式,這意味著可執行程式沒有PID與之對應,將不能接受unix訊號

 

VOLUME指令

  • VOLUME指令在Docker主機上建立目錄並掛載到容器中,通常在Docker的根目錄

  • 語法

    • VOLUME <dir>

EXPOSE指令

  • EXPOSE指令告知Docker容器將監聽在指定的埠

  • 語法

    • EXPOSE <port> [<port>/<protocol>…]


下一篇介紹docker容器的操作命令和實戰