Docker 筆記

Docker

  • 筆記來源:https://docs.docker.com/ 和 《docker 容器和容器云》

  • 此筆記是我在學習過程中的收集,后續還會繼續完善。如果有哪里不正確,可以下面留言或者給我郵箱(wunhwantseng@gmail.com)

Docker

  • Docker 是一個輕量級虛擬化技術。它具備傳統虛擬機無可比擬的優勢,更簡易的安裝和使用方式、更快的速度、服務集成和開發流程自動化,使得 Docker 被廣大技術愛好者青瞇。

Docker daemon

  • Docker daemon 是 Docker 守護進程,負責接收并分發執行 Docker 命令。
  • Docker 命令的執行一般都需要獲取 root 權限。因為 Docker 的命令工具與 Docker daemon 是同一個二進制文件,而 Docker daemon 負責接收并執行來自 docker 的命令,而 Docker daemon 的運行時需要 root 權限。從 Docker 0.5.2 version 開始,Docker Daemon 默認綁定一個 Unix Socket 來代替原來的 TCP 端口,改 Unix Socket 默認是屬于 root 用戶的。因此,在執行 docker 命令時,需要使用 sudo 來獲取 root 權限。

Docker 子命令分類

  • Docker 環境信息
    • info
      • docker info:用于檢查 Docker 是否正確安裝
    • version
      • docker version:
  • 容器生命周期管理
    • create
    • exec
    • kill
    • pause
    • restart
    • rm
    • run
    • start
    • stop
    • unpause
  • 鏡像倉庫命令
    • login
    • logout
    • pull
    • push
    • search
  • 鏡像管理
    • build
    • images
    • import
    • load
    • rmi
    • save
    • tag
    • commit
  • 容器運維操作
    • attach
    • export
    • inspect
    • port
    • ps
    • rename
    • stats
    • top
    • wait
    • cp
    • diff
    • update
  • 容器資源管理
    • volume
    • network
  • 系統日志信息
    • events
    • history
    • logs


      docker命令結構圖.png

Docker 環境信息

Docker info

  • Docker Info 命令用于檢查 Docker 是否正確安裝。如果 Docker 正確安裝,該命令會輸出 Docker 的配置信息。
  • Docker info 命令一般結合 docker version 命令使用,兩者結合使用能夠提取足夠詳細的 Docker 環境信息。
  • docker info

Docker version

  • Docker version 查看 Docker 版本
  • docker --version

Docker 容器生命周期管理

Docker create

  • 創建一個新的容器
  • docker create [options] image [command][arg...]

Docker exec

  • Docker 可以通過 docker exec 命令,可以再容器內直接執行任意命令。該命令的基本格式:
    • -i,--interactive=true|false:是否標準輸入接受用戶輸入命令,默認為 false
    • --privileged=true|false:是否給執行命令以最高權限,默認為 false
    • -t:分配偽終端
    • -u,--user=”“,執行命令的用戶名或 ID
  • docker exec -it 243c32535da7 /bin/bash

Docker kill

  • 殺死一個或多個容器進程
  • docker kill [options] container [container...]
    • -s:發送一個信號給容器(signal to send to the container)
      • docker kill -s=HUP

Docker start/stop/restart

  • 對于已經存在的容器,可以通過 docker start/stop/restart 命令來啟動、停止和重啟。利用 docker run 命令新建一個容器時,Docker 將自動為每個新容器分配唯一的 ID 來標識。docker start/stop/restart 命令一般利用容器 ID 標識確定具體容器,在一些情況下也可以使用容器名來確定容器。
  • docker start 命令使用 -i 選項來開啟交互模式,始終保持輸入流開放。使用 -a 選項來附加標準輸入、輸出或錯誤輸出。此外,docker stop 和 docker restart 命令使用 -t 選項來設定容器停止前等的等待時間。

