2017年05月04日 20:08:33 閱讀數:2046更多nginx
我的分類: 服務器運維git
英文原文連接地址: Engine reference–>Dockerfile referencedocker
推薦你們直接看官方英文文檔就行了shell
如下內容會幫助你們瞭解什麼是Dockerfile,以及如何編寫Dockerfile,經過一些示例來幫助你們更快速理解和掌握編寫Dockerfile的方法。apache
Dockerfile
是一種能夠用於建立鏡像的文件,相似於makefile,它是一個包含了全部用於建立鏡像的命令的有序序列的文本文件。ubuntu
使用 Dockerfile
的方法是:數組
$ > docker build -t 'ubuntu:git' . Sending build context to Docker daemon 59.39 kB Step 1 : FROM ubuntu ---> c5f1cf30c96b Step 2 : CMD apt-get update && apt-get upgrade ---> Running in ccb83c0f7e1d ---> a35ebd488b21 Removing intermediate container ccb83c0f7e1d Step 3 : CMD apt-get install git ---> Running in 39a8134ca865 ---> e516586de6ce Removing intermediate container 39a8134ca865 Successfully built e516586de6ce $ > docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu git e516586de6ce About a minute ago 120.8 MB
Dockerfile
文件的格式以下bash
# Comment INSTRUCTION arguments
#
井號開頭的表示註釋行;服務器
INSTRUCTION
指令是不區分大小寫的,可是爲了便於區分建議使用全大寫格式。網絡
這個文件的做用是根據文件內定義的規則過濾掉不須要 push
的文件。
過濾規則:
*.md
!README.md
*.md
過濾掉全部以.md結尾的文件, !README.md
不過濾README.md文件。
設置環境變量指令,用法 ENV WORKPATH /tmp
,也能夠這樣: ENV abc=bye def=$abc
。第一種用法用於設置單個變量(第一個空格前爲key,以後都是value,包括後面的空格),第二種用於同時設置多個變量(空格爲分隔符,value中包含空格時能夠用雙引號把value括起來,或者在空格前加\反斜線),當須要同時設置多個環境變量時推薦使用第二種格式。
ENV
用法以下:
ENV <key> <value> ENV <key>=<value> ... 示例: ENV myName John Doe ENV myDog Rex The Dog ENV myCat fluffy ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffy
設置基礎鏡像,一個有效的Dockerfile必須有一個 FROM
指令指定一個基礎鏡像,這個鏡像能夠是任何你能夠從共用倉庫獲取到的鏡像。執行命令格式 FROM <image>
或者 FROM <image>:<tag>
或者 FROM <image>@<digest>
,下面是一些注意信息:
- `FROM`指令必須是第一個非註釋的指令;
- `FROM`能夠在一個Dockerfile中出現屢次,好比咱們建立多個鏡像時,在新的`FROM`指令以前只須要輸出最後一次提交的鏡像ID。
- `tag`和`digest`值是可選的,若是都沒有填寫這兩個值則取默認的`latest`.若是沒法匹配`tag`值會返回一個錯誤。
設置建立鏡像的做者信息。
這個指令有兩種格式.
第一種形式: RUN <command>
(以shell形式執行命令,等同於 /bin/sh -c
);
第二種形式: RUN ["executable", "param1", "param2"]
(等同於exec命令形式),注意此處必須是雙引號(「),由於這種格式被解析爲JSON數組。
關於 RUN
指令的說明:
- 每個RUN指令都會在最頂層上新建一層上執行而且提交執行結果.提交後的iamge將會用於`Dockerfile`中的下一步操做。
- 分層的`RUN`指令和生成提交符合Docker的核心概念,提交是廉價的,容器能夠再一個歷史鏡像的任意層,這個很像源碼控制。
- 第二種`exec`格式能夠避免了shell字符串的改寫問題,以及避免了`RUN`命令執行所在的基礎鏡像中沒有`/bin/sh`的問題。
- 在`shell`格式中咱們可使用\(反斜槓)把一個`RUN`指令切換到下一行。
RUN /bin/bash -c 'source $HOME/.bashrc ;\ echo $HOME'
等同於
RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
- `RUN`指令的cache對於下一次的建立是有效的,對於`RUN apt-get dist-upgrade -y`指令的cache將會再下次建立的時候使用,若是想要使用取消使用cache須要使用`--no-cache`參數。
此命令主要目的是爲一個正在執行的容器提供一些默認值,這些默認命令能夠包含一個可執行命令 executable
,也能夠沒有(此時須要指定一個 ENTRYPOINT
指令,此時 CMD
和 ENTRYPOINT
都必須使用 exec
格式,即JSON數組格式)。
此命令有3種執行格式:
- `CMD ["executable","param1","param2"]` ,`exec`格式,推薦使用這種格式。
- `CMD ["param1","param2"]`,做爲`ENTRYPOINT`的默認參數。
- `CMD command param1 param2`,`shell`格式。
爲鏡像填寫元數據 metadata
信息,格式爲key-value對格式,一個鏡像能夠有多個 LABEL
,可是建議儘可能放到同一個 LABEL
指令下,由於每個 LABEL
指令的執行都會產生新的一層,這樣會讓咱們獲得鏡像執行起來很低效。 LABEL
定義的key能夠覆蓋鏡像以前定義國的key值,咱們能夠經過 docker inspect
命令查看鏡像已經定義的標籤 LABEL
信息。如下是一些示例:
LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines." LABEL multi.label1="value1" multi.label2="value2" other="value3" LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"
此命令通知Docker容器監聽指定的網絡端口 <port>
, EXPOSE
指令不會讓容器的端口訪問host主機,若是想要這樣作就須要在運行容器的時候指定 -p
flag發佈一個端口範圍或者 -P
flag發佈全部打開的端口, 詳細介紹參考 expose-incoming-ports。
用法爲 EXPOSE <port> [<port>...]
。
此指令用於複製新文件、目錄或者遠程URL地址添加到容器的指定 <dest>
路徑下,指令包含兩種形式:
ADD <src>... <dest> ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
ADD
指令,能夠有多個 <src>
資源被指定,假如這些資源是文件或者目錄,則這些資源的路徑必須爲相對與build的工做路徑,而不是絕對路徑,並且每一個 <src>
能夠包含通配符,匹配規則是由Go語言的filepath.Match函數完成。ADD hom* /mydir/ # adds all files starting with "hom" ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
<dest>
是一個絕對路徑或者是相對於 WORKDIR
的相對路徑。ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # adds "test" to /absoluteDir/
UID
和 GID
都是 0。<src>
爲URL時, <dest>
路徑須要是600權限。若是遠端獲取的文件有HTTP Last-Modified
頭部信息,將會使用此時間戳做爲文件的最後修改時間 mtime
。ADD
遵循以下規則:
ADD ../something /something
,由於建立鏡像build的第一步是將buid的環境目錄內容發送給 docker daemon
進程。<src>
是URL而且 <dest>
不是以斜槓(/)結束,那麼一個文件將會下載下來後再複製到 <dest>
。<src>
是URL而且 <dest>
以斜槓(/)結束,那麼將會下載下來URL指定的文件名到 <dest>
下。<src>
是一個目錄,則整個目錄下(目錄自己不被複制)內容和元數據信息也會被複制到 <dest>
中。<src>
是一個本地tar包的壓縮包(gzip/bzip2/xz),則此壓縮包會先被解壓處理,而遠端的URL不會被解壓。當一個目錄COPY有兩種格式:
COPY <src> ... <dest>
COPY [ "<src>",..."<dest>"]
(這種格式須要路徑包含空格)COPY
指令從 <src>
複製新文件或者目錄而後添加到容器文件系統中的 <dest>
路徑。
也能夠有多個 <src>
資源被指定,假如這些資源是文件或者目錄,則這些資源的路徑必須爲相對與build的工做路徑,而不是絕對路徑,並且每一個 <src>
能夠包含通配符,匹配規則是由Go語言的filepath.Match函數完成。如下是示例:
COPY hom* /mydir/ # adds all files starting with "hom" COPY hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
對於 <dest>
是一個絕對路徑或者是相對於 WORKDIR
的相對路徑。
COPY test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ COPY test /absoluteDir/ # adds "test" to /absoluteDir/
全部的文件和目錄添加到容器中時的 UID
和 GID
都是 0。
Note: 若是使用STDIN建立build鏡像( docker build - < somefile
), 因爲沒有build上下文,因此 COPY
指令沒法使用。
COPY
遵循以下規則:
COPY ../something /something
,由於建立鏡像build的第一步是將buid的環境目錄內容發送給 docker daemon
進程。<src>
是一個目錄,則整個目錄下(目錄自己不被複制)內容和元數據信息也會被複制到 <dest>
中。<src>
是任何其餘種類的文件,它被單獨連同其元數據複製。這種場景下,若是 <dest>
是斜線(/)結尾,它會被看成目錄,而後被寫到 <dest>/base(<src>)
.<src>
資源指定時, <dest>
必須是一個目錄,而且以斜線(/)結尾。<dest>
不是以斜線(/)結尾,它將被看成一個普通文件,而且 <src>
將會寫到 <dest>
中。ENTRYPOINT
有兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
(exec 格式,推薦)ENTRYPOINT command param1 param2
(shell 格式)ENTRYPOINT
指令容許咱們爲配置一個做爲運行某個命令的容器。例以下面將啓動nginx做爲運行容器的默認內容,監聽80端口:
docker run -i -t --rm -p 80:80 nginx
docker run <image>
的命令行參數會在 exec格式的 ENTRYPOINT
指令後追加,而且覆蓋全部 CMD
指令指定的全部元素。因此這使得參數能夠傳遞到入口點,例如, docker run <image> -d
將會吧 -d
參數傳給入口點 ENTRYPOINT
. 咱們可使用 docker run --entrypoint
標識來覆蓋 ENTRYPOINT
指令。
shell形式的指令避免任何 CMD
或者 run
使用命令行參數,可是缺點是 ENTRYPOINT
指令會做爲/bin/sh -c進程的子進程來運行,這意味着沒法收到容器中來自 PID 1
UNIX信號,因此進程將沒法經過 docker stop <container>
收到 SIGTERM
信號。
記住一個Dockerfile中只有最後一個 ENTRYPOINT
指令會生效。
Exec 格式的 ENTRYPOINT
示例
FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]
咱們運行容器後,會看到 top
將是惟一一個進程。
$ docker run -it --rm --name test image-top -H top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05 Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top
咱們可使用 docker exec
來深刻的瞭解下具體狀況:
docker exec -it test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H
root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux
咱們可使用 docker stop test
來中止 top
進程。
下面的 Dockerfile
顯示的是使用 ENTRYPOINT
來前臺運行Apache(PID爲1):
FROM debian:stable RUN apt-get update && apt-get install -y --force-yes apache2 EXPOSE 80 443 VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
咱們能夠爲一個單獨的可執行命令編寫一個啓動腳本,這樣咱們就能夠經過 gosu
和 exec
來確保這個最後執行的命令能夠獲取到Unix信號,下面就是一個腳本示例
#!/bin/bash set -e if [ "$1" = 'postgres' ]; then chown -R postgres "$PGDATA" if [ -z "$(ls -A "$PGDATA")" ]; then gosu postgres initdb fi exec gosu postgres "$@" fi exec "$@"
最後,若是咱們須要在關機或者與其餘可執行程序進行協調時進行一些額外清理工做(或者與其餘容器通訊),咱們就須要確保 ENTRYPOINT
腳本能夠獲取到Unix信號,而後經過他們咱們能夠作更多的工做:
#!/bin/sh # Note: I've written this using sh so it works in the busybox container too # USE the trap if you need to also do manual cleanup after the service is stopped, # or need to start multiple services in the one container trap "echo TRAPed signal" HUP INT QUIT TERM # start service in background here /usr/sbin/apachectl start echo "[hit enter key to exit] or run 'docker stop <container>'" read # stop service and clean up here echo "stopping apache" /usr/sbin/apachectl stop echo "exited $0"
咱們能夠執行命令 docker run -it --rm -p 80:80 --name test apache
啓動一個容器,而後經過 docker exec
或者 docker top
來檢查容器中的進程,而後經過腳本中止Apache(此時中止時間很快) :
$ docker exec -it test ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2 root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux $ docker top test PID USER COMMAND 10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2 10054 root /usr/sbin/apache2 -k start 10055 33 /usr/sbin/apache2 -k start 10056 33 /usr/sbin/apache2 -k start $ /usr/bin/time docker stop test test real 0m 0.27s user 0m 0.03s sys 0m 0.03s
註釋說明:
> Note:咱們可使用`--entrypoint`參數來覆蓋`ENTRYPOINT`設置,可是這智能設置exec模式(不會執行sh -c)
> Note:仍是說明`exec`格式的指令會被解析爲JSON數組格式,咱們使用的應該是雙引號(")而不是單引號(');
> Note:跟 *shell* 格式不一樣, *exec* 格式不會調用一個shell命令,例如執行`ENTRYPOINT [ "echo", "$HOME" ]`就不會獲取到變量`$HOME`信息。不過咱們能夠執行這個命令來執行shell命令`ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]` 。另外咱們在`Dockerfile`中須要使用`ENV`來定義咱們須要使用的變量。
Shell格式的 ENTRYPOINT
示例
咱們能夠爲 ENTRYPOINT
指定一個文本字符串做爲命令,而後它將在 /bin/sh -c
下被執行。這種格式會使用shell處理來替代shell環境變量,而且會忽略任何 CMD
或者 docker run
命令行參數。
爲了確保 docker stop
能夠正確的發送號給全部在運行中的 ENTRYPOINT
可執行程序,咱們須要記住要使用 exec
做爲 ENTRYPOINT
命令的開始,以下示例:
FROM ubuntu ENTRYPOINT exec top -b
當咱們運行這個鏡像時,咱們會看到一個 PID 1
的進程:
$ docker run -it --rm --name test top Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq Load average: 0.08 0.03 0.05 2/98 6 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 1 0 root R 3164 0% 0% top -b
當咱們中止容器運行時,它將會完全的退出:
$ /usr/bin/time docker stop test test real 0m 0.20s user 0m 0.02s sys 0m 0.04s
若是咱們忘記添加 exec
到命令的開始位置 :
FROM ubuntu ENTRYPOINT top -b
咱們運行後的效果會是這樣的:
$ docker run -it --name test top Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq Load average: 0.01 0.02 0.05 2/101 7 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 1 0 root S 3168 0% 0% /bin/sh -c top -b 7 1 root R 3164 0% 0% top -b
咱們看到了 PID 1
的進程不是 top
命令,而是 /bin/sh -c
,而後咱們執行 docker stop test
中止容器的運行,容器不會完全的退出,stop命令將會被迫在超時後發送 SIGKILL
信號:
$ docker exec -it test ps aux PID USER COMMAND 1 root /bin/sh -c top -b cmd cmd2 7 root top -b 8 root ps aux $ /usr/bin/time docker stop test test real 0m 10.19s user 0m 0.04s sys 0m 0.03s
理解 CMD
和 ENTRYPOINT
是如何相互做用的
CMD
和 ENTRYPOINT
兩個指令都定義了當運行一個容器時要執行的命令。有以下幾條規則描述它們之間的相互做用:
1. `Dockerfile`應該指定至少`CMD`或者`ENTRYPOINT`中的一個指令。
2. 當容器做爲一個可執行程序時應該指定`ENTRYPOINT`指令。
3. `CMD`應當被用來做爲一種爲`ENTRYPOINT`提供默認參數的方式來使用,或者執行容器中的特定(ad-hoc)命令。
4. `CMD`指令參數能夠被運行容器時傳入的替代參數覆蓋掉。
下表展現了 CMD
/ ENTRYPOINT
命令執行狀況 :
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_cmd p1_cmd | exec_entry p1_entry exec_cmd p1_cmd |
CMD [「p1_cmd」, 「p2_cmd」] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd | 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 /bin/sh -c exec_cmd p1_cmd | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
VOLUME [ "/data"] (exec格式指令) VOLUME /data (shell格式指令)
VOLUME
指令建立一個能夠從本地主機或其餘容器掛載的掛載點,該指令參數能夠是JSON數組(如 VOLUMN ["/var/log/"]
),也能夠是多個參數的文本字符串(如: VOLUMN /var/log /var/db
)。更多關於掛載信息可訪問 Share Directories via Volumes。
docker run
命令用基礎鏡像中指定目錄位置數據來初始化新建立卷。以下示例:
FROM ubuntu RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol RUN echo "hello world" > /myvol/greeting.discarded (這條數據修改內容最終會被丟棄)
這個Dockerfile執行的結果是建立了一個新掛載點/myvol,而後複製greetging文件到新建立的卷。
Note:在build建立鏡像的步驟中, 若是是在Volume聲明後修改卷數據,那麼這些修改最終會被丟棄。Note: 須要說明在使用JSON數組格式指令時要使用雙引號(「),而不是單引號(‘)。
USER daemon
USER
指令用來設置再 Dockerfile
中要使用的用戶名或者 UID
。
WORKDIR /path/to/workdir
WORKDIR
指令用來設置 Dockerfile
中任何使用目錄的命令的當前工做目錄,此目錄若是不存在就會被自動建立,即便這個目錄不被使用。此命令也可使用 Dockerfile
中用 ENV
定義的環境變量,例如:
ENV DIRPATH /path WORKDIR $DIRPATH/$DIRNAME RUN pwd
ARG <name>[=<default value>]
ARG
指令設置一些建立鏡像時的參數,這些參數能夠在執行 docker build
命令時經過 --build-arg <varname>=<value>
設置,若是指定的建立參數在 Dockerfile
中沒有指定,建立時會輸出錯誤信息: One or more build-args were not consumed, failing build.
Dockerfile 做者能夠爲 ARG
設置一個默認參數值,當建立鏡像時若是沒有傳入參數就會使用默認值:
FROM busybox ARG user1=someuser ARG buildno=1
咱們可使用 ARG
或者 ENV
指令來指定 RUN
指令使用的變量。咱們可使用 ENV
定義與 ARG
定義名稱相同的變量來覆蓋 ARG
定義的變量值。以下示例,咱們執行 $ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile
後將獲取到的CONT_IMG_VER變量值爲 v1.0.0
:
FROM ubuntu ARG CONT_IMG_VER ENV CONT_IMG_VER v1.0.0 RUN echo $CONT_IMG_VER
咱們還能夠變換一下 ENV
指令內容來增長一些更豐富的功能(好比: ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
).
另外,Docker有些預約義的 ARG
變量,不須要提早聲明就可使用,好比以下幾個:
- HTTP_PROXY
- http_proxy
- HTTPS_PROXY
- https_proxy
- FTP_RPOXY
- ftp_proxy
- NO_PROXY
- no_proxy
咱們能夠經過使用 --build-arg <varname>=<value>
來傳遞參數值到 Dockerfile
中。
ONBUILD [INSTRUCTION]
ONBUILD
指令爲鏡像提供了一個觸發器 trigger指令功能,當這個鏡像被做爲基礎鏡像執行建立時會自動觸發設定的指令被執行,執行過程就至關於在 Dockerfile
中的 FROM
指令後面當即插入了這條指令同樣。
這個命令很是有幫助,好比對於應用建立環境咱們能夠用它來自定義用戶指定的配置。
須要注意的是:
1. 當使用`ONBUILD`建立鏡像時,這個觸發器會添加到建立後的鏡像上,之後以這個新的鏡像做爲基礎鏡像進行建立新鏡像時纔會觸發這個觸發器。
2. 在建立鏡像的最後,添加的觸發器會存儲到鏡像的`manifest`清單中,咱們能夠經過`docker inspect`查看`OnBuild`的信息。
3. 當帶有`ONBUILD`信息的鏡像經過`FROM`做爲新鏡像的基礎鏡像時,首先builder會查找`OnBuild`觸發器信息,而後按照註冊的前後順序依次執行每個觸發器,若是任何一個觸發器執行失敗,則`FROM`停止build的執行。若是全部觸發器都執行成功,則`FROM`指令執行完成,而且繼續向下執行。
4. 觸發器在執行一次以後生成的鏡像中就會被清理掉,它不會被繼承到下一個鏡像中。
Note: ONBUILD不支持嵌套 ONBUILD
,另外 ONBUILD
指令不能夠觸發 FROM
或者 MAINTAINER
STOPSIGNAL signal
STOPSIGNAL
指令用來設置用來發送給容器退出的系統調用信號。這個信號能夠是系統調用表中的數字,也能夠是信號名稱,格式爲 SIGNAME
,例如 SIGKILL
.
如下內容是一些簡單的Dockerfile示例,若是感興趣能夠訪問 Dockerization examples瞭解更多內容:
示例1:
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
示例2:
# Firefox over VNC # # VERSION 0.3 FROM ubuntu # Install vnc, xvfb in order to create a 'fake' display and firefox RUN apt-get update && apt-get install -y x11vnc xvfb firefox RUN mkdir ~/.vnc # Setup a password RUN x11vnc -storepasswd 1234 ~/.vnc/passwd # Autostart firefox (might not be the best way, but it does the trick) RUN bash -c 'echo "firefox" >> /.bashrc' EXPOSE 5900 CMD ["x11vnc", "-forever", "-usepw", "-create"]
示例3:
# Multiple images example # # VERSION 0.1 FROM ubuntu RUN echo foo > bar # Will output something like ===> 907ad6c2736f FROM ubuntu RUN echo moo > oink # Will output something like ===> 695d7793cbe4 # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with # /oink.