亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

使用docker搭建開發(fā)環(huán)境

caozhijian / 2787人閱讀

摘要:我的主力機(jī)是下面有太多提升效率的軟件但是開發(fā)的時(shí)候不得不使用就單單開發(fā)而言我還是喜歡使用所以就造成了我得在下面使用虛擬機(jī)這是最開始的辦法后面得知有這個(gè)東西之后用了一陣子感覺還不錯(cuò)但是我使用的時(shí)候動(dòng)不動(dòng)就會(huì)出現(xiàn)一些問題所以一怒之下決定學(xué)學(xué)然后

我的主力機(jī)是windows,windows下面有太多提升效率的軟件.但是開發(fā)的時(shí)候不得不使用linux.就單單開發(fā)而言.我還是喜歡使用linux.所以就造成了我得在windows下面使用虛擬機(jī).這是最開始的辦法.后面得知有vagrant這個(gè)東西之后,用了一陣子感覺還不錯(cuò).但是我使用的時(shí)候動(dòng)不動(dòng)就會(huì)出現(xiàn)一些問題,所以一怒之下決定學(xué)學(xué)docker.然后使用docker來(lái)作為開發(fā)環(huán)境.

使用docker作為開發(fā)環(huán)境大概我有這幾點(diǎn)要求

部署快,不要換臺(tái)機(jī)子裝了一天的環(huán)境

穩(wěn)定...

輕輕輕!

container得可以訪問本機(jī)所在局域網(wǎng)

可以實(shí)現(xiàn)文件共享

在我接觸了一陣子docker之后,發(fā)現(xiàn)docker可以滿足我大部分意淫出來(lái)的美好開發(fā)環(huán)境.折騰一番之后終于搞定,于是祭出本文.希望可以幫助到需要的人.

學(xué)習(xí)本篇之前希望你對(duì)docker有一丟丟的了解,一丟丟就可以了.

安裝.

我一般不喜歡講如何安裝一個(gè)軟件,但是介于docker的一些問題.還是講講.

如果是windows10之前的用戶,那么安裝docker比較麻煩. 你可能需要一個(gè)Docker Toolbox的東西,具體安裝方式請(qǐng)自行g(shù)oogle.因?yàn)槲业臋C(jī)子是Windows10的.

如果你是Windows10的用戶,恭喜你.你只要點(diǎn)這里下載一個(gè)exe文件,然后就可以無(wú)腦安裝了.但是要保證開啟Hyper-V功能.如何開啟看這里.注意,這個(gè)開啟之后就不能使用virtualbox虛擬機(jī)了.

安裝好之后,啟動(dòng)docker在左下角就可以看到docker的logo了.之后我們的操作都是在PowerShell/CMD下面執(zhí)行的了.執(zhí)行docker info會(huì)看到下面的內(nèi)容

PS C:Windowssystem32WindowsPowerShellv1.0> docker info
Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 4
........

由于docker主機(jī)在外國(guó),安裝好之后我們需要更改下源,不然下載image的時(shí)候會(huì)很慢.這里使用daoCloud提供的鏡像,你需要注冊(cè)登錄之后,獲取到每個(gè)人獨(dú)一無(wú)二的url.然后粘貼要下面就可以了.記得重啟啊喂...

基本概念

在使用docker之前你要明白兩個(gè)概念,兩個(gè)學(xué)docker過(guò)程中一定會(huì)一直強(qiáng)調(diào)的概念

image

container (這種術(shù)語(yǔ)直接使用英文,不做翻譯)

這兩個(gè)是整個(gè)docker的基礎(chǔ)概念,這里本著不負(fù)責(zé)任的僥幸心理大概的說(shuō)一下這兩個(gè)的區(qū)別.

image是靜態(tài)的,類比為面向?qū)ο缶褪且粋€(gè)類

container是動(dòng)態(tài)運(yùn)行的,類比為面向?qū)ο缶褪且粋€(gè)實(shí)例化的對(duì)象.

一般,container是可運(yùn)行的,我們啟動(dòng)一個(gè)container之后,這個(gè)container里面就是我們的linux環(huán)境.