Docker run

  • Example:docker run [OPTIONS] IMAGE [COMMAND] .[ARG...]
  • docker run 命令用來基于特定的鏡像創建一個容器,并依賴選項來控制該容器。
    • 如:sudo docker run ubuntu echo "Hello Wrold"
      • 這是 docker run 命令最基礎的使用方法,該命令從 ubuntu 鏡像啟動一個容器,并執行 echo 命令來打印出一個“Hello World”。執行完 echo 命令后,容器將停止運行。docker run 命令啟動的容器會隨機分配一個容器 ID(Container Id),用以標識該容器。
    • 如:sudo docker run -i -t --name ubuntu docker.io/ubuntu:latest /bin/bash
      • docker run 命令啟動一個容器,并為它分配一個偽終端執行/bin/bash 命令,用戶可以在該偽終端與容器進行交互。
      • -d:守護狀態運行;
      • -i:表示使用交互模式,始終保持輸入流開放;
      • -t:表示分配一個偽終端,一般兩個參數結合時使用-it,即可在容器利用打開的偽終端進行交互操作;
      • --name:可以指定 docker run 命令啟動的容器的名字。若無此選項,Docker 將為容器隨機分配一個名字。
      • -c:用于給運行在容器中的所有進程分配 CPU 的 shares 指。這是一個相對權重,實際的處理速度還與宿主機 CPU 相關。
      • -m:用于限制為容器中所有進程分配內存總量,以 B、K、M、G 為單位。
      • --link:可以理解為一條 IP 地址的單向紀錄信息,可以讓容器之間安全地進行交互。
        • docker run -rm --name web --link [name]:[alias]
      • -v:用于掛在一個 volume,可以用多個-v 參數同時掛載多個 volume。volume 的格式[host-dir]:[container-dir]:[rw|ro]。
        • Docker 掛載數據卷的默認權限是讀寫(rx),用戶也可以通過 ro 指定為只讀:
      • -p:用于將容器的端口暴露給宿主機的端口,其常用格式為 hostPost:container-Port。通過端口的暴露,可以讓外部主機通過宿主機暴露的端口來訪問容器內的應用。
      • -P:Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口
      • --rm:容器在終止后會立刻刪除。注:--rm 和-d 不能同時使用。

Docker pause

  • 暫停一個或多個容器中的所有進程(pause all processes within one or more containers)
  • docker pause container [container...]

Docker unpause

  • 恢復一個或多個容器中的所有進程(unpause all processes within one or more containers)
  • docker unpause container [container...]

Docker registry 容器鏡像倉庫

  • Docker registry 是存儲容器鏡像的倉庫。用戶可以通過 Docker client 與 Docker registry 進行通信,以此來完成鏡像的搜索、下載和上傳等相關操作。

docker pull

  • Example:docker pull [OPTIONS] NAME[:TAG @DIGEST]
    • OPTIONS:
      • -a:是否獲取倉庫中的所有鏡像,默認為否
      • --all-tags:true|false:等于-a
  • 在使用 docker pull 命令時??梢詮墓俜降?Docker Hub 中的官方鏡像庫、其他公共庫、私人庫中獲取鏡像資源。同時,還可以從私有服務器中獲取鏡像資源。只需在具體的鏡像名前添加用戶名、特定庫名或服務器地址即可獲取鏡像。
    • sudo docker pull ubuntu # 從官方 Hub(Docker Hub) 拉取 Ubuntu:latest 的鏡像
    • sudo docker pull ubuntu:ubuntu12.04 # 從官方 Hub(Docker Hub) 拉取指明"Ubuntu 12.05"Tag 的鏡像
    • sudo docker pull SEL/ubuntu # 從特定的倉庫拉去 Ubuntu 鏡像
    • sudo docker pull 10.10.103.215:5000/sshd # 從其他服務器拉取鏡像

docker push

  • docker push 可以將本地的 image 或 repository 推送到 Docker Hub 的公共或私有鏡像庫、私有服務器。默認上傳到 Docker Hub 官方倉庫
    • docker push [OPTIONS] NAME:[:TAG]
    • docker push [OPTIONS] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/] NAME[:TAG]
      • docker push SEL/ubuntu

docker login

  • 登錄鏡像倉庫
  • docker login [options][server]
    • -p:密碼
    • -u:用戶名

docker logout

  • 從鏡像倉庫退出
  • docker logout [server]

鏡像管理

  • 用戶可以在本地保存鏡像資源,為此 Docker 提供了相應的管理子命令。

