1. 程式人生 > >docker-dockerfile

docker-dockerfile

之前簡單說過一些,現在來個正式一點的

註釋

# 老規矩,註釋嘛,這個就是
# 前面這個開頭的就是註釋了
# 發現c++的註釋好亮,以後就用這個了

FROM

# from必須是dockerfile非註釋的第一行
# 指定基礎映象
FROM ubuntu:14.04

MAINTIANER

# maintainer 就是作者資訊啦
MAINTAINER author "email"

RUN

# 這個就值得一說了

# 執行時機
# 1. 這個命令在基礎映象準備完畢之後,就會執行了

# 重複
# 2. 這個命令可以重複使用,指定多條指令

# 3. 模式

# 3.1 bash命令,採用bash -c執行
RUN apt-get update
# 3.1.1 多命令合併&&
RUN apt-get update && apt-get install -y ping

# 3.2 陣列命令,採用exec執行
RUN ["apt-get","install","-y","ping"]

# 作用
# 基本上一個基礎映象上的改造都集中到這,採用RUN進行寫入
# 一般情況下映象準備好之後就是它執行了,不一般的情況就是後面的ONBUILD命令了

CMD

# 不是我說,這老哥有點苦逼

# 1. 概念
# 和RUN一樣,也是指令

# 2. 執行時機
# 2.1 這個在構建時是不執行的,只有在建立容器時才執行這個命令
# 2.2 如果執行時指定了命令,可憐的老哥也會被覆蓋

# 3. 執行模式
# 3.1 同RUN,支援bash模式
CMD apt-get update
# 3.2 也可以陣列
CMD ["apt-get","update"]

# 4. 引數模式
CMD ["update"]
# 4.1 好吧,都不能運行了,只是為後面的ENTRYPOINT傳引數了
# 4.2 作為命令,是預設的,有命令了就會被覆蓋,作為引數,傳入引數了還是被覆蓋,唉~~~

# 老哥辛苦

ENTRYPPOINT

# 建立容器
docker run -p 80 -i -t -d --name contain_name image_name command args
# 一般啟動時候就是這樣了,通過image_name分為兩半
# 1. 執行模式
# 2. 執行命令

# 如果啟動命令中只有前半段
docker run -p 80 -i -t --name contain_name image_name
# 恭喜CMD苦逼老哥,這個時候就是他執行的時候了

# 如果是全命令的話
docker run -p 80 -i -t -d --name contain_name image_name command args
# CMD老哥也是悶死在棺材板裡了,出不來了

# ENTRYPOINT就不一樣了
docker run -it --entrypoint contain_name image_name 
# 只要指定--entrypoint就可以得到執行

# 哪怕是
docker run -it --entrypoint contain_name image_name command args
# entrypoint也會執行

# 鞭屍CMD
docker run -it --entrypoint contain)name image_name -g args
# 當不指定command,只傳入引數args時,entrypoint會執行,CMD老哥引數被覆蓋
# 哪怕淪落到只帶引數也出不來,被覆蓋啊被覆蓋

# CMD不帶命令的引數模式,只有通過陣列模式能傳過來
# 同樣的entrypoint也必須是陣列模式

ADD

ADD SRC DEST
# 其實就是個拷貝命令,從指定位置拷貝到容器指定目錄

# 新增,細數一下特點吧

# 1. 支援系統檔案,支援正則,支援相對路徑
# 和一般檔案操作一樣吧 

# 2. 支援解壓
# 拷貝tar等壓縮檔案,自動解壓

# 3. 支援http連線地址

# 就這樣了

COPY

# 和ADD重了啊

# 1. 支援系統檔案,相對路徑,正則
# 2. 不支援解壓
# 3. 不支援http

# 專而精吧,人家docker官方都說了拷貝系統檔案就用它了(推薦)

VOLUNE

# 恩。。。。和卷相關的,什麼持久化之類的,暫時駕馭不住,不說

ENV

# 設定環境變數

# 1. 配置方式
ENV key value
ENV key=value
# 兩種方式隨便用
# 配置多個無所謂

# 2. 生命週期
# 不論是構建還是執行,都能用

# 3. 使用場景
# 3.1 指令中可以直接使用,不論是構建時的RUN,還是執行時的CMD
# 3.2 執行的容器也會帶這個環境變數,直接用也可以

USER

# 不論構建還是執行,總需要執行命令
# 執行命令也總需要角色

# 拋開構建,執行時就歸它管理了,這個就是指定執行命令是的使用者角色
USER user
USER uid
USER user:group
USER uid:group
USER uid:gid
# 隨便怎麼玩啦

# 但是不配置的時候,預設是用root進行操作的

ONBUILD

# 知道你盜版人家軟體的時候是怎麼被知道的麼
# 也不加鎖,就等你盜,然後告你

ONBUILD curl http://www.godme.com
# 然後記錄訪問次數就差不多了

# 之前說了一般基礎映象準備好後執行RUN指令(ENV載入不算指令執行)
# 不一般的就是這個ONBUILD
# 如果把一個配置了ONBUILD的映象作為基礎映象,準備映象之後,就會觸發這個基礎映象的ONBUILD

# 如果你想防盜,或者破壞,就在ONBUILD掛木馬吧
# 使用是沒有問題的,如果有人想把你的映象作為基礎映象再建立的話........

# 世界太可怕了

LABEL

# 這個嘛, 就是個標記
LABEL key value
# 和ENV一樣,只是單單是資訊記錄而已,不影響

EXPOSE

# 這個之前說過了,就是宣告一下容器埠使用
EXPOSE 80

# 也可以同時宣告多個,空格隔開即可
EXPOSE 80 81 82 83

# 慢慢來,也不是不可以
EXPOSE 80
EXPOSE 81 
EXPOSE 82

# 只是,宣告並不是最重要的,這個資訊也僅僅是作為了記錄資訊儲存了而已

# 啟動時還是需要進行埠對映的
docker run -p 80 contain_name command args

# 但是如果採用自動對映,它就會自動取查詢資訊並隨機對映
docker run -P contain_name command args

# 一般保險還是-p手動對映比較好,-P不推薦使用
# 但EXPOSE還是不能不寫的,萬一哪天忘記了到哪查去,浪費功夫了就

WORKDIR

# 這個也比較好理解,就是執行時指令的執行目錄
# linux的都知道

# 1. 一般採用絕對路徑進行指定

# 2. 相對路徑會向下傳遞
WORKDIR a
WORKDIR b
WORKDIR c
# 最終WORKDIR:a/b/c
# 騷就行了,使用的時候還是絕對路徑比較好