分布式進階(二)Ubuntu 14.04下安裝Dockr圖文教程(二)
4.1?構(gòu)建我們自己的映像
構(gòu)建Docker映像有兩種方法:
?通過docker?commit(提交)命令
?通過docker?build(構(gòu)建)命令以及Docker文件(Dockerfile)
目前并不推薦docker提交方法,因為借助Docker文件進行構(gòu)建要靈活得多、強大得多,但為了力求完整起見,我會向你演示提交方法。
之后,我將重點介紹推薦的Docker映像構(gòu)建方法:編寫Docker文件,然后使用docker構(gòu)建命令。
4.1.1?使用Docker提交命令來創(chuàng)建映像
我將創(chuàng)建一個容器,并對該容器進行更改――就像更改代碼那樣,然后將那些變更內(nèi)容提交給新的映像。
不妨先通過我們在過去使用的ubuntu映像來創(chuàng)建一個容器。
docker?run?-i?-t?ubuntu?/bin/bash
root@73527b8b4261:/#
注意:請注意上面的root顯示了主機名稱73527b8b4261,它是所創(chuàng)建的容器名稱;它與你的情況會不一樣。
此外,我會將apache安裝在容器里面:
sudo?apt-get?install?apache2
我已啟動了容器,然后將Apache安裝在里面。現(xiàn)在,我準備將該容器用作Web服務(wù)器,所以我將它保存在當前狀態(tài)。
這樣一來,我每次創(chuàng)建一個新的容器時,就沒必要用Apache來重新構(gòu)建它。為此,我將退出容器,使用exit命令,然后使用docker提交命令。
exit
docker?commit?73527b8b4261?srijan/apache2?8ce0ea7a1528
注意:這里的73527b8b4261是我的容器名稱;我為容器使用8ce0ea7a1528標記,你可以賦予任何標記名稱,也可以使用同一個名稱。
假設(shè)你忘了上一個創(chuàng)建的容器的編號,可以使用這個命令:
docker?ps?-l?-q
它會得出73527b8b4261
注意:73527b8b4261是你上一個創(chuàng)建的容器名稱,它與你的情況可能不一樣。
不妨看一下我們的新映像。它可以這樣獲得,如下所示:
srijan@vboxtest:~$?docker?images?srijan/apache2
REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????VIRTUAL?SIZE
srijan/apache2??????8ce0ea7a1528????????741155868ac8????????6?minutes?ago???????207.2?MB
srijan@vboxtest:~$
注意:這里的8ce0ea7a1528是我在保存容器時所使用的標記名稱;
注意:741155868ac8是該容器的映像編號;
注意:所有這些值與你的情況可能不一樣,因為在保存容器時,docker會創(chuàng)建相應(yīng)的隨機名稱。
現(xiàn)在,我將保存定制的映像,如下所示:
sudo?docker?commit?-m="A?new?custom?image"?--author="Srijan?Kishore"?73527b8b4261?srijan/apache2:webserver
它會給出結(jié)果:
f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec
想從我們的新映像運行容器,我們只要使用docker?run(運行)命令。
docker?run?-t?-i?srijan/apache2:webserver?/bin/bash
我們可以反復核對已提交的映像,如下所示:
srijan@vboxtest:~$?docker?inspect?srijan/apache2:webserver
[{
"Architecture":?"amd64",
"Author":?"Srijan?Kishore",
"Comment":?"A?new?custom?image",
"Config":?{
"AttachStderr":?false,
......................................................................
"Parent":?"ef83896b7fb99b00b9e0e6ac943826386e7edcef11a3a2f58b42011ab4a4e683",
"Size":?14463026
}
]srijan@vboxtest:~$
想從我們的新映像運行容器,我們可以使用docker運行命令。
4.1.2?用Docker文件構(gòu)建映像
Docker文件使用基本的特定領(lǐng)域語言(DSL),以及用于構(gòu)建Docker映像的指令。然后,我們使用docker構(gòu)建命令,通過Docker文件里面的指令來構(gòu)建新的映像。
Docker公司的開發(fā)團隊還在此發(fā)布了Docker文件教程(http://www.docker.io/learn/dockerfile/),可以幫助大家學會如何構(gòu)建Docker文件。
現(xiàn)在,我將創(chuàng)建一個簡單的docker文件,它可以按照用戶的需求,進一步改進和完善。首先,讓一個目錄假設(shè)為dir=kishore:
mkdir?kishore
cd?kishore
現(xiàn)在創(chuàng)建一個Docker文件,如下所示:
vi?Dockerfile
并輸入內(nèi)容,如下所示:
FROM?ubuntu:12.04
MAINTAINER?Srijan?Kishore?
RUN?apt-get?-qq?update
RUN?apt-get?-qqy?install?apache2
現(xiàn)在打開定制的容器,請使用這個命令:
sudo?docker?build?-t="srijan/custom1"?.
它會得出如下結(jié)果:
[sudo]?password?for?srijan:
Sending?build?context?to?Docker?daemon??2.56?kB
Sending?build?context?to?Docker?daemon
Step?0?:?FROM?ubuntu:12.04
Pulling?repository?ubuntu
ea7d6801c538:?Download?complete
511136ea3c5a:?Download?complete
65b7e9ccb809:?Download?complete
f8dd6bd14f58:?Download?complete
a343823119db:?Download?complete
--->?ea7d6801c538
Step?1?:?MAINTAINER?Srijan?Kishore?
--->?Running?in?a6135f405eb4
--->?be97c22efa82
Removing?intermediate?container?a6135f405eb4
..................................................................................
Removing?intermediate?container?5765c09b530f
Successfully?built?634855a43331
srijan@vboxtest:~/kishore$
現(xiàn)在不妨看一下我們的新映像。為此,我們可以使用docker映像命令來實現(xiàn)。
sudo?docker?images?srijan/custom1
REPOSITORY???TAG?????????IMAGE?ID??????CREATED???????VIRTUAL?SIZE
srijan/custom1???latest?????????634855a43331???About?a?minute?ago???277.4?MB
srijan@vboxtest:~/kishore$
這里,你會發(fā)現(xiàn)映像在默認情況下會安裝apache2。不妨反復核對一下:
docker?run?-t?-i?srijan/apache2:webserver?/bin/bash
現(xiàn)在,你可以進入新容器,而apache2和12.04ubuntu已預裝。
主機名稱的更改
假設(shè)你想更改主機名稱,或者你想有一個定制的主機名稱,比如我這里的server1.example.com。
我會使用:
sudo?docker?run?-h?'server1.example.com'?-t?-i?srijan/custom1?/bin/bash
它會得出映像容器,如下所示:
root@server1:/#?hostname?-f
server1.example.com
root@server1:/#
Docker其它的實用命令集錦
?pull(pull用于從注冊中心拉取映像或軟件庫)
docker?pull?ubuntu
?commit(commit用于保存容器)
docker?commit?73527b8b4261?srijan/apache2?8ce0ea7a1528
?cp(將文件/文件夾從容器的文件系統(tǒng)拷貝到主機路徑。路徑相對于文件系統(tǒng)的根目錄。)
docker?cp?CONTAINER:PATH?HOSTPATH
其中的CONTAINER是容器,將文件/文件夾從PATH拷貝到HOSTPATH
?start和stop容器:
docker?start?4386fb97867d
docker?stop?4386fb97867d
其中的4386fb97867d是你的容器編號
?export(將文件系統(tǒng)的內(nèi)容作為tar存檔文件導出到STDOUT)
docker?export?4386fb97867d?>?latest.tar
?import(創(chuàng)建一個空的文件系統(tǒng)映像,將打包文件[.tar、.tar.gz、.tgz、.bzip、.tar.xz或.txz]的內(nèi)容導入到里面,然后以可選方式標記它。)
docker?import?http://example.com/exampleimage.tgz
從本地文件導入:
通過pipe和stdin導入到docker。
cat?exampleimage.tgz?|?sudo?docker?import?-?exampleimagelocal:new
從本地目錄導入:
sudo?tar?-c?.?|?sudo?docker?import?-?exampleimagedir
?history(顯示映像的歷史記錄)
docker?history?[OPTIONS]?IMAGE
sudo?docker?history?ea7d6801c538
?images(它會顯示映像)
docker?images?[OPTIONS]?[NAME]
它后面跟一些選項,如下所示:
-a,?--all=false?顯示所有映像(默認情況下,過濾掉中間映像層)
-f,?--filter=[]:?提供過濾器值(即“dangling=true”)
--no-trunc=false?不截短輸出
-q,?--quiet=false?只顯示數(shù)字編號
?info(顯示整個系統(tǒng)的信息)
srijan@vboxtest:~$?sudo?docker?info
Containers:?20
Images:?65
Storage?Driver:?aufs
Root?Dir:?/var/lib/docker/aufs
Dirs:?105
Execution?Driver:?native-0.2
Kernel?Version:?3.13.0-30-generic
WARNING:?No?swap?limit?support
?inspect(返回關(guān)于容器/映像的低級信息)
docker?inspect?CONTAINER|IMAGE?[CONTAINER|IMAGE...]
?kill(終止運行中的容器/發(fā)送SIGKILL,即指定信號)
docker?kill?[OPTIONS]?CONTAINER?[CONTAINER...]
?login(注冊或登錄docker注冊中心服務(wù)器,如果未指定任何服務(wù)器,https://index.docker.io/v1/為默認值。)
docker?login?localhost:8080
它會登錄到自托管注冊中心。
?logs(讀取容器的日志)
docker?logs?CONTAINER
?ps(列出容器)
docker?ps?[OPTIONS]
它有下列選項:
-a,?--all=false?顯示所有容器。默認情況下只顯示運行中的容器。
--before=""?只顯示編號或名稱之前創(chuàng)建的容器,包括非運行中的容器。
-l,?--latest=false?只顯示最近創(chuàng)建的容器,包括非運行中的容器。
-n=-1?顯示n個最近創(chuàng)建的容器,包括非運行中的容器。
--no-trunc=false?不截短輸出。
-q,?--quiet=false?只顯示數(shù)字編號。
-s,?--size=false?顯示大小。
--since=""?只顯示自編號或名稱以來創(chuàng)建的容器,包括非運行中的容器。
?push(將映像或軟件庫推送到注冊中心)
docker?push?NAME[:TAG]
?restart(它將重啟運行中的容器)
docker?restart?[OPTIONS]?CONTAINER?[CONTAINER...]
?rm(它將刪除一個或多個容器)
docker?rm?[OPTIONS]?CONTAINER?[CONTAINER...]
?rmi(它將刪除一個或多個映像)
docker?rmi?IMAGE?[IMAGE...]
?run(在新容器中運行命令)
docker?run?[OPTIONS]?IMAGE?[COMMAND]?[ARG...]
它有下列選項:
-a,?--attach=[]?連接到stdin、stdout或stderr
-c,?--cpu-shares=0?處理器共享(相對權(quán)重)
--cidfile=""?將容器編號寫入到文件
-d,?--detach=false?分離模式:在后臺運行容器,輸出新的容器編號
--dns=[]?設(shè)置自定義DNS服務(wù)器
--dns-search=[]?設(shè)置自定義DNS搜索域
-e,?--env=[]?設(shè)置環(huán)境變量
--entrypoint=""?覆蓋映像的默認入口點
--env-file=[]?在行分隔的文件中讀取ENV變量
--expose=[]?暴露來自容器的端口,又不將端口發(fā)布到你的主機
-h,?--hostname=""?容器主機名稱
-i,?--interactive=false?讓stdin保持開放,即便沒有連接
--link=[]?將鏈接添加到另一個容器(名稱:別名)
--lxc-conf=[]?(lxc?exec-driver?only)添加自定義lxc選項--lxc-conf="lxc.cgroup.cpuset.cpus?=?0,1"
-m,?--memory=""?內(nèi)存限制(格式:
--name=""?為容器賦予名稱
--net="bridge"?為容器設(shè)置網(wǎng)絡(luò)模式
'bridge':為docker網(wǎng)橋上的容器創(chuàng)建新的網(wǎng)絡(luò)堆棧
'none':不為該容器創(chuàng)建任何網(wǎng)絡(luò)機制
'container:
'host':使用容器里面的主機網(wǎng)絡(luò)堆棧
-p,?--publish=[]?將容器的端口發(fā)布到主機
格式:ip:hostPort:containerPort?|?ip::containerPort?|?hostPort:containerPort
(使用“docker?port”即可看到實際映射)
-P,?--publish-all=false? 將所有暴露的端口發(fā)布到主機接口
--privileged=false?為該容器賦予擴展后的權(quán)限
--rm=false?容器退出后,自動刪除容器(與-d不兼容)
--sig-proxy=true?將所有收到的信號代理輸出到進程(即便處于非-tty模式下)
-t,?--tty=false?分配偽終端
-u,?--user=""?用戶名稱或UID
-v,?--volume=[]?綁定掛載卷(比如來自host:-v?/host:/container,來自docker:?-v?/container)
--volumes-from=[]?從指定的一個或多個容器掛載卷
-w,?--workdir=""?容器里面的工作目錄
?save(將映像保存到tar存檔文件,默認情況下流式傳輸?shù)絪tdout)
docker?save?IMAGE
?search(搜索docker索引,尋找映像)
docker?search?TERM
?tag(將映像標記到軟件庫)
docker?tag?[OPTIONS]?IMAGE?[REGISTRYHOST/][USERNAME/]NAME[:TAG]
?top(查詢?nèi)萜鞯倪\行中進程)
docker?top?CONTAINER?[ps?OPTIONS]
?version(顯示docker版本信息)
srijan@vboxtest:~$?sudo?docker?version
[sudo]?password?for?srijan:
Client?version:?1.0.1
Client?API?version:?1.12
Go?version?(client):?go1.2.1
Git?commit?(client):?990021a
Server?version:?1.0.1
Server?API?version:?1.12
Go?version?(server):?go1.2.1
Git?commit?(server):?990021a
如果系統(tǒng)中還不存在?Fedora?Docker?鏡像,這個命令會自動下載它,然后啟動這個?Fedora?的?Docker?容器。
上面的命令會立即啟動?Ubuntu?container?容器(這是一個完美的容器!),然后它會提供一個?shell?提示符運行環(huán)境給你。現(xiàn)在開始你可以通過這個沙箱環(huán)境訪問一個完整的?Ubuntu?系統(tǒng)了。
輸入“exit”命令退出?Docker?容器。
導出鏡像
sudo?docker?save?IMAGENAME?|?bzip2?-9?-c>img.tar.bz2
導入鏡像
sudo?bzip2?-d?-c? 在主機節(jié)點上部署了Docker容器中,接著就需要虛擬出多個客戶端容器。 3.Container?容器網(wǎng)絡(luò)設(shè)置 Docker?使用?Linux?橋接技術(shù)與其他容器通信,以及連通外網(wǎng)。安裝完?Docker?后你應(yīng)該可以看到?docker0?這個網(wǎng)橋,這是?Docker?默認創(chuàng)建的。你創(chuàng)建的每個容器都會通過這個網(wǎng)橋連接到網(wǎng)絡(luò)。 4.自定義?Linux?網(wǎng)橋 如果你想自定義網(wǎng)橋,你可以執(zhí)行以下步驟。你可以在這個網(wǎng)橋后面分配一個子網(wǎng),并為這個子網(wǎng)分配地址。下面的命令會為?Docker?子網(wǎng)分配?10.0.0.0/24?地址段: sudo?apt-get?install?bridge-utils sudo?brctl?addbr?br0 sudo?ifconfig?br0?10.0.0.1?netmask?255.255.255.0 然后在?/etc/default/docker.io?文件的?DOCKER_OPTS?變量里添加“-b=br0”選項,并重啟?Docker?服務(wù): sudo?service?docker.io?restart 到目前為止,任何創(chuàng)建的容器都會連上?br0?網(wǎng)橋,它們的?IP?地址會從?10.0.0.0/24?中自動分配(譯注:在10.0.0.2到10.0.0.254之間隨機分配)。 其他自定義設(shè)置 你可以通過?/etc/default/docker.io?文件的?DOCKER_OPTS?變量設(shè)置其他一些屬性: "-dns?8.8.8.8?-dns?8.8.4.4":?為容器指定?DNS?服務(wù)器。 "-icc=false":?將容器與其他容器隔離出來 我試著讓大家更加熟悉docker,但愿本文會幫助各位進一步了解docker,并在自己的測試/生產(chǎn)環(huán)境中充分利用docker。 想了解更多信息,請參閱 http://www.docker.com/ http://www.howtoforge.com/manage-linux-containers-with-docker-on-ubuntu Docker Ubuntu 分布式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。