懂得了上面的意思,你就明白了我們要做的事情很簡(jiǎn)單:找一個(gè)合適的image,這個(gè)image里面應(yīng)該包含一切開發(fā)時(shí)候所需要的東西, 然后啟動(dòng)它,我們就可以在這個(gè)container環(huán)境上工作了.當(dāng)然這個(gè)時(shí)候container應(yīng)該可以跟宿主共享文件.并且可以在本局域網(wǎng)內(nèi)可以被訪問到.

在繼續(xù)搭建我們的開發(fā)環(huán)境之前,我們還是要先學(xué)一點(diǎn)docker的命令和概念的.

id&&name

每個(gè)image都有一個(gè)唯一的id來(lái)標(biāo)識(shí),同樣container也有.這個(gè)唯一的id一般很長(zhǎng),比如:c59dc2dfad95,但是一般我們輸入的時(shí)候只要輸入若干位能標(biāo)識(shí)當(dāng)前系統(tǒng)內(nèi)唯一標(biāo)識(shí)某一個(gè)image就可以了.比如只要輸入c59d可能就可以標(biāo)識(shí)這個(gè)image.除了id,還可以給一個(gè)image起名字,這樣子也可以通過(guò)name來(lái)操作一個(gè)image.

run

通過(guò)docker run image_name可以直接啟動(dòng)本地的一個(gè)image.這個(gè)命令后面可以加很多子參數(shù)來(lái)開啟其他功能.如果本地不存在這個(gè)image,那么docker會(huì)去官方的倉(cāng)庫(kù)去下載,這個(gè)倉(cāng)庫(kù)你可以理解為github一樣的網(wǎng)站,上面存放了許多別人push上去的image.

tag

每個(gè)image都有一個(gè)名稱.除了名稱之外還有一個(gè)叫做tag的東西,這個(gè)稱之為標(biāo)簽的東西可以用來(lái)標(biāo)識(shí)同一個(gè)image的不同版本.如果你沒有給一個(gè)image指定一個(gè)tag,那么docker會(huì)默認(rèn)為這個(gè)iamge添加一個(gè)名為:latest的tag.如果你使用docker run ubuntu,那么就會(huì)默認(rèn)運(yùn)行ubuntu:latest.如果本地沒有這個(gè)image,那么就會(huì)去從倉(cāng)庫(kù)下載ubuntu:latest的iamge.很多時(shí)候你會(huì)看到ubuntu:14.04的image.這個(gè)14.04就是代表這個(gè)image的tag.只是很多時(shí)候image制作者把tag用來(lái)標(biāo)記version了而已.

docker images

這個(gè)命令會(huì)列出本地所有的images.每個(gè)image都會(huì)有一個(gè)獨(dú)一無(wú)二的id.如下面 IMAGE ID字段.

PS C:Windowssystem32WindowsPowerShellv1.0> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-ok           latest              5f93b91bc208        26 hours ago        423.7 MB
ubuntu              latest              a421b4d8494d        27 hours ago        423.1 MB
ubuntu              14.04               3f755ca42730        2 days ago          188 MB
docker ps

這個(gè)命令會(huì)列出所有在運(yùn)行的container.當(dāng)運(yùn)行docker ps -a就會(huì)列出所有的container.包括已經(jīng)退出的container.

docker commit

這個(gè)命令可以把一個(gè)container制作成一個(gè)image.

docker rm && docker rmi

docker rm container_id可以用來(lái)刪除一個(gè)container.docker rmi image_id/image_name可以用來(lái)刪除一個(gè)image.

AUFS

很多文章講docker都會(huì)把這個(gè)放到后面一點(diǎn)講.反正不會(huì)在類似"使用docker做開發(fā)環(huán)境"的文章里面講. 但是我覺得這個(gè)東西是理解docker的關(guān)鍵.所以一定要講.

AUFS比不是docker獨(dú)有的,很多Linux的發(fā)行版中都用到了這個(gè)特性.說(shuō)起AUFS,這個(gè)東西是UFS的升級(jí)版,前面的A就是代表advanced的意思.那AUFS/UFS到底是個(gè)什么東西?

所謂AUFS,Advanced Union File System 就是把不同物理位置的目錄合并mount到同一個(gè)目錄中.這種技術(shù)有一點(diǎn)典型的應(yīng)用:有些linux發(fā)行版只要插入一個(gè)光盤就可以直接運(yùn)行.不用進(jìn)行安裝.你對(duì)系統(tǒng)文件進(jìn)行的增刪改只是反映在電腦的硬盤上面,不會(huì)影響到光盤的內(nèi)容.即對(duì)光盤只讀不寫.那么docker是如何使把這個(gè)技術(shù)應(yīng)用到docker上?

