Docker 基礎(chǔ) ( 十三 ) DockerFile

DockerFile 介紹

dockerfile 是用來構(gòu)建docker鏡像的文件,是命令參數(shù)腳本

  • 構(gòu)建步驟:
    1. 編寫dockerfile 文件
    2. docker build 構(gòu)建成為一個(gè)鏡像
    3. docker run 運(yùn)行鏡像
    4. docker push 發(fā)送鏡像(DockerHub袁滥、阿里云鏡像)
  • 查看官方鏡像文件的構(gòu)建



DockerFile 構(gòu)建過程

  • 基礎(chǔ)知識(shí):
    1. 每個(gè)保留關(guān)鍵字(指令)都必須是大寫字母
    2. 指令從上到下順序執(zhí)行
    3. #表示注釋
    4. 每一個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層,并提交很魂!
  • dockerfile 是面向開發(fā)的堤撵,要發(fā)布項(xiàng)目、做鏡像需要編寫dockerfile文件绽乔。
  • DockerFile:構(gòu)建文件补疑,定義了一切的步驟歧沪,源代碼
  • DockerImages:通過DockerFile構(gòu)建生成的鏡像,最終發(fā)布和運(yùn)行產(chǎn)品莲组。
  • Docker容器:容器就是鏡像運(yùn)行起來提供服務(wù)诊胞。

DockerFile的指令

  1. FROM               # 基礎(chǔ)鏡像,一切從這里開始構(gòu)建
  2. MAINTAINER         # 鏡像作者:姓名+郵箱
  3. RUN                # 鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
  4. ADD                # 步驟锹杈。(tomcat鏡像的壓縮包就是一種添加內(nèi)容)
  5. WORKDIR            # 鏡像的工作目錄
  6. VOLUME             # 掛載的目錄
  7. EXPOSE             # 暴露端口配置
  8. CMD                # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令撵孤,只有最后一個(gè)會(huì)生效,可被替代 (替換)
  9. ENTRYPOINT         # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令竭望,可以直接追加命令 (追加)
  10. ONBUILD           # 當(dāng)構(gòu)建一個(gè)被繼承 DockerFile 邪码,這個(gè)時(shí)候就會(huì)運(yùn)行 ONBUILD 的指令,是一種觸發(fā)指令
  11. COPY              # 類似ADD命令咬清,將我們的文件拷貝到鏡像中
  12. ENV               # 構(gòu)建的時(shí)候設(shè)置環(huán)境變量

CMD 和 ENTRYPOINT 的區(qū)別:

  1. CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令闭专,只有最后一個(gè)會(huì)生效糕韧,可被替代 (替換)
  2. ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,可以直接追加命令(追加)

實(shí)戰(zhàn)測試:

  • centos7 鏡像構(gòu)建
    FROM scratch
    ADD centos-7-x86_64-docker.tar.xz /
    LABEL \
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="CentOS Base Image" \
        org.label-schema.vendor="CentOS" \
        org.label-schema.license="GPLv2" \
        org.label-schema.build-date="20200504" \
        org.opencontainers.image.title="CentOS Base Image" \
        org.opencontainers.image.vendor="CentOS" \
        org.opencontainers.image.licenses="GPL-2.0-only" \
        org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
    CMD ["/bin/bash"]
  • Docker Hub 中 99%的鏡像都是從這個(gè)基礎(chǔ)鏡像過來的 FROM scratch喻圃,然后配置需要的軟件和配置來進(jìn)行構(gòu)建。
  • FROM scratch
    官方說明:該鏡像是一個(gè)空的鏡像粪滤,可以用于構(gòu)建busybox等超小鏡像斧拍,可以說是真正的從零開始構(gòu)建屬于自己的鏡像。要知道杖小,一個(gè)官方的ubuntu鏡像有60MB+肆汹,CentOS鏡像有70MB+
    可以把一個(gè)可執(zhí)行文件扔進(jìn)來直接執(zhí)行
  • 注意:scratch不可以被pull
  • FROM scratch專門用于構(gòu)建最小鏡像,直接pull會(huì)報(bào)以下錯(cuò)誤予权,scratch是一個(gè)保留名稱
[root@VM-0-6-centos ~]# docker pull scratch
Using default tag: latest
Error response from daemon: 'scratch' is a reserved name
  • 如何制作大小為 0 的鏡像
    既然scratch不能被拉取昂勉,如何做到docker image ls看到一個(gè)0字節(jié)的鏡像
    官方給出了下面方法:
    tar cv --files-from /dev/null | docker import - scratch
[root@VM-0-6-centos /]# tar cv --files-from /dev/null | docker import - scratch
sha256:ca0b4798edfafb22179f11d84493611112df0cdfbd1bd7c592c67f30a14a3e6f
[root@VM-0-6-centos /]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
scratch               latest    ca0b4798edfa   8 seconds ago   0B
創(chuàng)建一個(gè)自己的 centos
  • 新建dockerfile-centos文件
[root@VM-0-6-centos ceshi]# vi dockerfile-centos
  • 編寫dockerfile文件
