docker筑基篇-04-使用Dockerfile構(gòu)建自己的鏡像

[TOC]

上一篇文章介紹了使用docker commit命令來構(gòu)建自己的鏡像藤滥。
本篇文章將使用Dockerfile實現(xiàn)上篇文章中的需求咐蚯。

1 構(gòu)建自己的鏡像

此處我們打算,給一個centos:6.8容器安裝nginx服務(wù)器。
并將其狀態(tài)保留,以便不用每次啟動新容器都要再次安裝nginx冗栗。

1.1 構(gòu)建Dockerfile上下文

先來隨便找個位置建個目錄當(dāng)做Dockerfile的上下文。
此處本人在/root/workspace/docker/建立目錄my-first-Dockerfile怠苔,如下所示:

[root@h1 my-first-Dockerfile]# pwd
/root/workspace/docker/my-first-Dockerfile
[root@h1 my-first-Dockerfile]# tree
.
├── Dockerfile #Dockerfile文件
└── nginx.repo #安裝nginx用的yum源

0 directories, 2 files
[root@h1 my-first-Dockerfile]# 

文件內(nèi)容如下:

# nginx.repo文件內(nèi)容
[root@h1 my-first-Dockerfile]# cat nginx.repo 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

1.2 Dockerfile文件內(nèi)容

# Dockerfile內(nèi)容
[root@h1 my-first-Dockerfile]# cat Dockerfile 
# version 0.0.1-snapshot
# 從一個基礎(chǔ)鏡像centos:6.8開始構(gòu)建
FROM centos:6.8
# 維護者信息
MAINTAINER hylexus "hylexus@163.com"
# 將Dockerfile上下文中的nginx.repo復(fù)制到容器中的yum源位置
COPY ./nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum makecache
# 安裝nginx
RUN yum install -y nginx
# 修改nginx首頁信息
RUN echo "home page of container niginx server" > /usr/share/nginx/html/index.html
# 暴露80端口
EXPOSE 80
[root@h1 my-first-Dockerfile]# 

1.3 構(gòu)建鏡像

執(zhí)行命令開始構(gòu)建:

docker build -t="hylexus/nginx-1" .

過程如下:

# 命令最后的點表示Dockerfile所在目錄
[root@h1 my-first-Dockerfile]# docker build -t="hylexus/nginx-1" .
Sending build context to Docker daemon 4.096 kB
Sending build context to Docker daemon 
Step 0 : FROM centos:6.8
 ---> 80e46367f846
Step 1 : MAINTAINER hylexus "hylexus@163.com"
 ---> Using cache
 ---> c518397fc23e
Step 2 : COPY ./nginx.repo /etc/yum.repos.d/nginx.repo
 ---> 5c6e01981678
Removing intermediate container c6e430804af3
Step 3 : RUN yum makecache
 ---> Running in d17bef44ff52
Loaded plugins: fastestmirror, ovl
Metadata Cache Created
 ---> 25e01b8498fc
Removing intermediate container d17bef44ff52
Step 4 : RUN yum install -y nginx
 ---> Running in 3054e6a7d381
Loaded plugins: fastestmirror, ovl
Setting up Install Process
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 0:1.10.1-1.el6.ngx will be installed
# 此處省略N行.....
--> Running transaction check
---> Package dbus-glib.x86_64 0:0.86-6.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch       Version                       Repository   Size
================================================================================
Installing:
 nginx               x86_64     1.10.1-1.el6.ngx              nginx       821 k
Installing for dependencies:
# 此處省略N行...
 util-linux-ng       x86_64     2.17.2-12.24.el6              base        1.6 M

Transaction Summary
================================================================================
Install      15 Package(s)

Total download size: 21 M
Installed size: 41 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           356 kB/s |  21 MB     01:01     
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-8.el6.centos.12.3.x86_64 (@CentOS/6.8)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : hwdata-0.233-16.1.el6.noarch                                1/15 
# 此處省略N行……
  Installing : nginx-1.10.1-1.el6.ngx.x86_64                              15/15 
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
  Verifying  : iptables-1.4.7-16.el6.x86_64                                1/15 
# 此處省略N行
  Verifying  : hwdata-0.233-16.1.el6.noarch                               15/15 

Installed:
  nginx.x86_64 0:1.10.1-1.el6.ngx                                               

Dependency Installed:
#此處省略N行……                                           
  util-linux-ng.x86_64 0:2.17.2-12.24.el6                                       

Complete!
 ---> 8741ff7c796b
Removing intermediate container 3054e6a7d381
Step 5 : RUN echo "home page of container niginx server" > /usr/share/nginx/html/index.html
 ---> Running in 81627cb51b65
 ---> 0d610e7a0000