docker把一個(gè)鏡像分成了很多層layer.這些層合并在一起才成為了一個(gè)完整的image.這樣子有什么好處?最直觀的一點(diǎn)就是,ubuntu15.04跟ubuntu16.04的image可能只有一點(diǎn)點(diǎn)差別.這點(diǎn)差別體現(xiàn)在第四層layer上.那么ubuntu15.04跟16.04就可以共享前三層layer.這樣子如果你本地有了ubuntu15.04的image.那么再pull ubuntu16.06的時(shí)候只要把第四層的pull下來(lái)就可以了.

而且,image的所有層都是只讀的,當(dāng)你啟動(dòng)一個(gè)image當(dāng)做container運(yùn)行的時(shí)候,docker會(huì)在image的只讀層上加一層薄薄的可寫層.你在container里面做的所有操作都是反映在可寫層.當(dāng)你退出container之后,下次啟動(dòng)同一個(gè)image,之前操作的所有東西都會(huì)沒有掉.一個(gè)重新做人的image.

這個(gè)時(shí)候有一個(gè)問題就來(lái)了,我們pull一個(gè)image,啟動(dòng)了container.好不容易把該安裝的軟件都安裝好了,然后退出了container.之前安裝的軟件就都沒有了!這個(gè)時(shí)候我們就要使用commit命令了.commit命令可以把當(dāng)前的可寫層合并到image的只讀層里面.這樣子這個(gè)image又多了一層.下次我們啟動(dòng)這個(gè)image的時(shí)候安裝的軟件就都還在了.

一個(gè)image由好幾層layer構(gòu)成.每個(gè)layer都是一個(gè)只讀層

當(dāng)啟動(dòng)一個(gè)container之后,就會(huì)在iamge的只讀層基礎(chǔ)上添加一個(gè)可寫層.所有對(duì)container執(zhí)行的操作都反映在container上.(以上圖片都來(lái)自docker文檔.)

這里提一點(diǎn),當(dāng)使用docker images命令查看iamge信息的時(shí)候,后面的SIZE是表示當(dāng)前iamge所占用的大小,但是不意味著所有SIZE相加起來(lái)就是占用磁盤空間的總大小.一定要注意,可能有image共享若干層layer.這些layer在相加的時(shí)候被計(jì)算了好幾遍.

PS C:Windowssystem32WindowsPowerShellv1.0> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
                            12e32b701daa        25 minutes ago      188 MB
ubuntu              14.04               3f755ca42730        3 days ago          188 MB
centos              6                   8315978ceaaa        6 weeks ago         194.6 MB
刪除

上面的命令提到刪除有rm跟rmi兩個(gè),rm是用來(lái)刪除一個(gè)已經(jīng)退出的container.rmi是用來(lái)刪除一個(gè)image的.有了上面AUFS的概念之后,要明白的是我們使用docker rm container_id的時(shí)候,其實(shí)只是刪除掉了一層可寫層的數(shù)據(jù).因?yàn)橹蛔x層是container跟image共享的.只要iamge沒有被刪掉,那么只讀層的數(shù)據(jù)一定也不會(huì)被刪除掉.

同樣,當(dāng)多個(gè)image共享若干層只讀層的時(shí)候,刪除掉一個(gè)image.只是刪除掉了這個(gè)image獨(dú)有的一層只讀層數(shù)據(jù).其他共享的數(shù)據(jù)并沒有被刪除掉,只有當(dāng)刪除掉所有的image之后,共享的layer層才會(huì)被刪掉.

執(zhí)行刪除命令的時(shí)候會(huì)看到如下的信息,這里每一次deleted都是代表刪除掉了一層layer.

