Docker 基礎

1. Docker 簡介

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

Docker daemon 做爲服務端接受來自客戶的請求,並處理這些請求(建立、運行、分發容器)。 客戶端和服務端既能夠運行在一個機器上,也可經過 socket 或者RESTful API 來進行通訊 
Docker daemon 通常在宿主主機後臺運行,等待接收來自客戶端的消息。 Docker 客戶端則爲用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互. 
vms 和 docker 的區別
python

 

Docker 是如何工做: 
以下圖:
linux

 

 

 

 

 

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

Docker 客戶端 
Docker 客戶端,其實是 docker 的二進制程序,是主要的用戶與 Docker 交互方式。它接收用戶指令而且與背後的Docker 守護進程通訊,如此來回往復
redis

 

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

 

2. 基本概念

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

 

2.1 Docker 鏡像

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

2.2 Docker 倉庫

Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。一樣的, Docker 倉庫也有公有和私有的概念。公有的Docker 倉庫名字是 Docker Hub。 Docker Hub 提供了龐大的鏡像集合供使用。這些鏡像能夠是本身建立,或者在別人的鏡像基礎上建立。 Docker 倉庫是Docker 的分發部分。json

2.3 Docker 容器

Docker 容器和文件夾很相似, 一個Docker容器包含了全部的某個應用運行所須要的環境。每個 Docker 容器都是從Docker 鏡像建立的。 Docker 容器能夠運行、開始、中止、移動和刪除。每個 Docker 容器都是獨立和安全的應用平臺, Docker 容器是 Docker 的運行部分。ubuntu

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

  

 

 

相關文章
相關標籤/搜索