小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

超實(shí)用Docker入門學(xué)習(xí)教程!

 汗血寶馬6 2016-06-01

Docker是什么

Docker是一種容器技術(shù),它可以將應(yīng)用和環(huán)境等進(jìn)行打包,形成一個(gè)獨(dú)立的,類似于iOS的APP形式的“應(yīng)用”,這個(gè)應(yīng)用可以直接被分發(fā)到任意一個(gè)支持Docker的環(huán)境中,通過(guò)簡(jiǎn)單的命令即可啟動(dòng)運(yùn)行。Docker是一種最流行的容器化實(shí)現(xiàn)方案。和虛擬化技術(shù)類似,它極大的方便了應(yīng)用服務(wù)的部署;又與虛擬化技術(shù)不同,它以一種更輕量的方式實(shí)現(xiàn)了應(yīng)用服務(wù)的打包。使用Docker可以讓每個(gè)應(yīng)用彼此相互隔離,在同一臺(tái)機(jī)器上同時(shí)運(yùn)行多個(gè)應(yīng)用,不過(guò)他們彼此之間共享同一個(gè)操作系統(tǒng)。Docker的優(yōu)勢(shì)在于,它可以在更細(xì)的粒度上進(jìn)行資源的管理,也比虛擬化技術(shù)更加節(jié)約資源。

超實(shí)用Docker入門學(xué)習(xí)教程!

上圖:虛擬化和Docker架構(gòu)對(duì)比,來(lái)自Docker官網(wǎng)

基本概念

開(kāi)始試驗(yàn)Docker之前,我們先來(lái)了解一下Docker的幾個(gè)基本概念:

鏡像:我們可以理解為一個(gè)預(yù)配置的系統(tǒng)光盤,這個(gè)光盤插入電腦后就可以啟動(dòng)一個(gè)操作系統(tǒng)。當(dāng)然由于是光盤,所以你無(wú)法修改它或者保存數(shù)據(jù),每次重啟都是一個(gè)原樣全新的系統(tǒng)。Docker里面鏡像基本上和這個(gè)差不多。

容器:同樣一個(gè)鏡像,我們可以同時(shí)啟動(dòng)運(yùn)行多個(gè),運(yùn)行期間的產(chǎn)生的這個(gè)實(shí)例就是容器。把容器內(nèi)的操作和啟動(dòng)它的鏡像進(jìn)行合并,就可以產(chǎn)生一個(gè)新的鏡像。

開(kāi)始

Docker基于LXC技術(shù)實(shí)現(xiàn),依賴于Linux內(nèi)核,所以Docker目前只能在Linux以原生方式運(yùn)行。目前主要的Linux發(fā)行版在他們的軟件倉(cāng)庫(kù)中內(nèi)置了Docker:

Ubuntu:

  • Ubuntu Trusty 14.04 (LTS)

  • Ubuntu Precise 12.04 (LTS)

  • Ubuntu Saucy 13.10

CentOS:

  • CentOS 7

Docker要求64位環(huán)境,這些操作系統(tǒng)下可以直接通過(guò)命令安裝Docker,老一些操作系統(tǒng)Docker官方也提供了安裝方案。下面的實(shí)驗(yàn)基于CentOS 7進(jìn)行。關(guān)于其他版本操作系統(tǒng)上Docker的安裝,請(qǐng)參考官方文檔:https://docs./installation/

在CentOS 7上安裝Docker

使用yum從軟件倉(cāng)庫(kù)安裝Docker:

yum install docker 首先啟動(dòng)Docker的守護(hù)進(jìn)程:service docker start 如果想要Docker在系統(tǒng)啟動(dòng)時(shí)運(yùn)行,執(zhí)行:chkconfig docker on Docker在CentOS上好像和防火墻有沖突,應(yīng)用防火墻規(guī)則后可能導(dǎo)致Docker無(wú)法聯(lián)網(wǎng),重啟Docker可以解決。