PS C:Windowssystem32WindowsPowerShellv1.0> docker rmi ubuntu-fin
Untagged: ubuntu-fin:latest
Deleted: sha256:9e0728e8edbaf72846c43c629590fba5f46b1d705111d3fb1d79b9cf03a6c50c
Deleted: sha256:d53e457ca7161cd6f2d1b6678ecaafd19043dcaeb1363471867e1047819268fa
Deleted: sha256:496ef4fa137e03d80cf821745f875860d3d3120447326b8609938aa70f2edbd9
Deleted: sha256:12e32b701daa90c435176a273b2b41b4bfb219523c1ae396dc2f7068bbb6c088
Deleted: sha256:e8f29656cf54ad60a17d4b38362d9207b52a846cce3cc13e245fc3b799ff53e9
Deleted: sha256:48f6b521c809e40468886b0a159040503d00a0abb1eabf310451edfea562b459
Deleted: sha256:e94abc94ab1aff00280016eaf0649a75270886a2b60c8fe862ca549a0601949f
Deleted: sha256:3f755ca4273009a8b9d08aa156fbb5e601ed69dc698860938f36b2109c19cc39
Deleted: sha256:565903b66233d5576592815ca4d499bd6fe09a9b4baf83f345aaf64544f1cd78
Deleted: sha256:b653e4373a4b35aa760ff67cfa3de2c9fe3c089823b63ec797eb04de256f86ba
Deleted: sha256:362e536c4e530b94ce4204461e4f8c998705bcb98c91be54dd40b22f50531f3a
Deleted: sha256:b69ad682d83af6a6962b4a60a0b5f033c8d39efcd20dbdf320b6dd8136e50aae
Deleted: sha256:bc224b1b676d12be2a49f99778dda08b90d22747244d0a0afcdf4cfeb7db5d89

我們?cè)賱h除iamge的時(shí)候有時(shí)候不能成功刪除.大概原因有一下幾點(diǎn):

container正在運(yùn)行,你刪除這個(gè)container會(huì)失敗.應(yīng)該使用docker stop container_id退出當(dāng)前container再嘗試刪除.

container退出了,刪除當(dāng)前image也會(huì)失敗.因?yàn)閏ontainer雖然退出,當(dāng)前container保存著運(yùn)行環(huán)境等數(shù)據(jù).container是在iamge的基礎(chǔ)上添加了一層可寫層.所以他們是共享只讀層的.

刪除一個(gè)iamge會(huì)有Untagged: ubuntu:14.04.這個(gè)不是沒有刪除成功.這個(gè)是因?yàn)橛衅渌鹖mage跟這個(gè)ubuntu:14.04共享layer層.所以刪除時(shí)候并沒有真正刪除掉layer層的數(shù)據(jù).


ok,有了上面的預(yù)備知識(shí),我們現(xiàn)在可以開始準(zhǔn)備我們的環(huán)境了.剛剛說(shuō)過(guò),我們退出一個(gè)container之后在container所安裝的軟件,添加的文件等等數(shù)據(jù)都會(huì)丟失掉,所以正確的辦法應(yīng)該是:在一個(gè)container環(huán)境中配置好所有開發(fā)要用到的東西之后,使用docker commit命令來(lái)把當(dāng)前這個(gè)container制作成一個(gè)image.然后下次我們啟動(dòng)這個(gè)image的時(shí)候環(huán)境就是我們所需要的了.但是這樣子會(huì)存在三個(gè)問題:

當(dāng)別人給你一個(gè)image之后,你知道這個(gè)image里面安裝了哪些文件,修改了哪些數(shù)據(jù)么?

每次commit都會(huì)形成一個(gè)新的只讀層.commit次數(shù)多了會(huì)使得image變得越來(lái)越臃腫.

再著,一個(gè)image動(dòng)輒2,3G.帶著這么大個(gè)文件跑也不優(yōu)雅.

要解決上面的這些問題,就要使用Dockerfile了.所以我們開始之前還要做點(diǎn)功課.

Dockerfile

Dockerfile是用來(lái)描述如何構(gòu)建一個(gè)image的,Dockerfile由一些指令構(gòu)成,全部指令大概有20個(gè)左右,這里不全部講解.只講一些我們下面會(huì)用到的.具體Dockerfile的全部用法參考Docker官方出的最佳實(shí)踐.

FROM

我們要制作的image必然是基于某個(gè)現(xiàn)有image的基礎(chǔ),from命令就是用來(lái)指定使用哪個(gè)基礎(chǔ)iamge的.像很多ubuntu官方在Docker Hub上維護(hù)由官方的image.我們下面開發(fā)環(huán)境的搭建就是基于ubuntu:14.04的環(huán)境下完成的.

COPY && ADD

copy命令是把宿主機(jī)上的文件拷貝到image中.add可以是copy的高級(jí)版.