Removing intermediate container 81627cb51b65
Step 6 : EXPOSE 80
 ---> Running in 778468b1dcea
 ---> 9f18a04cafcb
Removing intermediate container 778468b1dcea
Successfully built 9f18a04cafcb
[root@h1 my-first-Dockerfile]#

1.4 啟動容器

# 查看剛才構(gòu)建的鏡像
[root@h1 my-first-Dockerfile]# docker images hylexus/nginx-1
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hylexus/nginx-1     latest              9f18a04cafcb        38 minutes ago      564.4 MB

# 啟動容器
[root@h1 my-first-Dockerfile]# docker run -d -p 80 --name my-nginx-server hylexus/nginx-1 nginx -g "daemon off;"
8d6d810448fb7c80825f62058494f77eb991ee0e43ef82fa9367b96dd343f617

# 查看隨機生成的端口映射
[root@h1 my-first-Dockerfile]# docker port 8d6d810448fb7c80825f62058494f77eb991ee0e43ef82fa9367b96dd343f617
80/tcp -> 0.0.0.0:32768
[root@h1 my-first-Dockerfile]#

#####################################################
#####################################################

# 當(dāng)然也可以在啟動的時候指定端口映射
[root@h1 my-first-Dockerfile]# docker run -dit -p 8080:80 --name my-nginx-server hylexus/nginx-1 nginx -g "daemon off;"
726ef73f47d1bd419f9aebbc2aaecae494170a3733a59678a0fc6e5a52b502a6
# 查看端口映射
[root@h1 my-first-Dockerfile]# docker port 726ef73f47d1bd419f9aebbc2aaecae494170a3733a59678a0fc6e5a52b502a6
80/tcp -> 0.0.0.0:8080

之后就可以使用瀏覽器訪問測試了

1.5 將鏡像推送到DockerHub

就像github一樣的版本控制一樣吱七。自己的docker鏡像也可以提交到DockerHub。

# 要先登錄DockerHub
# 此處的hylexus/nginx-1即是鏡像名稱:<user-name>/<image-name>
docker push hylexus/nginx-1

2 構(gòu)建過程中的幾個問題

2.1 Dockerfile大致流程

從構(gòu)建時的輸出羡洛,可以看出每條RUN指令都會生成一個新的鏡像層挂脑。
并且默認情況下RUN指令都會以/bin/sh -c來包裝執(zhí)行。

大致流程如下:

  • Dockerfile的第一條指令一般都是FROM,表示從一個基礎(chǔ)鏡像開始構(gòu)建
  • 執(zhí)行一條命令對鏡像做出修改
  • 提交更新
  • 基于本次更新欲侮,運行新的容器
  • 繼續(xù)執(zhí)行下一條命令
  • 如此反復(fù)執(zhí)行……

2.2 緩存

在構(gòu)建過程中每次生成一層新的鏡像的時候這個鏡像就會被緩存崭闲。即使是后面的某個步驟導(dǎo)致構(gòu)建失敗,再次構(gòu)建的時候就會從失敗的那層鏡像的前一條指令繼續(xù)往下執(zhí)行威蕉。
如果不想使用這種緩存功能刁俭,可以在構(gòu)建的時候加上--no-cache選項:

docker build --no-cache -t="hylexus/nginx-1" .

下一篇將介紹Dockerfile常用指令。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末韧涨,一起剝皮案震驚了整個濱河市牍戚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虑粥,老刑警劉巖如孝,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舀奶,居然都是意外死亡暑竟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門育勺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但荤,“玉大人,你說我怎么就攤上這事涧至「乖辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵南蓬,是天一觀的道長纺非。 經(jīng)常有香客問我哑了,道長,這世上最難降的妖魔是什么烧颖? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任弱左,我火速辦了婚禮,結(jié)果婚禮上炕淮,老公的妹妹穿的比我還像新娘拆火。我一直安慰自己,他們只是感情好涂圆,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布们镜。 她就那樣靜靜地躺著,像睡著了一般润歉。 火紅的嫁衣襯著肌膚如雪模狭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天踩衩,我揣著相機與錄音嚼鹉,去河邊找鬼。 笑死九妈,一個胖子當(dāng)著我的面吹牛反砌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萌朱,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼宴树,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶疼?” 一聲冷哼從身側(cè)響起酒贬,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翠霍,沒想到半個月后锭吨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡寒匙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年零如,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锄弱。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡考蕾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出会宪,到底是詐尸還是另有隱情肖卧,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布掸鹅,位于F島的核電站塞帐,受9級特大地震影響拦赠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葵姥,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一荷鼠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牌里,春花似錦颊咬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敞临。三九已至态辛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挺尿,已是汗流浹背奏黑。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留编矾,地道東北人熟史。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像窄俏,于是被迫代替她去往敵國和親蹂匹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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