Docker倉(cāng)庫(kù)

Docker使用類似git的方式管理鏡像。通過(guò)基本的鏡像可以定制創(chuàng)建出來(lái)不同種應(yīng)用的Docker鏡像。Docker Hub是Docker官方提供的鏡像中心。在這里可以很方便地找到各類應(yīng)用、環(huán)境的鏡像。

由于Docker使用聯(lián)合文件系統(tǒng),所以鏡像就像是夾心餅干一樣一層層構(gòu)成,相同底層的鏡像可以共享。所以Docker還是相當(dāng)節(jié)約磁盤空間的。要使用一 個(gè)鏡像,需要先從遠(yuǎn)程的鏡像注冊(cè)中心拉取,這點(diǎn)非常類似git。

docker pull ubuntu 我們很容易就能從Docker Hub鏡像注冊(cè)中心下載一個(gè)最新版本的ubuntu鏡像到本地。國(guó)內(nèi)網(wǎng)絡(luò)可能會(huì)稍慢,DAOCLOUD提供了Docker Hub的國(guó)內(nèi)加速服務(wù),可以嘗試配置使用。

運(yùn)行一個(gè)容器

使用Docker最關(guān)鍵的一步就是從鏡像創(chuàng)建容器。有兩種方式可以創(chuàng)建一個(gè)容器:使用docker create命令創(chuàng)建容器,或者使用docker run命令運(yùn)行一個(gè)新容器。兩個(gè)命令并沒(méi)有太大差別,只是前者創(chuàng)建后并不會(huì)立即啟動(dòng)容器。

以u(píng)buntu為例,我們啟動(dòng)一個(gè)新容器,并將ubuntu的Shell作為入口:

docker run -i -t ubuntu /bin/bash這時(shí)候我們成功創(chuàng)建了一個(gè)Ubuntu的容器,并將當(dāng)前終端連接為這個(gè)Ubuntu的bash shell。這時(shí)候就可以愉快地使用Ubuntu的相關(guān)命令了~可以快速體驗(yàn)一下。

參數(shù)-i表示這是一個(gè)交互容器,會(huì)把當(dāng)前標(biāo)準(zhǔn)輸入重定向到容器的標(biāo)準(zhǔn)輸入中,而不是終止程序運(yùn)行。-t指為這個(gè)容器分配一個(gè)終端。

好了,按Ctrl D可以退出這個(gè)容器了。

在容器運(yùn)行期間,我們可以通過(guò)docker ps命令看到所有當(dāng)前正在運(yùn)行的容器。添加-a參數(shù)可以看到所有創(chuàng)建的容器:

docker ps -a [root@localhost ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

cb2b06c83a50 ubuntu:latest 'sh -c /bin/bash' 7 minutes ago Exited (0) 7 seconds ago trusting_morse

每個(gè)容器都有一個(gè)唯一的ID標(biāo)識(shí),通過(guò)ID可以對(duì)這個(gè)容器進(jìn)行管理和操作。在創(chuàng)建容器時(shí),我們可以通過(guò)–name參數(shù)指定一個(gè)容器名稱,如果沒(méi)有指定系統(tǒng)將會(huì)分配一個(gè),就像這里的“trusting_morse”(什么鬼TAT)。

當(dāng)我們按Ctrl D退出容器時(shí),命令執(zhí)行完了,所以容器也就退出了。要重新啟動(dòng)這個(gè)容器,可以使用docker start命令:

docker start -i trusting_morse 同樣,-i參數(shù)表示需要交互式支持。

注意:每次執(zhí)行docker run命令都會(huì)創(chuàng)建新的容器,建議一次創(chuàng)建后,使用docker start/stop來(lái)啟動(dòng)和停用容器。

存儲(chǔ)

在Docker容器運(yùn)行期間,對(duì)文件系統(tǒng)的所有修改都會(huì)以增量的方式反映在容器使用的聯(lián)合文件系統(tǒng)中,并不是真正的對(duì)只讀層數(shù)據(jù)信息修改。每次運(yùn)行容器對(duì)它的修改,都可以理解成對(duì)夾心餅干又添加了一層奶油。這層奶油僅供當(dāng)前容器使用。當(dāng)刪除Docker容器,或通過(guò)該鏡像重新啟動(dòng)時(shí),之前的更改將會(huì)丟失。這樣做并不便于我們持久化和共享數(shù)據(jù)。Docker的數(shù)據(jù)卷這個(gè)東西可以幫到我們。

在創(chuàng)建容器時(shí),通過(guò)-v參數(shù)可以指定將容器內(nèi)的某個(gè)目錄作為數(shù)據(jù)卷加載:

docker run -i -t -v /home/www ubuntu:latest sh -c '/bin/bash' 在容器中會(huì)多一個(gè)/home/www掛載點(diǎn),在這個(gè)掛載點(diǎn)存儲(chǔ)數(shù)據(jù)會(huì)繞過(guò)聯(lián)合文件系統(tǒng)。我們可以通過(guò)下面的命令來(lái)找到這個(gè)數(shù)據(jù)卷在主機(jī)上真正的存儲(chǔ)位置:docker inspect -f {{.Volumes}} trusting_morse 你會(huì)看到輸出了一個(gè)指向到/var/lib/docker/vfs/dir/...的目錄。cd進(jìn)入后你會(huì)發(fā)現(xiàn)在容器中對(duì)/home/www的讀寫創(chuàng)建,都會(huì)反映到這兒。事實(shí)上,/home/www就是掛載自這個(gè)位置。

有時(shí)候,我們需要將本地的文件目錄掛載到容器內(nèi)的位置,同樣是使用數(shù)據(jù)卷這一個(gè)特性,-v參數(shù)格式為:

docker run -it -v [host_dir]:[container_dir]

host_dir是主機(jī)的目錄,container_dir是容器的目錄.

容器和容器之間是可以共享數(shù)據(jù)卷的,我們可以單獨(dú)創(chuàng)建一些容器,存放如數(shù)據(jù)庫(kù)持久化存儲(chǔ)、配置文件一類的東西,然而這些容器并不需要運(yùn)行。

docker run --name dbdata ubuntu echo 'Data container.'在需要使用這個(gè)數(shù)據(jù)容器的容器創(chuàng)建時(shí)–volumes-from [容器名]的方式來(lái)使用這個(gè)數(shù)據(jù)共享容器。

網(wǎng)絡(luò)

Docker容器內(nèi)的系統(tǒng)工作起來(lái)就像是一個(gè)虛擬機(jī),容器內(nèi)開(kāi)放的端口并不會(huì)真正開(kāi)放在主機(jī)上??梢允刮覀兊娜萜鞲影踩也粫?huì)產(chǎn)生容器間端口的爭(zhēng)用。想要將Docker容器的端口開(kāi)放到主機(jī)上,可以使用類似端口映射的方式。

在Docker容器創(chuàng)建時(shí),通過(guò)指定-p參數(shù)可以暴露容器的端口在主機(jī)上:

docker run -it -p 22 ubuntu sh -c '/bin/bash' 現(xiàn)在我們就將容器的22端口開(kāi)放在了主機(jī)上,注意主機(jī)上對(duì)應(yīng)端口是自動(dòng)分配的。如果想要指定某個(gè)端口,可以通過(guò)-p [主機(jī)端口]:[容器端口]參數(shù)指定。

容器和容器之間想要網(wǎng)絡(luò)通訊,可以直接使用–link參數(shù)將兩個(gè)容器連接起來(lái)。例如WordPress容器對(duì)some-mysql的連接:

docker run --name some-wordpress --link some-mysql:mysql -p 8080:80 -d wordpress 環(huán)境變量