copy要求拷貝的文件在宿主機(jī)上存在

add可以指定一個(gè)url座位源文件,docker會(huì)自動(dòng)去下載這個(gè)url的文件, 然后拷貝到image中.

我們待會(huì)兒就會(huì)用到add指令,因?yàn)槲覀冃枰褂?63的ubuntu源來(lái)替換ubuntu原生的apt-get源.所以我們的Dockerfile會(huì)有類似的指令 : ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list.

CMD

這個(gè)是指定啟動(dòng)一個(gè)container之后,默認(rèn)執(zhí)行的命令.我們執(zhí)行docker run ubuntu:14.04啟動(dòng)一個(gè)container之后,默認(rèn)就進(jìn)入了bash界面.這就說(shuō)明這個(gè)ubuntu:14.04的CMD就是bash.

這里要澄清一個(gè)概念.使用docker run之后默認(rèn)進(jìn)入了bash會(huì)讓很多人以為啟動(dòng)container跟啟動(dòng)一個(gè)虛擬機(jī)沒什么區(qū)別.其實(shí)不是的.docker的container就是為了某個(gè)進(jìn)程而存在的,這個(gè)進(jìn)程就是CMD所指定的程序.比如:CMD /bin/bash就是啟動(dòng)了bash.當(dāng)我們退出了bash之后,整個(gè)container也就退出了.如果你的CMD寫成:CMD service nginx start.你會(huì)發(fā)現(xiàn)container執(zhí)行之后就馬上結(jié)束了.這是因?yàn)檎麄€(gè)container只是為了service nginx start這條命令而存在的,它不會(huì)管你這條命令啟動(dòng)了什么.默認(rèn)啟動(dòng)的bash正好是一直在前臺(tái)運(yùn)行,只有你使用exit命令退出bash的時(shí)候才結(jié)束bash進(jìn)程.這個(gè)時(shí)候container才結(jié)束.才會(huì)讓人有container跟虛擬機(jī)差不多的錯(cuò)覺.

上面的這個(gè)概念很重要,一定要理解透徹.如果沒有搞清楚這點(diǎn).你會(huì)一直覺得docker跟虛擬機(jī)沒有什么區(qū)別.

RUN

這個(gè)命令指定了在構(gòu)建image時(shí)候image中藥執(zhí)行的命令.這么說(shuō)可能有點(diǎn)蹩腳.舉個(gè)例子,我們希望我們的鏡像構(gòu)建好的時(shí)候就安裝好了git.那么我們就可以在Dockerfile里面寫RUN apt-get -y install git.這樣子在構(gòu)建鏡像的時(shí)候就會(huì)去安裝git了.待會(huì)兒我們要安裝的軟件都是通過(guò)這個(gè)命令指定的.也是有了RUN指令,我們就可以知道一個(gè)image構(gòu)建過(guò)程中做了一些什么操作.

好了.Dockerfile我們目前只需要這些指令.下面我們就根據(jù)上面學(xué)到的東西來(lái)快速的搭建我們所需要的開發(fā)環(huán)境.

實(shí)戰(zhàn)--編寫Dockerfile

我知道,上面那樣子好像很隨意的講了一下Dockerfile,肯定也不會(huì)寫.所以,這里我給出我構(gòu)建iamge使用的Dockerfile作為參考.

FROM ubuntu:14.04
ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list
COPY install.sh /usr/local/src/install.sh
COPY supervisord.conf /usr/local/src/supervisord.conf

RUN apt-get  update && 
    apt-get -y install build-essential && 
    apt-get -y install supervisor && 
    cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf && 
    apt-get -y install openssh-server && 
    apt-get -y install git && 
    apt-get -y install vim && 
    apt-get -y install lrzsz && 
    apt-get -y install libxml2-dev && 
    apt-get -y install  pkg-config libssl-dev libsslcommon2-dev && 
    apt-get -y install libbz2-dev && 
    apt-get -y install libcurl4-gnutls-dev && 
    apt-get -y install libjpeg8-dev && 
    apt-get -y install libpng-dev && 
    apt-get -y install libfreetype6-dev && 
    apt-get -y install libmcrypt-dev && 
    apt-get -y install libxslt-dev && 
    apt-get -y install libgmp-dev && 
    apt-get -y install libreadline-dev && 
    ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && 
    bash /usr/local/src/install.sh && 
    adduser --gecos "" --disabled-password chenjiayao &&  
    echo -e "1111