docker images

  • docker images 命令可以列出主機上的鏡像,默認只列出最頂層的鏡像,可以使用 -a 選項顯示所有鏡像。
  • docker images [OPTIONS].[REPOSITORY[:TAG]]
    • -a:列出所有的鏡像文件(默認隱藏中間的鏡像)
    • --digests=true|(defalut)false:列出鏡像的數字摘要值
    • -f,--filter:按條件過濾鏡像
      • dangling (boolean - true or false)
      • label (label=<key> or label=<key>=<value>)
      • before (<image-name>:[:<tag>],<image id> or image@digest) - filter images created before given id or references
      • since (<image-name>:[:<tag>],<image id> or image@digest) - fimter images created since given id or references
      • reference (pattern of an image reference) - filter images whose reference matches the specified pattern
        • docker images --filter-reference='ubuntu:latest'
    • --format string: 以 Go 模板格式輸出 (pretty-print images using a go template)
      • template format
        • .ID:image ID
        • .Repository:image repository
        • .Tag:image tag
        • .Digest:image digest
        • .CreatedSince
        • .CrearedAt
        • .Size
      • Example:docker images --format "{{.ID}}:{{.Repository}}"
    • --no-trunc=true|false:不截斷輸出(Don't truncate output)
    • -q,--quiet=true|(default)false:僅輸出 ID 信息

docker tag

  • 為了方便在后續工作中使用特定鏡像,還可以使用 docker tag 命令來為本地鏡像任意添加新的標簽。
  • docker tag <oldImage>:[TAG] <newImage>:[TAG]
  • 這些新的和舊的鏡像的 ID 完全一致。實際上它們指向同一個鏡像文件,只是別名不同而已。docker tag 命令添加的標簽實際上起到類似鏈接的作用。

docker rmi

  • 命令用于移除鏡像,可以支持同時移除多個鏡像,也可以按照條件來移除。
  • docker rmi [OPTIONS] IMAGE [IMAGE...]
    • -f:強制除去鏡像(force removal of image)
    • --no-prune:不要刪除未標記的父鏡像(Do not delete untagged parents)
  • PS:使用 rmi 命令移除鏡像時。如果已有基于該鏡像啟動的容器存在,則無法直接移除,需要先移除容器。當然,提供-f 選項,可強制移除存在容器的鏡像或啟動中的容器。

docker rm

  • 命令用于移除容器,可以支持同時移除多個容器,也可以按照條件來移除。
  • docker rm [OPTIONS] CONTAINER [CONTAINER...]
    • -f:強制殺死并移除一個運行中的容器;(Force the removal of a running container(uses SIGKILL))
    • -l:移除指定鏈接;(remove the specified link)
    • -v:移除容器掛載的數據卷;(remove anonymous volumes associalted with the container)

Volume 數據卷

  • volume 是存在于一個或多個容器中的特定文件或者文件夾,這個目錄以獨立于聯合文件系統的形式在宿主機中存在,并為數據的共享與持久化提供一下便利:
    • volume 在容器創建時就會初始化,在容器運行時就可以使用其中的文件
    • volume 能在不同的容器之間共享和重用
    • 對 volume 中數據的操作會馬上生效
    • 對 volume 中數據的操作不會影響到鏡像本身
    • volume 的生命周期獨立于容器的生命周期,即使刪除容器,volume 仍然會存在,沒有任何容器使用的 volume 也不會被 Docker 刪除

創建 volume

  • 可以通過 docker volume create 創建一個 volume
    • docker volume create --那么 vol_simple
  • 在使用 docker run 和 docker create 創建容器時,也可以使用 -v 標簽為容器添加 volume
    • sudo docker run -d -v /data ubuntu /bin/bash
    • sudo docker run -d -v vol_simple:/data ubuntu /bin/bash

掛載 volume

  • docker 同時也允許我們將宿主機上的目錄掛載到容器中
  • 在 /host/dir 文件夾中的所有文件或文件夾可以在容器的 /container/dir 文件夾下被訪問。如果鏡像中原本存在 /container/dir 文件夾,該文件夾下原有的內容將被隱藏,以保持與宿主機中的文件夾一致。
    • sudo docker run -d -v /host/dir:/container/dir ubuntu /bin/bash
  • 將主機上的文件或文件夾作為 volume 掛載時,可以使用 :ro 指定該 volume 為只讀
    • sudo docker run -it --name vol_read_only -v /host/dir:/container/dir:ro
  • 可以再 volume 掛載時使用 z 和 Z 來指定該 volume 是否可以共享。docker 中默認的是 z,即共享該 volume。也可以在掛載時使用 z 來標注該 volume 為私有數據卷
    • sudo docker run -it --name vol_unshared -v /host/dir:/container/dir:Z ubuntu /bin/bash

共享 volume(--volumes-from)

  • 在使用 docker run 或 docker create 創建新容器時,可以使用 --volumes-from 標簽來使得容器與已有的容器共享 volume。
    • docker run --rm -it --name vol_use --volumes-from vol_simple ubuntu /bin/bash
  • 一個容器掛載了一個 volume ,即使這個容器停止運行,該 volume 仍然存在,其他容器也可以使用 --volumes-from 與這個容器共享 volume。如果有一些數據,比如配置文件、數據文件等,需要在多個容器之間共享,一種常見的做法是創建一個數據容器,其他的容器與之共享 volume;
    • docker run --name vol_data -v /data ubuntu echo "this is a data-only container"
    • docker run -it --name -vol_share1 --volume-from vol_data ubuntu /bin/bash

刪除 volumn

  • 如果創建容器時從容器中掛載了 volume,在/var/lib/docker/volumes 下會生成與 volume 對應的目錄,使用 docker rm 刪除容器并不會刪除與 volume 對應的目錄,這些目錄會占據不必要的存儲空間。在刪除容器時一并刪除:
    • 使用 docker volume rm <volume_name> 刪除 volume
    • 使用 docker rm -v <container_name> 刪除容器
    • 在運行容器時使用 docker run --rm,--rm 標簽會在容器停止運行時刪除容器以及容器所掛載的 volume

創建鏡像

基于已有鏡像的容器創建

  • 該方法主要是使用 docker commit 命令。

    • docker commit [OPTIONS] container [REPOSITORY[:TAG]]

      • -a,--author="":作者信息
      • -c,--change=[ ]:提交的時候執行 Dockerfile 指令,包括 CMD|ENTRYPOINT|ENV|EXPOSR|LABEL|ONBUILD|USER|VOLUME|WORKDIR 等;
      • -m,--message=”“:提交消息
      • -p,--pause=true:提交時暫停容器運行
    • docker commit -m "Add a new file" -a "zhangsan" a925cb40b3f0 test:0.1

基于本地模板導入

  • 用戶可以直接從一個操作系統模板文件導入一個鏡像
  • docker import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]