通過(guò)Docker打包的應(yīng)用,對(duì)外就像是一個(gè)密閉的exe可執(zhí)行文件。有時(shí)候我們希望Docker能夠使用一些外部的參數(shù)來(lái)使用容器,這時(shí)候參數(shù)可以通過(guò)環(huán)境變量傳遞進(jìn)去,通常情況下用來(lái)傳遞比如MySQL數(shù)據(jù)庫(kù)連接這種的東西。環(huán)境變量通過(guò)-e參數(shù)向容器傳遞:

docker run --name some-wordpress -e WORDPRESS_DB_HOST=10.1.2.3:3306 \

-e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -d wordpress

關(guān)于Docker到現(xiàn)在就有了一個(gè)基本的認(rèn)識(shí)了。接下來(lái)我會(huì)給大家介紹如何創(chuàng)建鏡像。

創(chuàng)建鏡像

Docker強(qiáng)大的威力在于可以把自己開(kāi)發(fā)的應(yīng)用隨同各種依賴環(huán)境一起打包、分發(fā)、運(yùn)行。要?jiǎng)?chuàng)建一個(gè)新的Docker鏡像,通?;谝粋€(gè)已有的Docker鏡像來(lái)創(chuàng)建。Docker提供了兩種方式來(lái)創(chuàng)建鏡像:把容器創(chuàng)建為一個(gè)新的鏡像、使用Dockerfile創(chuàng)建鏡像。

將容器創(chuàng)建為鏡像

為了創(chuàng)建一個(gè)新的鏡像,我們先創(chuàng)建一個(gè)新的容器作為基底:

docker run -it ubuntu:latest sh -c '/bin/bash' 現(xiàn)在我們可以對(duì)這個(gè)容器進(jìn)行修改了,例如我們可以配置PHP環(huán)境、將我們的項(xiàng)目代碼部署在里面等:apt-get install php

# some other opreations ...

當(dāng)執(zhí)行完操作之后,我們按Ctrl D退出容器,接下來(lái)使用docker ps -a來(lái)查找我們剛剛創(chuàng)建的容器ID:docker ps -a 可以看到我們最后操作的那個(gè)ubuntu容器。這時(shí)候只需要使用docker commit即可把這個(gè)容器變?yōu)橐粋€(gè)鏡像了:docker commit 8d93082a9ce1 ubuntu:myubuntu這時(shí)候docker容器會(huì)被創(chuàng)建為一個(gè)新的Ubuntu鏡像,版本名稱為myubuntu。以后我們可以隨時(shí)使用這個(gè)鏡像來(lái)創(chuàng)建容器了,新的容器將自動(dòng)包含上面對(duì)容器的操作。

如果我們要在另外一臺(tái)機(jī)器上使用這個(gè)鏡像,可以將一個(gè)鏡像導(dǎo)出:

docker save -o myubuntu.tar.gz ubuntu:myubuntu 現(xiàn)在我們可以把剛才創(chuàng)建的鏡像打包為一個(gè)文件分發(fā)和遷移了。要在一臺(tái)機(jī)器上導(dǎo)入鏡像,只需要:docker import myubuntu.tar.gz這樣在新機(jī)器上就擁有了這個(gè)鏡像。

注意:通過(guò)導(dǎo)入導(dǎo)出的方式分發(fā)鏡像并不是Docker的最佳實(shí)踐,因?yàn)槲覀冇蠨ocker Hub。

Docker Hub提供了類似GitHub的鏡像存管服務(wù)。一個(gè)鏡像發(fā)布到Docker Hub不僅可以供更多人使用,而且便于鏡像的版本管理。關(guān)于Docker Hub的使用,之后我會(huì)單獨(dú)寫一篇文章展開(kāi)介紹。另外,在一個(gè)企業(yè)內(nèi)部可以通過(guò)自建docker-registry的方式來(lái)統(tǒng)一管理和發(fā)布鏡像。將Docker Registry集成到版本管理和上線發(fā)布的工作流之中,還有許多工作要做,在我整理出最佳實(shí)踐后會(huì)第一時(shí)間分享。