FROM centos    # 基礎(chǔ)鏡像是官方原生的centos
MAINTAINER yj<yj@qq.com>    # 作者
ENV MYPATH /usr/local    # 配置環(huán)境變量的目錄
WORKDIR $MYPATH     # 將工作目錄設(shè)置為 MYPATH
RUN yum -y install vim    # 給官方原生的centos 增加 vim指令
RUN yum -y install net-tools    # 給官方原生的centos 增加 ifconfig命令
EXPOSE 80    # 暴露端口號(hào)為80
CMD echo $MYPATH    # 輸出下 MYPATH 路徑
CMD echo "-----end-----"    
CMD /bin/bash    # 啟動(dòng)后進(jìn)入 /bin/bash
  • 構(gòu)建鏡像文件
    docker build -f dockerfile-centos -t mycentos:1.0 .
    注意帶上版本號(hào),否則每次都回去找最新版 latest
[root@VM-0-6-centos ceshi]# docker build -f dockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon  4.096kB
Step 1/10 : FROM centos
 ---> 300e315adb2f
Step 2/10 : MAINTAINER yj<yj@qq.com>
 ---> Running in 6026cec2776c
Removing intermediate container 6026cec2776c
 ---> 60feb235dd11
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 9e7149e0dc2c
Removing intermediate container 9e7149e0dc2c
 ---> c08d48a4db30
Step 4/10 : WORKDIR $MYPATH
 ---> Running in a11c3f9f23d5
Removing intermediate container a11c3f9f23d5
 ---> 1180ba69b198
Step 5/10 : RUN yum -y install vim
 ---> Running in 8973448d3648

Step 10/10 : CMD /bin/bash
 ---> Running in 104b3b2d2b4f
Removing intermediate container 104b3b2d2b4f
 ---> 201f0cb357f9
Successfully built 201f0cb357f9
Successfully tagged mycentos:1.0
[root@VM-0-6-centos ceshi]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mycentos              1.0       201f0cb357f9   3 minutes ago    295MB
  • 測試運(yùn)行
[root@VM-0-6-centos ceshi]# docker run -it mycentos:1.0
[root@a2a3e933ff8e local]# pwd     // 與Dockerfile文件中 WORKDIR 設(shè)置的 MYPATH 一致
/usr/local
[root@a2a3e933ff8e local]# vim    // vim 指令可以使用
[root@a2a3e933ff8e local]# ifconfig    // ifconfig 指令可以使用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 14  bytes 1205 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 查看鏡像構(gòu)建歷史步驟
    docker history mycentos:1.0
[root@VM-0-6-centos ceshi]# docker history mycentos:1.0
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
201f0cb357f9   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
c47254ec9a24   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
197b57ff7221   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
c0ec0ff691f8   11 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
2b19515fe29c   11 minutes ago   /bin/sh -c yum -y install net-tools             24.9MB    
e770a5ebe23e   11 minutes ago   /bin/sh -c yum -y install vim                   60.7MB    
1180ba69b198   11 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
c08d48a4db30   11 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
60feb235dd11   11 minutes ago   /bin/sh -c #(nop)  MAINTAINER yj<yj@qq.com>     0B        
300e315adb2f   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

我們平時(shí)拿到一個(gè)鏡像扫腺,可以用 docker history 鏡像id 研究一下是怎么構(gòu)建的

測試CMD:

  • 新建一個(gè)dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-cmd
FROM centos
CMD [“l(fā)s”,”-a”] # 啟動(dòng)后執(zhí)行 ls -a 命令
  • 構(gòu)建鏡像
    docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
  • 運(yùn)行鏡像
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 # 由結(jié)果可得岗照,運(yùn)行后就執(zhí)行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
  • 追加一個(gè)命令 -l 成為ls -al:展示列表詳細(xì)數(shù)據(jù)
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”-l\”:
executable file not found in $PATH”: unknown.
ERRO[0000] error waiting for container: context canceled
  • cmd的情況下 -l 替換了CMD[“l(fā)s”,”-l”]-l不是命令所以報(bào)錯(cuò)

測試ENTRYPOINT:

  • 編寫dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT [“l(fā)s”,”-a”]
  • 構(gòu)建鏡像
    docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 .
  • 運(yùn)行鏡像
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found …
  • -l 命令,是直接拼接在ENTRYPOINT命令后面
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1 -l #注意輸出結(jié)果
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ….
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笆环,一起剝皮案震驚了整個(gè)濱河市攒至,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躁劣,老刑警劉巖迫吐,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異账忘,居然都是意外死亡志膀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門鳖擒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉浙,“玉大人烤黍,你說我怎么就攤上這事觅捆。” “怎么了嚷量?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵圆裕,是天一觀的道長广鳍。 經(jīng)常有香客問我,道長吓妆,這世上最難降的妖魔是什么赊时? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮行拢,結(jié)果婚禮上祖秒,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好竭缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布房维。 她就那樣靜靜地躺著,像睡著了一般抬纸。 火紅的嫁衣襯著肌膚如雪咙俩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天湿故,我揣著相機(jī)與錄音阿趁,去河邊找鬼。 笑死坛猪,一個(gè)胖子當(dāng)著我的面吹牛脖阵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墅茉,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼命黔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了就斤?” 一聲冷哼從身側(cè)響起纷铣,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎战转,沒想到半個(gè)月后搜立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槐秧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年啄踊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刁标。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颠通,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀懈,到底是詐尸還是另有隱情顿锰,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布启搂,位于F島的核電站硼控,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胳赌。R本人自食惡果不足惜牢撼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疑苫。 院中可真熱鬧熏版,春花似錦纷责、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至曲横,卻和暖如春喂柒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胜榔。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湃番,地道東北人夭织。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像吠撮,于是被迫代替她去往敵國和親尊惰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容