容器運維操作

docker history

  • 列出鏡像各層的歷史創建信息
  • docker history [options]
    • --format
    • --human,-H(default true):以人類可讀的格式打印大小和日期(print sizes and dates in human readable format)
    • --no-trunc
    • --quiet

docker search

  • 搜索遠程倉庫中共享的鏡像,默認搜索官方倉庫中的鏡像。
    • --filter,-f
    • --limit(default 25):max number of search results
    • --no-trunc
  • docker search [options] term

docker attach

  • 連接到正在運行的容器,觀察該容器的運行環境,或與容器的主進程進行交互。
  • 將本地標準的輸入、輸出、異常流附加到正在運行的容器(Attach local standard input,output,error streams to a running container)
  • docker attach [options] container
    • --detach-keys:覆蓋用于分離容器的密鑰(override the key sequence for detaching a container)
    • --no-stdin:不附加標準輸入(do not attach stdin)
    • --sig-proxy(default true):將所有接收到的信號代理到流程(proxy all receiced signals to the process)

docker inspect

  • 查看鏡像和容器的詳細信息,默認會以 JSON 數組渲染(輸出:render)??梢酝ㄟ^--format 參數來指定輸出的模板格式。
  • docker inspect [options] name|id [name:id...]
    • --format, -f:使用給定的 go 模板格式化輸出(format the output using given go template)
    • --size, -s:如果類型為容器,則顯示總文件大小(Diplay total files size if the type is container)
    • --type:返回一個指定類型的 JSON(return json for specified type)

docker ps

  • 容器列表(List Containers)
  • 可以查看容器相關信息,默認只顯示正在運行的容器信息??梢圆榭吹降男畔?Container ID、Names、image、status、容器運行后執行的 COMMAND、創建時間 CREATED 和綁定開啟的端口 PORTS。
  • docker ps [options]
    • -a:顯示所有容器,默認只顯示正在運行的容器。 (show all containers,default show just running)
    • --latest,-l:顯示最新創建的容器,包括所有的狀態。(show the latest created container,includes all states)
    • --last,-n(default -1):顯示最后創建 N 個的容器,包括所有的狀態。(show n last created containers.incluedes all states)
    • --filter,-f:根據提供的條件過濾輸出。(filter output based on conditions provided)
    • --format:pretty-print containers using a go template
    • --no-trunc:don't truncate output
    • --quiet,-q:only display numeric ids
    • --size,-s:display total file sizes