使用Dockerfile創(chuàng)建鏡像

使用命令行的方式創(chuàng)建Docker鏡像通常難以自動(dòng)化操作。在更多的時(shí)候,我們使用Dockerfile來(lái)創(chuàng)建Docker鏡像。Dockerfile是一個(gè)純文本文件,它記載了從一個(gè)鏡像創(chuàng)建另一個(gè)新鏡像的步驟。撰寫好Dockerfile文件之后,我們就可以輕而易舉的使用docker build命令來(lái)創(chuàng)建鏡像了.

Dockerfile非常簡(jiǎn)單,僅有以下命令在Dockerfile中常被使用:

超實(shí)用Docker入門學(xué)習(xí)教程!

下面是一個(gè)Dockerfile的例子:

# This is a commentFROM ubuntu:14.04 MAINTAINER Kate Smith <ksmith@example.com> RUN apt-get update && apt-get install -y ruby ruby-dev

RUN gem install sinatra

這里其他命令都比較好理解,唯獨(dú)CMD和ENTRYPOINT我需要特殊說(shuō)明一下。CMD命令可用指定Docker容器啟動(dòng)時(shí)默認(rèn)的命令,例如我們上面例子提到的docker run -it ubuntu:latest sh -c '/bin/bash'。其中sh -c '/bin/bash'就是通過(guò)手工指定傳入的CMD。如果我們不加這個(gè)參數(shù),那么容器將會(huì)默認(rèn)使用CMD指定的命令啟動(dòng)。ENTRYPOINT是什么呢?從字面看是進(jìn)入點(diǎn)。沒(méi)錯(cuò),它就是進(jìn)入點(diǎn)。ENTRYPOINT用來(lái)指定特定的可執(zhí)行文件、Shell腳本,并把啟動(dòng)參數(shù)或CMD指定的默認(rèn)值,當(dāng)作附加參數(shù)傳遞給ENTRYPOINT。

不好理解是吧?我們舉一個(gè)例子:

ENTRYPOINT ['/usr/bin/mysql']

CMD ['-h 192.168.100.128', '-p']

假設(shè)這個(gè)鏡像內(nèi)已經(jīng)準(zhǔn)備好了mysql-client,那么通過(guò)這個(gè)鏡像,不加任何額外參數(shù)啟動(dòng)容器,將會(huì)給我們一個(gè)mysql的控制臺(tái),默認(rèn)連接到192.168.100.128這個(gè)主機(jī)。然而我們也可以通過(guò)指定參數(shù),來(lái)連接別的主機(jī)。但是不管無(wú)論如何,我們都無(wú)法啟動(dòng)一個(gè)除了mysql客戶端以外的程序。因?yàn)檫@個(gè)容器的ENTRYPOINT就限定了我們只能在mysql這個(gè)客戶端內(nèi)做事情。這下是不是明白了~

因此,我們?cè)谑褂肈ockerfile創(chuàng)建文件的時(shí)候,可以創(chuàng)建一個(gè)entrypoint.sh腳本,作為系統(tǒng)入口。在這個(gè)文件里面,我們可以進(jìn)行一些基礎(chǔ)性的自舉操作,比如檢查環(huán)境變量,根據(jù)需要初始化數(shù)據(jù)庫(kù)等等。下面兩個(gè)文件是我在SimpleOA項(xiàng)目中添加的Dockerfile和entrypoint.sh,僅供參考:

  • https://github.com/starlight36/SimpleOA/blob/master/Dockerfile

  • https://github.com/starlight36/SimpleOA/blob/master/docker-entrypoint.sh

在準(zhǔn)備好Dockerfile之后,我們就可以創(chuàng)建鏡像了:docker build -t starlight36/simpleoa .關(guān)于Dockerfile的更詳細(xì)說(shuō)明,請(qǐng)參考 https://docs./reference/builder/。

