映象是容器的基礎,每次執行docker run的時候都會指定哪個映象作為容器執行的基礎。我們之前的例子都是使用來自docker hub的映象,直接使用這些映象只能滿足一定的需求,當映象無法滿足我們的需求時,就得自定製這些映象。
映象的定製就是定製每一層所新增的配置、檔案。如果可以把每一層修改、安裝、構建、操作的命令都寫入到乙個指令碼,用指令碼來構建、定製映象,這個指令碼就是dockerfile。
dockerfile 是乙個文字檔案,其內包含了一條條的指令(instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
from scratch # 製作base image基礎映象,盡量使用官方的image作為base image
from centos # 以centos為基礎映象,進行二次構建映象
from ubuntu:14.04 # 帶有tag的base image
label version=「1.0」 # 容器元資訊,幫助資訊,metadata,類似於**注釋
label maintainer=」[email protected]" # 標籤表示作者資訊
#對於複雜的run命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!
run yum update && yum install -y vim \
python-dev # 反斜線換行
run /bin/bash -c "source $home/.bashrc;echo $home」
workdir /root # 相當於linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用run cd
workdir /test # 如果沒有就自動建立
workdir demo # 再進入demo資料夾
run pwd # 列印結果應該是/test/demo
add /opt/django/manage.py /opt/ # 把宿主機的/opt/django/manage.py放到容器空間內的/opt/目錄下
add /opt/python3.6.tar.gz /opt/ #add的解壓檔案作用,將宿主機的/opt/下的python3.6.tar.gz解壓到容器內的/opt/目錄下
add and copy
add hello / #把本地檔案新增到映象中,吧本地的hello可執行檔案拷貝到映象的/目錄
add test.tar.gz /#新增到根目錄並解壓
workdir /root
add hello test/ # 進入/root/ 新增hello可執行命令到test目錄下,也就是/root/test/hello 乙個絕對路徑
copy hello test/ # 等同於上述add效果
# 將宿主機的檔案, 拷貝到容器內,但是沒有解壓縮的命令,盡量使用copy,不要使用add
copy filename /opt/
add與copy
- 優先使用copy命令
-add除了copy功能還有解壓功能
新增遠端檔案/目錄使用curl或wget
env # 環境變數,盡可能使用env增加可維護性
env mysql_version 5.6 # 設定乙個mysql常量,這個$類似於全域性常量
run yum install -y mysql-server=「$」 # 如果版本號有變更,則只需要改這個常量就可以了
儲存和網路
run and cmd and entrypoint
run:執行命令並建立新的image layer
cmd:設定容器啟動後預設執行的命令和引數
entrypoint:設定容器啟動時執行的命令
shell格式和exec格式
run yum install -y vim
cmd echo 」hello docker」
entrypoint echo 「hello docker
run [「apt-get」,」install」,」-y」,」vim」]
cmd [「/bin/echo」,」hello docker」]
entrypoint [「/bin/echo」,」hello docker」]
通過shell格式去執行命令,會讀取$name指令,而exec格式是僅僅的執行乙個命令,而不是shell指令
cat dockerfile
from centos
env name docker
entrypoint [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變數
entrypoint [「/bin/bash」,」-c」,」echo hello $name"]
容器啟動時預設執行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),cmd命令被忽略
如果定義多個cmd,只有最後乙個執行
讓容器以應用程式或服務形式執行
不會被忽略,一定會執行
最佳實踐:寫乙個shell指令碼作為entrypoint
copy docker-entrypoint.sh /usr/local/bin
entrypoint [「docker-entrypoint.sh]
expose 27017
cmd [「mongod」]
[root@master home]# more dockerfilefrom centos
env name docker#cmd ["/bin/bash","-c","echo hello $name"]
entrypoint ["/bin/bash","-c","echo hello $name」]
dockerfile指令介紹
dockerfile指令 cmd,entrypoint,add,copy,volume,workdir,user,onbuild,env等 1.cmd 用於指定乙個容器啟動時要執行的命令。類似於run指令,只是run指令是指定映象被構建時的命令,而cmd是指容器被啟動時要執行的命令 docker r...
Dockerfile 指令 VOLUME 介紹
在介紹volume指令之前,我們來看下如下場景需求 1 容器是基於映象建立的,最後的容器檔案系統包括映象的唯讀層 可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來 或者基於容器建立新的映象 能否可以讓容器程序持久化的資料儲存在主機上呢...
DockerFile 指令命令介紹
2 示例 arg version latest from busybox version arg version run echo version image version from 或from 或from 注意 任何dockerfile中的第一條指令必須為from指令,並且,如果在同乙個dock...