docker commit

  • 可以將一個容器固化為一個新的鏡像。當需要制作特定的鏡像時,會進行修改容器的配置。如:在容器中安裝特定工具等,可以通過該指令將這些修改配置保存起來,使其不會因為容器的停止而丟失。
  • 提交保存時,只能選用正在運行的容器(即可以通過 docker ps 查看的容器)來制定新的鏡像。在制作特定的鏡像時,直接使用該命令指示一個臨時性的輔助命令,不推薦使用。官方建議通過 docker build 命令結合 dockerfile 創建和管理鏡像。
  • docker commit [options] container [repository[:tag]]
    • --author,-a:Author(eg:"John Hanibal Smith hannibal@a-team.com")
    • --change,-c:通過 dockerfile 指令應用于創建的鏡像(Apply Dockerfile instruction to the created image)
    • --message,-m:提交信息(commit message)
    • --pause,-p(default true):在操作期間暫停容器(Pause container during commit)

docker logs

  • 打印容器中進程的運行日志
    • docker logs [options] container

docker events

  • 打印出實時的系統事件
    • docker events [options]

docker stats

  • docker stats 命令是 Docker 1.5 版本中最新提供的命令,專門用于容器狀態信息的統計,同時它還有配套的 API(GET/containers/(id)/stats),可供開發人員調用。使用該命令,用戶可以實時監控啟動中的容器的運行情況,包括 CPU、內存、快設備 I/O 和網絡 I/O,這些信息都會定期刷新以顯示最新的運行情況。
  • 顯示容器資源使用情況統計信息的實時流(display a live stream of container(s) resource usage statistics)

docker port

  • 查看當前映射的端口配置,也可以查看綁定的地址
  • docker port conatiner [private_port[/proto]]

存出和載入鏡像

docker save

  • 如果要導出鏡像到本地文件,可以使用 docker save 命令。
  • docker save -o ubuntu_14.04.tar ubuntu:14.04

docker load

  • 使用 docker load 將導出的 tar 文件再導入到本地鏡像庫
  • docker load --input ubuntu_14.04.tar
  • docker load < ubuntu_14.04.tar

Dockerfile

  • Dockerfile 是 Docker 用來構建鏡像的文本文件,包含自定義的指令和格式。

docker build 命令和鏡像構建過程

鏡像構建過程

  • 一般情況下,將本地主機的一個包含 Dockerfile 的目錄中的所有內容作為上下文。上下文通過 docker build 命令傳入 Docker daemon 后,便開始按照 Dockerfile 中的內容構造鏡像。
  • Dockerfile 描述了組裝鏡像的步驟,其中每條指令都是單獨執行的。除了 FROM 指令,其他每一條指令都會在上一條指令生成鏡像的基礎上指令,執行完后悔生成一個新的鏡像層,新的鏡像層覆蓋在原來的鏡像之上從而形成了新的鏡像。Dockerfile 所生成的最終鏡像就是在基礎鏡像上面疊加一層層的鏡像層組建的。
  • 為了提高鏡像構造的速度,Docker daemon 會緩存構建過程中的中間鏡像。當從一個已在緩存中的基礎鏡像開始構建新鏡像時,會將 Dockerfile 中的下一條指令和基礎鏡像的所有子鏡像做比較。如果有一個子鏡像是由相同的指令生成的,則命中緩存直接使用該鏡像,而不需要再生成一個新的鏡像。在尋找緩存的過程中,COPY 和 ADD 指令與其他指令稍有不同,其他指令只對比生成鏡像的指令字符串是否相同;ADD 和 COPY 指令除了對比指令字符串,還要對比容器中的文件內容和 ADD、COPY 所添加的文件內容是否相同。此外,鏡像構建過程中,一旦緩存失敗,則后續的指令都將生成新的鏡像,而不再使用緩存。
  • 格式:docker build -t <image>:[tag] <dockerfile_path>

Dockerfile 指令

MAINTAINER

