Docker 基礎


1. Docker 簡介

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中, 然后發布到任何流行的 Linux 機器上 
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。Docker 容器通過 Docker 鏡像來創建。容器與鏡像的關系類似於面向對象編程中的對象與類

Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(創建、運行、分發容器)。 客戶端和服務端既可以運行在一個機器上,也可通過 socket 或者RESTful API 來進行通信 
Docker daemon 一般在宿主主機后台運行,等待接收來自客戶端的消息。 Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互. 
vms 和 docker 的區別

 

Docker 是如何工作: 
如下圖:

 

 

 

 

 

Docker 守護進程 
如圖所示, Docker 守護進程運行在一台主機上。用戶並不直接和守護進程進行交互,而是通過 Docker 客戶端間接和其通信

Docker 客戶端 
Docker 客戶端,實際上是 docker 的二進制程序,是主要的用戶與 Docker 交互方式。它接收用戶指令並且與背后的Docker 守護進程通信,如此來回往復

 

Docker 內部 
理解 Docker 內部構建,需要理解以下三種部件: 
Docker 鏡像 - Docker images 
Docker 倉庫 - Docker registeries 
Docker 容器 - Docker containers

 

2. 基本概念

Docker 包括三個基本概念 
鏡像(Image ) 
容器(Container ) 
倉庫(Repository )

 

2.1 Docker 鏡像

Docker 鏡像是 Docker 容器運行時的只讀模板,每一個鏡像由一系列的層 (layers) 組成。Docker 使用 UnionFS 來將這些層聯合到單獨的鏡像中。 UnionFS 允許獨立文件系統中的文件和文件夾(稱之為分支)被透明覆蓋,形成一個單獨連貫的文件系統。正因為有了這些層的存在, Docker 是如此的輕量。當你改變了一個 Docker 鏡像,比如升級到某個程序到新的版本,一個新的層會被創建。因此, 不用替換整個原先的鏡像或者重新建立, 只是一個新 的層被添加或升級了。現在你不用重新發布整個鏡像,只需要升級,層使得分發 Docker 鏡像變得簡單和快速。

2.2 Docker 倉庫

Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。同樣的, Docker 倉庫也有公有和私有的概念。公有的Docker 倉庫名字是 Docker Hub。 Docker Hub 提供了龐大的鏡像集合供使用。這些鏡像可以是自己創建,或者在別人的鏡像基礎上創建。 Docker 倉庫是Docker 的分發部分。

2.3 Docker 容器

Docker 容器和文件夾很類似, 一個Docker容器包含了所有的某個應用運行所需要的環境。每一個 Docker 容器都是從Docker 鏡像創建的。 Docker 容器可以運行、開始、停止、移動和刪除。每一個 Docker 容器都是獨立和安全的應用平台, Docker 容器是 Docker 的運行部分。

3. 安裝Docker

當前的系統版本 centos 7.2 配置了aliyun的yum 源 和epel 源 ,關閉了selinux 和firewalld ,當前IP:10.0.0.160

安裝:

[root@localhost ~]# yum -y install docker-io

  

獲取docker 當前版本:

[root@localhost ~]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: 
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

  

啟動docker daemon后台守護進程

 