1111" | passwd chenjiayao && 
    echo -e "11
11" | passwd root

CMD supervisord -n

上面的Dockerfile其實(shí)相當(dāng)?shù)暮?jiǎn)單,指令都是我們上面用到的,這里再解釋一下每一行的作用.

第一行FROM ubuntu:14.04指明了使用ubuntu官方維護(hù)的14.04的image作為基礎(chǔ)image來(lái)構(gòu)建自己的image.執(zhí)行這條指令之后,如果你的本地沒有ubuntu:14.04這個(gè)image的話, 那么就會(huì)去hub docker下載

第二行ADD指令上面提到了,這里就是使用163的源代替ubuntu內(nèi)置的源,這樣子下載軟件的速度就會(huì)比較快.

接著是兩個(gè)copy指令.這里從宿主機(jī)拷貝了兩個(gè)文件到鏡像中.其中install.sh是我自己寫的編譯安裝php+apache的腳本文件,這里根據(jù)自己需要來(lái)決定.后面的supervisord是linux下面用來(lái)管理進(jìn)程的軟件.你會(huì)發(fā)現(xiàn)CMD啟動(dòng)的就是supervisord.后面-n參數(shù)說(shuō)明是以前臺(tái)的方式啟動(dòng).而不是后臺(tái)啟動(dòng).這樣子就避免了container運(yùn)行一下就退出了.

RUN 里面都是在安裝軟件.執(zhí)行一些必要的操作.你會(huì)發(fā)現(xiàn)我把所有的軟件安裝都寫成了一個(gè)RUN指令.你可能會(huì)有疑問為什么不使用很多個(gè)RUN來(lái)編寫.為什么要再一個(gè)RUN里面安裝全部軟件.這里就要說(shuō)明一點(diǎn) : 每執(zhí)行一個(gè)Dockerfile的指令都會(huì)讓我們的image增加一層只讀層.所以,寫很多指令的話,我們的image就會(huì)有太多的layer.所以盡量要克制命令的個(gè)數(shù).

CMD命令.這里我沒有使用默認(rèn)的bash作為啟動(dòng)命令是因?yàn)?如果使用bash作為默認(rèn)的啟動(dòng)進(jìn)程之后,當(dāng)前container就只會(huì)有一個(gè)進(jìn)程bash.那么其他的apache.ssh等服務(wù)都不會(huì)自動(dòng)啟動(dòng).*每次運(yùn)行container都得手動(dòng)啟動(dòng)這些服務(wù)很麻煩.所以這里使用supervisor來(lái)管理.配置好supervisor之后,只要啟動(dòng)了supervisor,supervisor就會(huì)自動(dòng)幫我們啟動(dòng)其他進(jìn)程.比如apache.ssh等等.這樣就比較方便.所以如果還不知道supervisor的童鞋,趕緊學(xué)起來(lái),而且相當(dāng)?shù)暮?jiǎn)單.如果就是不學(xué)的同學(xué),也不要急,后面我會(huì)給出我的Dockerfile和其他配置文件.可以直接clone我的.

好了,Dockerfile我們已經(jīng)準(zhǔn)備好了,下面使用docker build -t ubuntu-php .來(lái)構(gòu)建自己的image了.但是在開始之前要強(qiáng)調(diào)一下build的命令.

build命令 接著 -t ubuntu-php表示構(gòu)建好的image的名稱.注意后面的.,這參數(shù)表示的是當(dāng)前目錄.很多時(shí)候我們?cè)谝粋€(gè)目錄下創(chuàng)建了Dockerfile,編寫好之后.使用powershell進(jìn)入這個(gè)目錄. 然后執(zhí)行docker build -t image_name .就開始編譯.很容易就以為最后一個(gè)參數(shù)是指定Dockerfile所在的目錄.其實(shí)不是這樣子的.這個(gè)目錄指定的是當(dāng)前docker編譯這個(gè)image的工作目錄.

要先明白,docker是一個(gè)C/S的軟件,我們使用powerShell輸入命令 .之后命令是被發(fā)送到服務(wù)端執(zhí)行,然后返回結(jié)果的.這跟MySQL一樣.只是我們把客戶端和服務(wù)端安裝在一臺(tái)主機(jī)上.

