Docker入門之七Dockerfile

Dockerfile是一個文本格式的配置文本,可使用它來建立自定義的鏡像。首先咱們能夠先看一個dockerfile是什麼樣子。這裏能夠有一個網站不錯:http://dockerfile.github.io,能夠在裏面找到經常使用的開源軟件的dockerfile.例如reids的dockersfile。若是在平常開發中用到的話,直接參考就好了,也是比較方便的。java

#
# Redis Dockerfile
#
# https://github.com/dockerfile/redis
#

# Pull base image.
FROM dockerfile/ubuntu

# Install Redis.
RUN \
  cd /tmp && \
  wget http://download.redis.io/redis-stable.tar.gz && \
  tar xvzf redis-stable.tar.gz && \
  cd redis-stable && \
  make && \
  make install && \
  cp -f src/redis-sentinel /usr/local/bin && \
  mkdir -p /etc/redis && \
  cp -f *.conf /etc/redis && \
  rm -rf /tmp/redis-stable* && \
  sed -i 's/^\(bind .*\)$/# \1/' /etc/redis/redis.conf && \
  sed -i 's/^\(daemonize .*\)$/# \1/' /etc/redis/redis.conf && \
  sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/redis/redis.conf && \
  sed -i 's/^\(logfile .*\)$/# \1/' /etc/redis/redis.conf

# Define mountable directories.
VOLUME ["/data"]

# Define working directory.
WORKDIR /data

# Define default command.
CMD ["redis-server", "/etc/redis/redis.conf"]

# Expose ports.
EXPOSE 6379
View Code

 DockerFile分爲四部分組成:基礎鏡像信息、維護者信息、鏡像操做指令和容器啓動時執行指令。在這四部分中包含若干個指令。下面是指令的介紹。git

1.FROM 基礎鏡像信息github

指定所建立鏡像的基礎鏡像。必須指定且須要在Dockerfile其餘指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image能夠是官方遠程倉庫中的,也能夠位於本地倉庫。格式:FROM <image>或FROM <image>:<tag>  redis

2.MAINTAINER指定維護者信息docker

用於將image的製做者相關的信息寫入到image中。當咱們對該image執行docker inspect命令時,輸出中有相應的字段記錄該信息,格式:MAINTAINER <name>shell

3.RUN 運行指定命令ubuntu

格式:RUN<command>或RUN["executable","param1","param2"].前者默認在shell終端中運行命令。即/bin/sh -c,後者則使用exec執行,不會啓動shell環境,指定使用其餘終端類型能夠經過第二種方式實現例如RUN ["/bin/bash","-c",''each hello"].每條RUN指令將在當前鏡像的基礎上執行指定命令,並提交爲新的鏡像,當命令較長可使用\來換行。bash

4.CMD ide

用於container啓動時指定的操做。該操做能夠是執行自定義腳本,也能夠是執行系統命令。該指令只能在文件中存在一次,若是有多個,則只執行最後一條。格式:CMD["executable","param1","param2"].使用exec執行。CMD command param1 param2 在/bin/sh中執行,提供給須要交互的應用。 CMD ["param1","param2"]提供給ENTRYPORT的默認參數。學習

5.ENTRYPOINT

指定容器啓動時執行的命令,能夠屢次設置,可是隻有最後一個有效。

ENTRYPOINT ["executable""param1""param2"] (like an exec, the preferred form)  
ENTRYPOINT command param1 param2 (as a shell) 

該指令的使用分爲兩種狀況,一種是獨自使用,另外一種和CMD指令配合使用。

當獨自使用時,若是你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。

另外一種用法和CMD指令配合使用來指定ENTRYPOINT的默認參數,這時CMD指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定參數。

6.LABEL

給鏡像添加信息。格式 LABEL <key>=<value> 

7.EXPOSE

該指令會將容器中的端口映射成宿主機器中的某個端口。當你須要訪問容器的時候,能夠不是用容器的IP地址而是使用宿主機器的IP地址和映射後的端口。要完成整個操做須要兩個步驟,首先在Dockerfile使用EXPOSE設置須要映射的容器端口,而後在運行容器的時候指定-p選項加上EXPOSE設置的端口,這樣EXPOSE設置的端口號會被隨機映射成宿主機器中的一個端口號。也能夠指定須要映射到宿主機器的那個端口,這時要確保宿主機器上的端口號沒有被使用。EXPOSE指令能夠一次設置多個端口號,相應的運行容器的時候,能夠配套的屢次使用-p選項.

8.ENV

指定環境變量,格式ENV<key><value>或ENV <key>=<value>在鏡像生成過程當中會被後續的RUN指令使用,在鏡像啓動的容器中也會存在。也能夠經過在docker run --env key=value時設置或修改環境變量。假如你安裝了JAVA程序,須要設置JAVA_HOME,那麼能夠在Dockerfile中這樣寫:ENV JAVA_HOME /path/to/java/dirent.

9.ADD

全部拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0;若是是一個目錄,那麼會將該目錄下的全部文件添加到container中,不包括目錄;若是文件是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);若是<src>是文件且<dest>中不使用斜槓結束,則會將<dest>視爲文件,<src>的內容會寫入<dest>;若是<src>是文件且<dest>中使用斜槓結束,則會<src>文件拷貝到<dest>目錄下.格式:ADD <src> <dest> .<src> 是相對被構建的源目錄的相對路徑,能夠是文件或目錄的路徑,也能夠是一個遠程的文件url;<dest> 是container中的絕對路徑.

10.COPY

複製本地主機的src(爲Dockerfile所在目錄的相對路徑、文件或目錄)下的內容到鏡像中的dest下,目標路徑不存在時會自動建立。格式:COPY <src> <dest>.

11.VOLUME

使容器中的一個目錄具備持久化存儲數據的功能,該目錄能夠被容器自己使用,也能夠共享給其餘容器使用。咱們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉後,全部的更改都會丟失。當容器中的應用有持久化數據的需求時能夠在Dockerfile中使用該指令。格式:VOLUME ["/data"]

12.USER

設置啓動容器的用戶,默認是root用戶。格式USER daemon。當服務不須要管理員權限時,能夠經過該命令指定運行用戶。

13.WORKDIR

爲後續的RUN CMD ENTRYPOINT指定配置工做目錄。格式 WORKDIR /path/to/workdir.

14.ONBUILD

配置當所建立的鏡像做爲其餘鏡像的基礎鏡像時所執行的建立操做指令。格式 ONBUILD [INSTRUCTION].

15.ARG

指定一些鏡像內使用的參數(例如版本號信息等).這些參數在執行docker build命令時才以 --build-arg <varname>=<value>格式傳入。格式:ARG <name>[=default value].能夠用docker build --build-arg <name>=<value>來指定參數值。

上面基本就是主要的經常使用的指令,也算是把docker入門學了一下,其實docker還有不少東西,在之後的博客中會慢慢的學習,打算再分進階、高級、實戰來深刻學習docker。

相關文章
相關標籤/搜索