[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker

  

3.1 鏡像加速

Docker HUB : Docker鏡像首頁, 包括官方鏡像和其它公開鏡像 
https://hub.docker.com/explore/ 
因為國情的原因,國內下載 Docker HUB 官方的相關鏡像比較慢,可以使用國內的一些鏡像進行加速 
這里我使用的是 Docker 中國的registry mirror 
配置文件如下

[root@localhost ~]# vim /etc/docker/daemon.json 
[root@localhost ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}

  之后重新啟動服務。

[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl restart docker

  

4. Docker 一些常用命令

docker 命令的幫助:

attach      Attach to a running container  # 當前 shell 下 attach 連接指定運行鏡像
  build       Build an image from a Dockerfile  # 通過 Dockerfile 定制鏡像
  commit      Create a new image from a container's changes # 提交當前容器為新的鏡像
  cp          Copy files/folders between a container and the local filesystem   # 從容器中拷貝指定文件或者目錄到宿主機中
  create      Create a new container  # 創建一個新的容器,同 run,但不啟動容器
  diff        Inspect changes on a container's filesystem  # 查看 docker 容器變化
  events      Get real time events from the server  # 從 docker 服務獲取容器實時事件
  exec        Run a command in a running container  # 在已存在的容器上運行命令
  export      Export a container's filesystem as a tar archive  # 導出容器的內容流作為一個 tar 歸檔文件[對應import ]
  history     Show the history of an image  # 展示一個鏡像形成歷史
  images      List images  # 列出系統當前鏡像
  import      Import the contents from a tarball to create a filesystem image   # 從tar包中的內容創建一個新的文件系統映像[對應 export]
  info        Display system-wide information  # 顯示系統相關信息
  inspect     Return low-level information on Docker objects  # 查看容器詳細信息
  kill        Kill one or more running containers  # kill 指定 docker 容器
  load        Load an image from a tar archive or STDIN  # 從一個 tar 包中加載一個鏡像[對應 save]
  login       Log in to a Docker registry  # 注冊或者登陸一個 docker 源服務器
  logout      Log out from a Docker registry # 從當前 Docker registry 退出
  logs        Fetch the logs of a container  # 輸出當前容器日志信息
  pause       Pause all processes within one or more containers    # 暫停容器
  port        List port mappings or a specific mapping for the container # 查看映射端口對應的容器內部源端口
  ps          List containers  # 列出容器列表
  pull        Pull an image or a repository from a registry   # 從docker鏡像源服務器拉取指定鏡像或者庫鏡像 
  push        Push an image or a repository to a registry   # 推送指定鏡像或者庫鏡像至docker源服務器
  rename      Rename a container   #重命名容器
  restart     Restart one or more containers # 重啟運行的容器
  rm          Remove one or more containers  ## 移除一個或者多個容器
  rmi         Remove one or more images  # 移除一個或多個鏡像[無容器使用該鏡像才可刪除,否則需刪除相關容器才可繼續或 -f 強制刪除]
  run         Run a command in a new container  # 創建一個新的容器並運行一個命令
  save        Save one or more images to a tar archive (streamed to STDOUT by default)  # 保存一個鏡像為一個 tar 包[對應 load]
  search      Search the Docker Hub for images  # 在 docker hub 中搜索鏡像
  start       Start one or more stopped containers # 啟動容器 
  stats       Display a live stream of container(s) resource usage statistics  #顯示容器資源使用統計
  stop        Stop one or more running containers # 停止容器
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE  # 給源中鏡像打標簽
  top         Display the running processes of a container  # 查看容器中運行的進程信息
  unpause     Unpause all processes within one or more containers  # 取消暫停容器
  update      Update configuration of one or more containers   
  version     Show the Docker version information  # 查看 docker 版本號
  wait        Block until one or more containers stop, then print their exit codes  # 截取容器停止時的退出狀態值

  

查找 star 數至少為 100 的鏡像

docker search -s 100 ubuntu

  

默認不加 s選項找出所有相關 ubuntu 鏡像

5. 使用鏡像

5.1 拉取鏡像 和 推送鏡像

#拉取鏡像相關操作
[root@localhost ~]# docker pull --help
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]  #用法
Pull an image or a repository from a registry
Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage

#推送鏡像相關操作
[root@localhost ~]# docker push --help
Usage:  docker push [OPTIONS] NAME[:TAG]
Push an image or a repository to a registry
Options:
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage

  

 

例:

# 下載官方 ubuntu docker 鏡像
[root@localhost ~]# docker pull ubuntu

# 下載指定版本 ubuntu 官方鏡像
[root@localhost ~]# docker pull ubuntu:14.04 

 # 推送鏡像庫到私有源[可注冊 docker 官方賬戶,推送到官方自有賬
戶]   省略 

  

5.2 列出鏡像

顯示當前系統鏡像,不包括過渡層鏡像

[root@localhost ~]# docker images

  

 

顯示當前系統所有鏡像

[root@localhost ~]# docker images -a

  

5.3 刪除鏡像

docker rmi 
刪除一個或者多個鏡像

[root@localhost ~]# docker rmi --help
Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
  -f, --force      Force removal of the image  #強制移除鏡像不管是否有容器使用該鏡像 
      --help       Print usage
      --no-prune   Do not delete untagged parents # 不要刪除未標記的父鏡像

  

6. 操作容器

參數太多可以任意組合,可以查看幫助信息

 

 

6.1 運行容器

啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態 
(stopped ) 的容器重新啟動。 
一般隨時刪除和新創建容器。

1. 新建並啟動

[root@localhost ~]# docker run ubuntu /bin/echo 'hello world';
hello world

  

跟在本地直接執行 /bin/echo ‘hello world’ 幾乎感覺不出任何區別,但是是在ubuntu里面執行的這個echo。