雜項(xiàng)和最佳實(shí)踐

在產(chǎn)品構(gòu)建的生命周期里使用Docker,最佳實(shí)踐是把Docker集成到現(xiàn)有的構(gòu)建發(fā)布流程里面。這個(gè)過(guò)程并不復(fù)雜,可以在持續(xù)集成系統(tǒng)構(gòu)建測(cè)試完成后,將打包的步驟改為docker build,持續(xù)集成服務(wù)將會(huì)自動(dòng)將構(gòu)建相應(yīng)的Docker鏡像。打包完成后,可以由持續(xù)集成系統(tǒng)自動(dòng)將鏡像推送到Docker Registry中。生產(chǎn)服務(wù)器可以直接Pull最新版本的鏡像,更新容器即可很快地實(shí)現(xiàn)更新上線。目前Atlassian Bamboo已經(jīng)支持Docker的構(gòu)建了。

由于Docker使用聯(lián)合文件系統(tǒng),所以并不用擔(dān)心多次發(fā)布的版本會(huì)占用更多的磁盤資源,相同的鏡像只存儲(chǔ)一份。所以最佳實(shí)踐是在不同層次上構(gòu)建Docker鏡像。比如應(yīng)用服務(wù)器依賴于PHP Nginx環(huán)境,那么可以把定制好的這個(gè)PHP環(huán)境作為一個(gè)鏡像,應(yīng)用服務(wù)器從這個(gè)鏡像構(gòu)建鏡像。這樣做的好處是,如果PHP環(huán)境要升級(jí),更新了這個(gè)鏡像后,重新構(gòu)建應(yīng)用鏡像即可完成升級(jí),而不需要每個(gè)應(yīng)用項(xiàng)目分別升級(jí)PHP環(huán)境。

新手經(jīng)常會(huì)有疑問(wèn)的是關(guān)于Docker打包的粒度,比如MySQL要不要放在鏡像中?最佳實(shí)踐是根據(jù)應(yīng)用的規(guī)模和可預(yù)見(jiàn)的擴(kuò)展性來(lái)確定Docker打包的粒度。例如某小型項(xiàng)目管理系統(tǒng)使用LAMP環(huán)境,由于團(tuán)隊(duì)規(guī)模和使用人數(shù)并不會(huì)有太大的變化(可預(yù)計(jì)的團(tuán)隊(duì)規(guī)模范圍是幾人到幾千人),數(shù)據(jù)庫(kù)也不會(huì)承受無(wú)法承載的記錄數(shù)(生命周期內(nèi)可能一個(gè)表最多會(huì)有數(shù)十萬(wàn)條記錄),并且客戶最關(guān)心的是快速部署使用。那么這時(shí)候把MySQL作為依賴放在鏡像里是一種不錯(cuò)的選擇。當(dāng)然如果你在為一個(gè)互聯(lián)網(wǎng)產(chǎn)品打包,那最好就是把MySQL獨(dú)立出來(lái),因?yàn)镸ySQL很可能會(huì)單獨(dú)做優(yōu)化做集群等。

使用公有云構(gòu)建發(fā)布運(yùn)行Docker也是個(gè)不錯(cuò)的選擇。DaoCloud提供了從構(gòu)建到發(fā)布到運(yùn)行的全生命周期服務(wù)。特別適合像微擎這種微信公眾平臺(tái)、或者中小型企業(yè)CRM系統(tǒng)。上線周期更短,比使用IAAS、PAAS的云服務(wù)更具有優(yōu)勢(shì)。

參考資料:

  • 深入理解Docker Volume http:///article/128

  • WordPress https://registry.hub./_/wordpress/

  • Docker學(xué)習(xí)——鏡像導(dǎo)出 http://www./u/756/blog/5339

  • Dockerfile Reference https://docs./reference/builder/

  • 關(guān)于Dockerfile http://blog./docker/2014/05/08/docker-2-dockerfile.html


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多