Docker之Dockerfile

原文鏈接:http://wyb0.com/posts/docker-dockerfile/
操作系統(tǒng):Ubuntu14.04.1
Docker版本:Docker version 17.06.0-ce, build 02c1d87

0x00 Dockerfile

Dockerfile里面其實是一條條的指令,Docker會把Dockerfile的指令翻譯為linux命令睛廊,
每一條指令都會創(chuàng)建一個鏡像届榄,下一條指令將在這個鏡像的基礎(chǔ)上進行修改操作后再生成一個鏡像。
讓你可以對下載好的鏡像進行一些操作(比如安裝軟件秦效、向鏡像復(fù)制文件等),從而構(gòu)造定制化的鏡像涎嚼。

0x01 Dockerfile基本指令

FROM <image name>:指定新的鏡像基于什么創(chuàng)建(可以嘗試使用alpine:latest和debian:jessie)
MAINTAINER <author name>:設(shè)置該鏡像的作者
COPY <source> <dest>:復(fù)制文件阱州,dest要以 / 結(jié)尾
WORKDIR /path/to/workdir:相當(dāng)于切換目錄,對RUN法梯、CMD苔货、和ENTRYPOINT生效
RUN <command>:在shell執(zhí)行命令
EXPOSE port1 port2:容器運行時監(jiān)聽的端口
CMD:容器默認的執(zhí)行命令,Dockerfile只允許使用一次CMD命令(使用數(shù)組)
ENTRYPOINT:類似于CMD立哑,Dockerfile只允許使用一次(使用數(shù)組)
ENV <key> <value>:設(shè)置環(huán)境變量
USER <uid>:鏡像正在運行時設(shè)置一個uid夜惭,即設(shè)定啟動容器的用戶,默認為root
VOLUME ['/data']:授權(quán)訪問從容器內(nèi)到主機的目錄

CMD與ENTRYPOINT的區(qū)別:

#docker run ubuntu:test會執(zhí)行/bin/echo 'this is test'
CMD ['/bin/echo','this is test']

#docker run ubuntu:test會執(zhí)行/bin/echo 'entrypoint test'铛绰,會輸出'entrypoint test'
ENTRYPOINT ['/bin/echo','entrypoint test']

#docker run ubuntu:test start即執(zhí)行/etc/init.d/mysql start诈茧,CMD中的默認參數(shù)會被覆蓋
ENTRYPOINT ['/etc/init.d/mysql']
CMD ["restart"]#CMD中的值會作為ENTRYPOINT的默認參數(shù)

0x02 實例

image
  • Dockerfile
reber@wyb:~/range$ cat Dockerfile
FROM ubuntu:14.04
MAINTAINER reber

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

COPY src/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y

COPY src/range.zip /tmp/
COPY src/privileges.sql /tmp/

RUN apt-get install -y apache2 mysql-server mysql-client php5 php5-gd php5-mysql libapache2-mod-php5 libapache2-mod-auth-mysql unzip && apt-get clean

WORKDIR /var/www/html
RUN set -x \
    && unzip -x /tmp/range.zip -d ./ \
    && chmod 777 ./range/upload/uploads \
    && chmod 777 ./range/xss_platform/upload

EXPOSE 80

COPY src/start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]
CMD ["--help"]
  • src/privileges.sql
reber@wyb:~/range$ cat src/privileges.sql
use mysql;
UPDATE user SET password=PASSWORD('root') where USER='root';
FLUSH PRIVILEGES;
  • src/sources.list
reber@wyb:~/range$ cat src/sources.list
deb http://debian.ustc.edu.cn/ubuntu/ trusty main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ trusty main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse
  • src/start.sh
reber@wyb:~/range$ cat src/start.sh
#!/bin/bash
set -x

echo 'start mysql'
/etc/init.d/mysql start
sleep 3

echo 'import rtest.sql'
mysql < /var/www/html/range/rtest.sql
sleep 3

echo 'set password'
mysql < /tmp/privileges.sql

/etc/init.d/mysql restart
/etc/init.d/apache2 restart

echo 'set success'

/usr/bin/tail -f /dev/null

0x03 構(gòu)建鏡像

reber@wyb:~/range$ ls
Dockerfile  src
reber@wyb:~/range$ ls src
range.zip  sources.list  start.sh

#構(gòu)建鏡像
reber@wyb:~/range$ docker build -t range:1.0 .

#運行容器,并將容器的80端口轉(zhuǎn)到宿主機的8888端口
reber@wyb:~/range$ docker run -itd -p 8888:80 range:v1.0

0x04 注意事項

  • 使用緩存

因為每條指令都會創(chuàng)建一個鏡像捂掰,若一個鏡像已經(jīng)存在的話則不會重新執(zhí)行指令創(chuàng)建新鏡像敢会,而是直接使用镊叁。
為有效的利用已存在的鏡像,應(yīng)保持Dockerfile的一致性走触,盡量在末尾修改晦譬,比如說前幾行都如下設(shè)置:

FROM ubuntu:14.04

MAINTAINER reber <1070018473@qq.com>

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sourse.list
RUN apt-get update
RUN apt-get upgrade -y #盡量不要upgrade
  • 使用標簽

始終使用-t參數(shù)給鏡像打標簽:docker build -t ubuntu:range1 .

  • 公開端口

Docker鏡像應(yīng)該能在任何主機上運行,所以不要通過Dockerfile映射共有端口互广,只映射私有端口:EXPOSE 80

  • CMD與ENTRYPOINT

應(yīng)該使用數(shù)組語法敛腌,兩者可以結(jié)合使用

ENTRYPOINT ["/start.sh"] #docker run的參數(shù)將傳遞給start.sh
CMD ["--help"] #若沒有參數(shù)傳遞則顯示幫助文檔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惫皱,隨后出現(xiàn)的幾起案子像樊,更是在濱河造成了極大的恐慌,老刑警劉巖旅敷,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件生棍,死亡現(xiàn)場離奇詭異,居然都是意外死亡媳谁,警方通過查閱死者的電腦和手機涂滴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴音,“玉大人柔纵,你說我怎么就攤上這事〈冈辏” “怎么了搁料?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長系羞。 經(jīng)常有香客問我郭计,道長,這世上最難降的妖魔是什么椒振? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任昭伸,我火速辦了婚禮,結(jié)果婚禮上杠人,老公的妹妹穿的比我還像新娘勋乾。我一直安慰自己宋下,他們只是感情好嗡善,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著学歧,像睡著了一般罩引。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枝笨,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天袁铐,我揣著相機與錄音揭蜒,去河邊找鬼。 笑死剔桨,一個胖子當(dāng)著我的面吹牛屉更,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洒缀,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瑰谜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了树绩?” 一聲冷哼從身側(cè)響起萨脑,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饺饭,沒想到半個月后渤早,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瘫俊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年鹊杖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扛芽。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅淑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胸哥,到底是詐尸還是另有隱情涯竟,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布空厌,位于F島的核電站庐船,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘲更。R本人自食惡果不足惜筐钟,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赋朦。 院中可真熱鬧篓冲,春花似錦、人聲如沸宠哄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毛嫉。三九已至诽俯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間承粤,已是汗流浹背暴区。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工闯团, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仙粱。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓房交,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伐割。 傳聞我的和親對象是個殘疾皇子涌萤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348