啟動一個 bash 終端,允許用戶進行交互

[root@localhost ~]# docker run -it ubuntu /bin/bash
root@50f0b7fa748a:/# echo 'hello world'
hello world

  

利用 docker run 來創建容器時,Docker 在后台運行的標准操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載

  • 利用鏡像創建並啟動一個容器

  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層

  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去

  • 從地址池配置一個 ip 地址給容器

  • 執行用戶指定的應用程序

  • 執行完畢后容器被終止

2. 啟動已終止容器 

可以利用 docker container start 命令,直接將一個已經終止的容器啟動運行。 
先查看容器的id

 

 

[root@localhost ~]# docker container start 9b0fc -i
hello world

  

 查看容器

#查看正在運行的容器
docker ps
#查看所有容器
docker ps -a

  

#查看指定容器信息
[root@localhost ~]# docker inspect  容器ID或者容器NAME

  

注:

后台運行容器 
上面的容器退出,就都停止了,所以有時候容器需要一直運行了

[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

  

此時容器會在后台運行並不會把輸出的結果 (STDOUT) 打印到宿主機上面(輸出結果可以用 
docker logs 查看)。 

獲取容器的輸出信息,可以通過 docker container logs 容器id命令。

容器是否后台運行跟-d 參數 無關, 而是跟后面啟動的命令有關

 

6.2 終止容器

使用 docker container stop 容器id來終止一個運行中的容器。 
當 Docker 容器中指定的應用終結時,容器也自動終止。

[root@localhost ~]# docker container stop 2bf0f

  

 

處於終止狀態的容器,想啟動怎么辦

啟動容器
docker container start 容器id或者容器NAME
重啟容器
docker container restart 容器id或者容器NAME

  

6.3 進入容器

在使用 -d 參數時,容器啟動后會進入后台。某些時候需要進入容器進行操作, 
這個時候 docker exec 命令 

進入容器的前提,這個容器必須要是運行的狀態

[root@localhost ~]# docker exec -it 2bf0 bash

  

 

 

6.5 導出和導入

導出 
導出本地某個容器,可以使用 docker export 命令

[root@localhost ~]# docker export 50f0b7fa748a > ubuntu.tar

  

 

 這樣將導出容器快照到本地文件。

導入容器快照 
可以使用 docker import 從容器快照文件中再導入為鏡像,例如

[root@localhost ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0

  

 

 也可以通過指定 URL 或者某個目錄來導入,例如

docker import http://example.com/exampleimage.tgz example/imagerepo

  

注:用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker 
import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷 
史記錄和元數據信息(即僅保存容器當時的快照狀態) ,而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。

 

6.6 刪除容器

可以使用 docker container rm 來刪除一個處於終止狀態的容器。例如

1. 刪除指定容器

[root@localhost ~]# docker container rm distracted_franklin

  

刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。

2. 清理所有處於終止狀態的容器 

用 docker container ls -a 命令可以查看所有已經創建的包括終止狀態的容器,如果數量太 

多要一個個刪除可能會很麻煩,用下面的命令可以清理掉所有處於終止狀態的容器。

[root@localhost ~]# docker container prune 

  

7. 數據管理

 

如何在 Docker 內部以及容器之間管理數據,在容器中管理數據主要有兩種方式:

  • 數據卷(Volumes)

  • 掛載主機目錄 (Bind mounts)

7.1 數據卷

數據卷 是一個可供一個或多個容器使用的特殊目錄它繞過 UFS,可以提供很多有用的特 
性:

    • 數據卷 可以在容器之間共享和重用

    • 對 數據卷 的修改會立馬生效

    • 對 數據卷 的更新,不會影響鏡像

    • 數據卷 默認會一直存在,即使容器被刪除 

注意: 數據卷 的使用,類似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷 。

 1. 創建一個數據卷

[root@localhost ~]# docker volume create my-vol
my-vol

  

2. 查看所有的 數據卷

[root@localhost ~]# docker volume ls

  

3. 查看指定 數據卷 的信息

[root@localhost ~]# docker volume inspect my-vol

  

 

啟動一個掛載數據卷的容器 

創建一個名為 web 的容器,並加載一個 數據卷 到容器的 /wepapp 目錄。

[root@localhost ~]# docker run -d -P \
--name web \
-v my-vol:/wepapp \
training/webapp \
python app.py

  

 

-d 后台運行 ,-P 把docker內部的端口,隨機映射到主機的某端口

進入容器看看是否有這個/wepapp 這個目錄

[root@localhost ~]# docker exec -it web bash

  

查看數據卷的具體信息 
主機里使用以下命令可以查看 web 容器的信息

[root@localhost ~]# docker inspect web

  

數據卷 信息在 “Mounts” Key 下面

 

 

 刪除數據卷 

數據卷 是被設計用來持久化數據的,它的生命周期獨立於容器,Docker 不會在容器被刪除后自動刪除 數據卷 ,並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷 。如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v 這個命令。

 docker volume rm 數據卷名

  

無主的數據卷可能會占據很多空間,要清理請使用以下命令

docker volume prune

  

7.2 掛載主機目錄

掛載一個主機目錄作為數據卷 
創建數據目錄綁定/src/webapp/到到新建容器,

[root@localhost ~]# mkdir -p /src/webapp/
[root@localhost ~]# docker run -it --name ubuntu-webapp  -v /src/webapp:/src/webapp ubuntu:14.04 /bin/bash

  

查看數據卷的具體信息

 

 Docker 掛載主機目錄的默認權限是 讀寫,用戶也可以通過增加ro 指定為 只讀

例:

docker run -d -P \
-v /src/webapp:/opt/webapp:ro \
training/webapp \
python app.py

  

 掛載一個本地主機文件作為數據卷

[root@localhost ~]# docker --help > docker_help.txt
[root@localhost ~]# docker run --rm -it \
-v /root/docker_help.txt:/root/docker_help \
ubuntu:17.10 \
bash

  

 

8. Docker 網絡

Docker 允許通過外部訪問容器或容器互聯的方式來提供網絡服務。

8.1 外部訪問容器

容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 參數來 
指定端口映射。

當使用 -P標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。 

使用 docker container ls 可以看到,本地主機的 49155 被映射到了容器的 5000 端口。此 
時訪問本機的 32769 端口即可訪問容器內 web 應用提供的界面。

 

 

 

 

 

 

 同樣的,可以通過 docker logs 命令來查看應用的信息。

-p 則可以指定要映射的端口,並且,在一個指定端口上只可以綁定一個容器。支持的 
有 ip:hostPort:containerPort 或 ip::containerPort 或 hostPort:containerPort 。

1. 映射所有接口地址

 

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以執行

[root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py

  

此時默認會綁定本地所有接口上的所有地址給映射

 

 

 

2. 映射到指定地址的指定端口 
可以使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址,比如 localhost 地址 
127.0.0.1

[root@localhost ~]# docker container stop zen_galileo 
[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

  

 

 只有本機才能訪問

 

3. 映射到指定地址的任意端口
使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分 
配一個端口。

[root@localhost ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py

  

 

 還可以使用 udp 標記來指定 udp 端口

9. Dockerfile 構建鏡像

Docker 可以通過 Dockerfile 的內容來自動構建鏡像。 Dockerfile 是一個包含創建鏡像所有命令的文本文件,通過docker build命令可以根據 Dockerfile 的內容構建鏡像,

9.1 Dockerfile 的基本語法結構。

Dockerfile 有以下指令選項: 

FROM 
MAINTAINER 
RUN 
CMD 
EXPOSE 
ENV 
ADD 
COPY 
ENTRYPOINT 
VOLUME 
USER 
WORKDIR 
ONBUILD

  

FROM 
用法:

FROM  <image>
或者
FROM指定構建鏡像的基礎源鏡像,如果本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下來。
FROM必須是 Dockerfile 中非注釋行的第一個指令,即一個 Dockerfile 從FROM語句開始。
FROM可以在一個 Dockerfile 中出現多次,如果有需求在一個 Dockerfile 中創建多個鏡像。
如果FROM語句沒有指定鏡像標簽,則默認使用latest標簽。

  

MAINTAINER 
用法:

MAINTAINER <name>
指定創建鏡像的用戶

  

RUN 
RUN 有兩種使用方式

    • shell 格式 
      就像直接在命令行中輸入的命令一樣。

    • exec 格式:

RUN ["可執行文件", "參數1", "參數2"] 
這更像是函數調用中的格式。

  

每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像,后續的RUN都在之前RUN提交后的鏡像為基礎,鏡像是分層的,可以通過一個鏡像的任何一個歷史提交點來創建,類似源碼的版本控制

注:鏡像是只讀的

CMD 
CMD有三種使用方式:

  • shell 格式: CMD <命令>

  • exec 格式: CMD [“可執行文件”, “參數1”, “參數2”…]

  • 參數列表格式: CMD [“參數1”, “參數2”…] 。在指定了 ENTRYPOINT 指令后,用 CMD 指 定具體的參數。 

 

Docker 不是虛擬機,容器就是進程。既然是進程,那么在啟動容器的時候,需要指定所運行的程序及參數。CMD 指令就是用於指定默認的容器主進程的啟動命令的。 
CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最后一個會生效。

CMD的目的是為了在啟動容器時提供一個默認的命令執行選項。如果用戶啟動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。 
CMD會在啟動容器的時候執行, build 時不執行,而RUN只是在構建鏡像的時候執行,后續鏡像構建完成之后,啟動容器就與RUN無關了

 

EXPOSE 
聲明端口

EXPOSE <port> [<port>...]

告訴 Docker 服務端容器對外映射的本地端口,需要在 docker run 的時候使用-p或者-P選項生效。

 

ENV 
設置環境變量格式有兩種:

ENV <key> <value> # 只能設置一個變量
ENV <key1>=<value1> <key2>=<value2>...  # 允許一次設置多個變量

這個指令很簡單,就是設置環境變量而已,無論是后面的其它指令,如 RUN ,還是運行時的應用,都可以直接使用這里定義的環境變量。 

 

ADD

COPY <源路徑>... <目標路徑>
COPY ["<源路徑1>",... "<目標路徑>"]

ADD復制本地主機文件、目錄或者遠程文件 URLS 從 並且添加到容器指定路徑中 。

如果<源路徑> 為一個 tar 壓縮文件的話,壓縮格式為 gzip , bzip2 以及 xz 的情況下, ADD 指令將會自動解壓縮這個壓縮文件到 <目標路徑> 去 

 

COPY

COPY <源路徑>... <目標路徑>
COPY ["<源路徑1>",... "<目標路徑>"]

COPY復制新文件或者目錄從 並且添加到容器指定路徑中 。不能指定遠程文件 URLS。

 

ADD和COPY 差異

  1. ADD 的 源路徑 可以是一個 URL ,COPY 的不可以

  2. ADD 源路勁 為一個 tar 壓縮文件的話,壓縮格式為 gzip , bzip2 以及 xz 的情況下, ADD 指令將會自動解壓縮這個壓縮文件到 <目標路徑> 去。 COPY 不會自動解壓到目標路勁

使用場合注意: 
因此在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,所有的文件復制均使用 
COPY 指令,僅在需要自動解壓縮的場合使用 ADD 。 
盡可能的使用 COPY ,因為 COPY 的語義很明確

 

ENTRYPOINT 
ENTRYPOINT 的格式和 RUN 指令格式一樣,分為 exec 格式和 shell 格式。 
配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run –entrypoint選項。 
每個 Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最后一個生效。

VOLUME 
格式為:

VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>

創建一個可以從本地主機或其他容器掛載的掛載點

 

USER 
USER 指定當前用戶

格式: USER <用戶名>

指定運行容器時的用戶名或 UID,后續的RUN、 CMD、 ENTRYPOINT也會使用指定用戶。

注:USER 只是幫助你切換到指定用戶而已,這個用戶必須是事先建立好的,否則無法切換。

RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]

  

WORKDIR 
格式為

WORKDIR <工作目錄路徑> 

使用 WORKDIR 指令可以來指定工作目錄(或者稱為當前目錄) ,以后各層的當前目錄就被改為指定的目錄,如該目錄不存在, WORKDIR 會幫你建立目錄 
為后續的RUN、 CMD、 ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑

  

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最終路徑是/a/b/c。

  

ONBUILD 
格式:

ONBUILD <其它指令> 。

 

ONBUILD 是一個特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等,而這些指令, 
在當前鏡像構建時並不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候 
才會被執行。 
Dockerfile 中的其它指令都是為了定制當前鏡像而准備的,唯有 ONBUILD 是為了幫助別人 
定制自己而准備的。

一個簡單的案例

構建java環境

[root@localhost jdk]# ls
Dockerfile  jdk-8u191-linux-x64.tar.gz
[root@localhost jdk]# pwd
/data/docker/jdk
[root@localhost jdk]# docker build -t ubuntu:jdk1.8 .
[root@localhost jdk]# docker images
[root@localhost jdk]# docker run -it ubuntu:jdk1.8 bash
root@766e70fb47c2:/# java

  

 

 

 


免責聲明!

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



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