FROM

  • 格式:FROM <image> 或 FROM <image>:<tag>
    • FROM 指令的功能是為后面的指令提供基礎鏡像。因此一個有效的 Dockerfile 必須以 FROM 指令作為第一條非注釋指令。從公共鏡像庫中拉去鏡像很容易,基礎鏡像可以選擇任何有效的鏡像。在一個 Dockerfile 中,FROM 指令可以出現多次,這樣會構造多個鏡像。在每個鏡像創建完成后,Docker 命令行界面會輸出該鏡像的 ID。若 FROM 指令中參數 tag 為空,則 tag 默認是 latest;若參數 image 或者 tag 指令的鏡像不存在,則返回錯誤。

ENV

  • 格式:ENV <key> <value> 或 ENV <key> = <value> ...
    • ENV 指令可以為鏡像創建出來的容器生命環境變量。并且在 Dockerfile 中,ENV 指令聲明的環境變量會被后面的指定指令(即 ENV、ADD、COPY、WORKIR、EXPOSE、VOLUME、USER)解釋使用。其他指令使用環境變量時,使用格式為variable_name或者{variable_name}。在變量前面添加斜杠\可以轉移,如\foo或者\\{foo},將會被分別轉為foo 和\{foo},而不是環境變量所保存的值。另外,ONBUILD 指令不支持環境更換。

COPY

  • 格式:COPY <src> <dest>
    • COPY 指令復制<src>所指向的文件或目錄,將它添加到新鏡像中,復制的文件或目錄在鏡像中的路徑是<dest>。<src>所指定的源可以有多個,但必須在上下文中,即必須是上下文根目錄的相對路徑。不能使用如 COPY ../someplace/something|someplace 這樣的值。此外,<src>可以使用通配符指向所有匹配通配符的文件或目錄。例如,COPY home* /mydir/表示復制所有以"hom"開頭的文件到目錄/mydir/。
    • <dest>可以是文件或目錄,但必須是目標鏡像中的絕對路徑或者相對于 WORKIR 的相對路徑(WORKIR 即 Dockerfile 中 WORKIR 指令指定的路徑,用來為其他指令設置工作目錄)。若<dest>以反斜杠/結尾則其指向的是目錄;否則<src>所指向的文件或目錄中的內容會被復制添加到<dest>目錄中,當<src>指定多個源時,<dest>必須是目錄。另外,如果<dest>不存在,則路徑中不存在的目錄被創建。

RUN

  • 格式:RUN <command> (shell 格式),RUN ["executable","param1","param2"] (exec 格式,推薦格式)
    • RUN 指令會在前一條命令創建出的鏡像基礎上創建一個容器,并在容器中運行命令,在命令結束運行之后提交容器為新鏡像,新鏡像被 Dockerfile 中的下一條指令使用。
    • RUN 指令的兩種格式表示命令在容器中的兩種運行方式。當使用 shell 格式時,命令通過/bin/sh -c 運行;當使用 exec 格式時,命令是直接運行的,容器不調用 shell 程序,即容器中沒有 shell 程序。exec 格式中的參數會當成 JSON 格式被 Docker 解析,故必須使用雙引號而不能使用單引號。因為 exec 格式不會再 shell 中執行,所以環境變量的參數不會被替換。例如:當執行 CMD["echo","HOME"]指令時,HIOME不會做變量替換。如果希望執行shell程序,指令可以寫成CMD["sh","-c","echo","$HOME"]。

ADD

  • 格式:ADD <src> <dest>
    • ADD 與 COPY 指令在功能上很相似,都支持復制本地文件到鏡像的功能,但 ADD 指令還支持其他功能。<src> 可以是一個指向網絡文件的 URL,此時若<dest>指向一個目錄,則 URL 必須是完全路徑,這樣可以獲得網絡文件的文件名 filename,該文件會被復制添加到<dest>/<filename>。例如:ADD http://example.com/foobar /創建文件/foobar。
    • <src>還可以指向一個本地壓縮歸檔文件,該文件在復制到容器中時會被壓縮提取,如:ADD example.tar.xz /。但若 URL 中的文件為歸檔文件則不會被解壓提取。
    • ADD 和 COPY 指令雖然功能很相似。但一般推薦使用 COPY,因為 COPY 只支持本地文件,相比 ADD 而言,它更透明。