當(dāng)我們構(gòu)建image的時(shí)候,執(zhí)行類似COPY指令,那么把文件拷貝到image中,但是構(gòu)建文件是在服務(wù)端完成的,如何讓docker服務(wù)端得到拷貝的文件?這里我們就要指定一個(gè)docker構(gòu)建的工作目錄了.當(dāng)構(gòu)建開始的時(shí)候,docker會(huì)把工作目錄下的所有文件都發(fā)送到服務(wù)端.然后開始構(gòu)建.這樣子他就可以得到我們要copy到image的文件了.

所以我們構(gòu)建的時(shí)候指定.是想把當(dāng)前目錄下的文件等發(fā)送到docker服務(wù)端進(jìn)行構(gòu)建.只是在上面,我們的Dockerfile正好是放在了docker構(gòu)建image的工作目錄中了.

那么,既然上面的參數(shù)不是指定Dockerfile所在的目錄.那如果我的機(jī)子上有多個(gè)Dockerfile的話,那么docker會(huì)使用哪個(gè)?我編寫這個(gè)Dockerfile的目的就是希望使用這個(gè)Dockerfile.這個(gè)不用擔(dān)心. 如果你在build的時(shí)候沒有指定使用哪個(gè)Dockerfile.默認(rèn)會(huì)使用構(gòu)建iamge的工作目錄下名字為Dockerfile的那個(gè)Dockerfile....聽著有點(diǎn)暈...如果不想理清楚這些問題.每次構(gòu)建的時(shí)候使用powerShell進(jìn)入Dockerfile所在的目錄下,然后執(zhí)行docker build image_name .就可以了.

在構(gòu)建過(guò)程中會(huì)輸出類似下面的內(nèi)容

PS D:codedockerubuntu> docker build -t ubuntu-fin .
Sending build context to Docker daemon 8.192 kB
Step 1 : FROM ubuntu:14.04
 ---> 3f755ca42730
Step 2 : ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list
Downloading [==================================================>]    872 B/872 B
 ---> 386d7ab302b9
Removing intermediate container f183c42cf864
Step 3 : COPY supervisord.conf /usr/local/src/supervisord.conf
 ---> 8ce5250f8498
Removing intermediate container 2c6d89b3be22
Step 4 : COPY install.sh /usr/local/src
 ---> efa055e7d1b3
Removing intermediate container e0c7dacd9136
Step 5 : RUN apt-get  update &&     apt-get -y install build-essential &&     apt-get -y install supervisor &&  cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf &&     apt-get -y install openssh-server &&     apt-get -y install git &&     apt-get -y install vim &&     apt-get -y install lszrz &&     apt-get -y install libxml2-dev &&     apt-get -y install  pkg-config libssl-dev libsslcommon2-dev &&     apt-get -y install libbz2-dev &&     apt-get -y install libcurl4-gnutls-dev &&     apt-get -y install libjpeg8-dev &&     apt-get -y install libpng-dev &&     apt-get -y install libfreetype6-dev &&     apt-get -y install libmcrypt-dev &&     apt-get -y install libxslt-dev &&     apt-get -y install libgmp-dev &&     apt-get -y install libreadline-dev &&     ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h &&     bash /usr/local/src/install.sh &&     adduser --gecos "" --disabled-password chenjiayao &&     echo -e "1111
1111" | passwd chenjiayao &&     echo -e "11
11" | passwd root
 ---> Running in 1dd5ade41249

發(fā)現(xiàn),每一個(gè)Step其實(shí)就是執(zhí)行Dockerfile中的每一個(gè)指令.好了,構(gòu)建已經(jīng)開始,等待構(gòu)建結(jié)束之后,我們的環(huán)境也就搭建好了,建議把Dockerfile等構(gòu)建必須的文件放到github上面,以后換一個(gè)環(huán)境.只要下載文件.然后就可以構(gòu)建了.

這里我放出我構(gòu)建環(huán)境時(shí)寫的Dockerfile,有需要自取.傳送門.

最后我們還有三個(gè)問題需要解決:

文件共享

端口映射

commit制作鏡像

這些問題,考慮到文章篇幅應(yīng)該夠多,所以將再開一篇文章簡(jiǎn)介.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27989.html