CMD

  • 格式:
    • CMD <command>(shell 格式)
    • CMD ["executsble","param1","param2"](exec 格式,推薦)
    • CMD ["param1","param2"](為 ENTRYPOINT 指令提供參數)
  • CMD 指令提供容器運行時的默認值,這些默認值可以是一條指令,也可以是一些參數。一個 Dockerfile 中可以是多條 CMD 指令,但只有最后一條 CMD 指令有效。CMD ["param1","param2"]格式時在 CMD 指令喝 ENTRYPOINT 指令配合使用的,CMD 指令中的參數會添加到 ENTRYPOINT 指令中。使用 shell 和 exec 格式時,命令在容器中的運行方式與 RUN 指令相同。不同在于,RUN 指令在構建鏡像時執行命令,并生成新的鏡像;CMD 指令在構建鏡像時并不執行任何命令,而是在容器啟動時默認將 CMD 指令作為第一條執行的命令。如果用戶在命令行界面運行 docker run 命令時指定了命令參數,則會覆蓋 CMD 指令中的命令。

ENTRYPOINT

  • 格式:
    • ENTRYPOINT <command>(shell 格式)
    • ENTRYPOINT ["executable","param1","param2"](exec 格式,推薦格式)
  • EXTRYPOINT 指令個 CMD 指令類似,都可以讓容器在每次啟動時執行相同的命令,但他們之間又有不同。一個 Dockerfile 中可以有多條 ENTRYPOINT 指令,但只有最后一條 ENTRYPOINT 指令有效。當使用 shell 格式,ENTRYPOINT 指令會忽略任何 CMD 指令和 docker run 命令的參數,并且會運行在 bin/sh -c 中。這以為著 ENTRYPOINT 指令進程為 bin/sh -c 的子進程,進程在容器中的 PID 將不是 1,且不能接受 Unix 信號。

ONBUILD

  • 格式:ONBUILD [INSTRUCTION]
  • ONBUILD 指令的功能是添加一個將來執行的觸發器指令到鏡像中。當該鏡像作為 FROM 指令的參數時,這些觸發器指令就會在 FROM 指令執行時加入到構建過程找那個。

EXPOSE

  • 格式:EXPOSE [<port>...]:expose 80 22 8080
  • 聲明鏡像內服務所監聽的端口

USER

  • 格式:USER daemon。
  • 指定運行容器時的用戶名或 UID,后續的 RUN 等質量也會使用指定的用戶身份。
  • 當服務不需要管理員權限時,可以通過該命令指定運行用戶,并且可以再之前創建所需要的用戶。需要獲取管理員權限可以使用 sudo
    • 例如:RUN groupadd -r postgres && useradd -r -g postgres postgres

WORKDIR

  • 格式:WORKIRD /path/to/workdir

  • 為后續的 RUN、CMD 和 ENTRYPOINT 指令配置工作目錄。

  • 可以使用多個 WORKDIR 指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。如:

    WORKDIR /a
    WORKDIR b
    WORKDIR b
    # 最終路徑為/a/b/c
    

Docker 容器監控維度

容器監控命令

docker ps

  • 通過使用 docker ps 命令,可以查看當前主機上的容器信息,包括 容器 ID、鏡像名、容器啟動執行命令、創建時間、狀態、端口信息和容器名。該命令默認只列出當前正在運行的容器的信息,用戶可以通過使用 -a 參數來列出包括已停止的所有容器的信息。

docker images

  • 通過使用 docker images 命令,可以查看當前主機上的鏡像信息,包括鏡像所屬的庫、標簽、ID、 創建時間和實際大小。該命令默認只會列出所有頂層鏡像的信息,但用戶可以通過 -a 參數來查看所有中間層的鏡像的信息。

docker stats

  • docker stats 是 docker 1.5 版本中最新提供的命令,專門用于容器狀態信息的統一,同時它還有配套的 API(GET /containers/(id)/stats),可供開發人員調用。使用該命令,用戶可以實時監控啟動中的容器運行情況,包括 CPU、內存、塊設備 I/O 和網絡 I/O,這些信息都會定時刷新以顯示最新的運行情況。

docker inspect

  • 可以通過使用 docker inspect 命令,可以查看鏡像或容器的底層詳細信息,來了解鏡像或容器的完整構建信息,包括基礎配置、主機配置、網絡設置、狀態信息等。同時,如果需要查看其特定信息,可以通過 -f 參數來設定輸出格式

docker top

  • 可以通過使用 docker top 命令,可以查看正在運行的容器中的進程的運行情況。該命令可以使用戶在沒有通過 /bin/bash 終端與容器進行交互時,幫助用戶查看容器內的進程信息,包括進程號、父進程號、命令等

docker port

  • docker port 命令用于查看容器與主機之間的端口映射關系信息。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374