相關(guān)文章

  • 使用 Docker 搭建 Laravel 本地環(huán)境

    摘要:本文就介紹如何使用搭建本地環(huán)境。講座介紹是現(xiàn)在火熱的一個(gè)容器技術(shù),作為開發(fā)人員有必要掌握它的使用,無(wú)論你是用來(lái)搭建本地環(huán)境,還是部署應(yīng)用。 (原文地址:https://blog.tanteng.me/2017/...) Laravel 官方提供 Homestead 和 Valet 作為本地開發(fā)環(huán)境,Homestead 是一個(gè)官方預(yù)封裝的 Vagrant Box,也就是一個(gè)虛擬機(jī),但是跟...

    StonePanda 評(píng)論0 收藏0
  • 使用 Docker 搭建 Laravel 本地環(huán)境

    摘要:本文就介紹如何使用搭建本地環(huán)境。講座介紹是現(xiàn)在火熱的一個(gè)容器技術(shù),作為開發(fā)人員有必要掌握它的使用,無(wú)論你是用來(lái)搭建本地環(huán)境,還是部署應(yīng)用。 (原文地址:https://blog.tanteng.me/2017/...) Laravel 官方提供 Homestead 和 Valet 作為本地開發(fā)環(huán)境,Homestead 是一個(gè)官方預(yù)封裝的 Vagrant Box,也就是一個(gè)虛擬機(jī),但是跟...

    lscho 評(píng)論0 收藏0
  • 使用 Docker 搭建開發(fā)環(huán)境

    摘要:做了一次分享,主題使用搭建開發(fā)環(huán)境,簡(jiǎn)單介紹了一下的概念,演示了使用構(gòu)建全套環(huán)境。應(yīng)場(chǎng)景通常于如下場(chǎng)景應(yīng)的動(dòng)化打包和發(fā)布動(dòng)化測(cè)試和持續(xù)集成發(fā)布在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫(kù)或其他的后臺(tái)應(yīng)從頭編譯或者擴(kuò)展現(xiàn)有的或平臺(tái)來(lái)搭建的環(huán)境。 做了一次分享,主題《使用 Docker 搭建開發(fā)環(huán)境》,簡(jiǎn)單介紹了一下 Docker 的概念,演示了使用 Docker-compose 構(gòu)建全套 PHP 環(huán)境...

    zxhaaa 評(píng)論0 收藏0
  • 使用 Docker 搭建開發(fā)環(huán)境

    摘要:做了一次分享,主題使用搭建開發(fā)環(huán)境,簡(jiǎn)單介紹了一下的概念,演示了使用構(gòu)建全套環(huán)境。應(yīng)場(chǎng)景通常于如下場(chǎng)景應(yīng)的動(dòng)化打包和發(fā)布動(dòng)化測(cè)試和持續(xù)集成發(fā)布在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫(kù)或其他的后臺(tái)應(yīng)從頭編譯或者擴(kuò)展現(xiàn)有的或平臺(tái)來(lái)搭建的環(huán)境。 做了一次分享,主題《使用 Docker 搭建開發(fā)環(huán)境》,簡(jiǎn)單介紹了一下 Docker 的概念,演示了使用 Docker-compose 構(gòu)建全套 PHP 環(huán)境...

    kycool 評(píng)論0 收藏0
  • 使用 docker 搭建 web 服務(wù)環(huán)境

    摘要:國(guó)內(nèi)的鏡像倉(cāng)庫(kù)由于地理位置的原因,國(guó)內(nèi)訪問的官方倉(cāng)庫(kù)是比較慢的,所以在這里介紹一個(gè)國(guó)內(nèi)的倉(cāng)庫(kù)靈雀云。靈雀云鏡像倉(cāng)庫(kù)中匯集了大量來(lái)自社區(qū)的優(yōu)質(zhì)作品,讓用戶組合復(fù)用容器化微服務(wù),輕松搭建新一代云端應(yīng)用。 本文目的 做過(guò)開發(fā)的人對(duì)開發(fā)環(huán)境的安裝、配置應(yīng)該都不會(huì)太陌生,不管你做什么開發(fā),對(duì)開發(fā)環(huán)境都會(huì)具有一定的依賴性的。對(duì)于 PHP 的 Web 開發(fā)來(lái)說(shuō),開發(fā)環(huán)境至少要有一個(gè) Web 服務(wù)器(...

    Jeffrrey 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<