服务器部署docker
服務(wù)器部署docker
docker簡(jiǎn)介##
- 可以把docker是一個(gè)容器,可以讓開發(fā)者將自己的項(xiàng)目部署到這個(gè)容器中,最常用的場(chǎng)景是將自己的后端項(xiàng)目部署到服務(wù)器的時(shí)候會(huì)將其打入docker鏡像中,可以理解為一個(gè)開銷更小的虛擬機(jī)。
docker好處##
- 可以輕易地讓幾十個(gè)服務(wù)在docker中跑起來,沒有誰敢說能在自己的電腦上跑幾十個(gè)虛擬機(jī)吧,
- docker可以讓開發(fā)者更加貼近生產(chǎn)環(huán)境,即便于測(cè)試,而且同一個(gè)鏡像可以利用在正式和測(cè)試環(huán)境節(jié)約資源
- docker可以將每個(gè)應(yīng)用隔離起來,可以運(yùn)行多個(gè)業(yè)務(wù)。
- docker的安全性極具保障。
docker在阿里云部署##
言歸正傳,這個(gè)博客本身就是用來將docker部署在阿里云的服務(wù)器上。
(1)擁有一臺(tái)阿里云學(xué)生機(jī)(窮)
(2)這邊推薦系統(tǒng)是CentOS 7.3
(3)首先登陸root賬號(hào),這個(gè)正常人應(yīng)該都會(huì)(sudo su root)
(4)接下來是輸入命令 yum install docker
(5)你可以嘗試docker -v來判斷你是否下完 docker基本命令
(6)因?yàn)槲沂且粋€(gè)后端人員,所以我偏向于用IDEA來遠(yuǎn)程docker,這邊就需要涉及到開端口的問題了,docker在阿里云這邊得默認(rèn)端口是2375,這是個(gè)大坑,如果沒踩過,這輩子都連不上,這邊推薦一個(gè)博客,Linux的方面就不再贅述。
(7)因?yàn)榘⒗镌品矫媸悄J(rèn)防火墻不打開2375,所以你在開端口同時(shí),需要把防火墻關(guān)掉,因?yàn)閷W(xué)生機(jī),也不是很怕被爆破,所以我就默認(rèn)全開了。
(8)接下來是IDEA的部分了,一般的IDEA都會(huì)集成docker,首先是配置docker
接下來嘗試連接是否成功應(yīng)該能夠看到以下畫面
這樣初步就完成了docker的部署。
當(dāng)然要把自己的項(xiàng)目部署上去還是要一個(gè)dockerfile腳本,和部分配置,由于我忙著寫lajiruangong只能以后再分享了##
- 這是我個(gè)人的興趣做出的分享,說錯(cuò)得地方請(qǐng)私聊我,以上關(guān)于docker的見解也是我自己的理解說錯(cuò)請(qǐng)指正。
- 預(yù)告下次分享應(yīng)該是docker部署mysql。(部署項(xiàng)目還等下下次吧)
?
文章會(huì)首先介紹Docker的概念,Docker的基本語法和用法,以及和Docker相關(guān)的幾個(gè)工具的介紹。
Docker是什么
容器與Docker
Docker是一種常用的容器化技術(shù)。這里的容器化和虛擬化是對(duì)應(yīng)的概念,即Docker和VirtualBox等等虛擬機(jī)的效果有類似之處,但容器是更輕量化的一套隔離環(huán)境,不會(huì)額外虛擬硬件,很多資源和進(jìn)程都是由宿主機(jī)直接執(zhí)行,因此省了很多資源消耗,速度要比虛擬機(jī)快很多,特別適合機(jī)器學(xué)習(xí)等AI之類的計(jì)算密集型的程序隔離需求。
Docker的容器概念與Spring Boot的容器概念完全不同,后者是指Java代碼的一種組織形式。這兩種不同容器都與微服務(wù)有關(guān)。
為什么學(xué)Docker
首先給大家舉個(gè)很常見的情景。某公司新人小王去辦公室報(bào)道,公司老鳥老李吩咐小王先去把工作用到的開發(fā)環(huán)境部署好再叫他。但是小王是個(gè)萌新程序員,下載這些開發(fā)庫的地址都不知道。冗長(zhǎng)的環(huán)境安裝手冊(cè)看的小王頭昏腦漲,更不用說里面還有些錯(cuò)誤和沒寫清楚的細(xì)節(jié)。這個(gè)場(chǎng)景是不是很多公司都經(jīng)常在上演?其實(shí),我在很久之前就不停的想,都程序員了為什么還要看技術(shù)手冊(cè)自己安裝,難道就沒有一個(gè)可靠的技術(shù)幫我一鍵部署好嗎 ?
?
答案是,當(dāng)然有!你差的就是Docker!有了他,小王只需要下載好前輩寫好的Dockerfile,只要網(wǎng)絡(luò)OK,就可以一鍵運(yùn)行演示程序。有沒有很簡(jiǎn)單?下面我就來拿一個(gè)Github項(xiàng)目來告訴你怎么樣做到。
Docker部署實(shí)例
下面先來看如何部署一個(gè)最簡(jiǎn)單的圖片分類服務(wù)的Demo程序,要求圖片分類模型用深度學(xué)習(xí)框架Keras來實(shí)現(xiàn),并通過flask發(fā)布模型的預(yù)測(cè)功能。下面我們就來看在Docker下的一鍵部署的過程。
?
首先,我們需要從Github上clone一份代碼,進(jìn)入這個(gè)文件夾。
git clone https://github.com/mtobeiyf/keras-flask-deploy-webapp.git cd keras-flask-deploy-webapp
在進(jìn)入到這個(gè)文件夾后,我們不妨看一下都有什么文件:
經(jīng)過之前的學(xué)習(xí),我們可以了解requirements.txt中管理了項(xiàng)目依賴。其他的文件中,Dockerfile是本次文章最核心的一個(gè)文件,有了他Docker才能在本地進(jìn)行鏡像的構(gòu)建。這里我們可以把Dockerfile中的RUN pip install一行替換為RUN pip install -r /requirements.txt -i https://mirrors.aliyun.com/pypi/simple/,通過國(guó)內(nèi)鏡像來加速安裝過程。我們可以輸入下面的指令,自己構(gòu)建一個(gè)測(cè)試鏡像:
docker build -t keras_flask_test .
docker build就是Docker容器的鏡像構(gòu)建命令。這條命令執(zhí)行后,會(huì)需要等待一段時(shí)間(主要是下載和安裝,時(shí)間取決于機(jī)器配置和網(wǎng)絡(luò)環(huán)境情況)。如下圖所示,在這個(gè)項(xiàng)目的dockerfile里定義了7步構(gòu)建。我這里因?yàn)樘崆皹?gòu)建了一次,這次構(gòu)建會(huì)直接從緩存中讀取,所以省略了耗時(shí)的部分。
?
?
?
?
只要看到上圖最后的Successfully built XXX和Successfully tagged XXX就說明已經(jīng)構(gòu)建成功。docker build命令的作用是讓Docker根據(jù)當(dāng)前文件夾的Dockerfile內(nèi)容,自動(dòng)去構(gòu)建名叫keras_flask_test的鏡像。我們可以來確認(rèn)下是否有這個(gè)鏡像:
docker images |grep -i keras keras_flask_test latest af52f1dd1fbb 1 days ago 917MBdocker images是顯示出當(dāng)前系統(tǒng)中存在的所有鏡像,后續(xù)加grep來搜索指定關(guān)鍵詞的鏡像。這里因?yàn)檎弥皹?gòu)建了下,所以是一天前的。讀者朋友如果剛剛構(gòu)建好,鏡像的創(chuàng)建時(shí)間應(yīng)該是最近。有了鏡像,我們就可以實(shí)際運(yùn)行這個(gè)模型服務(wù)了:
docker run -it --rm -p 5000:5000 keras_flask_test這里,docker run就是Docker從鏡像產(chǎn)生一個(gè)容器了。因?yàn)镵eras自動(dòng)調(diào)用了tensorflow,運(yùn)行后的命令會(huì)顯示tensorflow的信息。同時(shí),Keras也會(huì)自動(dòng)下載一個(gè)mobilenetv2的輕量模型。等到一切就緒后,會(huì)提示Model loaded. Check http://127.0.0.1:5000/的信息。到這里,模型部署就已經(jīng)完成了,是不是很6的感覺。我們的模型服務(wù)地址就是本機(jī),端口號(hào)是5000
Docker鏡像與Docker容器的關(guān)系如同程序與進(jìn)程一樣,鏡像是靜態(tài)的基礎(chǔ),而容器是動(dòng)態(tài)的實(shí)例。
這時(shí)候在瀏覽器中,打開http://127.0.0.1:5000應(yīng)該能看到下圖的界面了。我們可以往中間的地方上傳一張圖片,模型會(huì)返回當(dāng)前圖片的類別。大家可以玩玩,不過不要太為難這個(gè)小模型了。
?
?
?
?
Docker常用命令
上面的例子很簡(jiǎn)單,我們回頭總結(jié)和擴(kuò)展相關(guān)的知識(shí)。先總結(jié)下Docker容器化的普遍的流程。
Docker化程序的一般流程
對(duì)于使用者,在得到Docker化程序的代碼后,首先,通過docker build找到Dockerfile構(gòu)建鏡像。然后,docker run從鏡像產(chǎn)生一個(gè)容器的實(shí)例。
?
而對(duì)于開發(fā)者,一般在AI模型的Docker化之前,先由開發(fā)者在自己的非容器環(huán)境中開發(fā)調(diào)試好后才開始。然后開發(fā)者把自己環(huán)境的安裝配置過程,完整的移植到Dockerfile中。一般來說,Dockerfile中的命令要能復(fù)現(xiàn)自己的整個(gè)配置過程,才算真正完整的Docker化程序開發(fā)。開發(fā)者一般需要自己重復(fù)使用者的步驟,以確保整個(gè)過程是真正能在新環(huán)境中重現(xiàn)。
?
簡(jiǎn)單來說,順序是:編寫Dockerfile→build→run三部曲。下面介紹這個(gè)流程相關(guān)的命令。由于Dockerfile的內(nèi)容相對(duì)較多,所以暫時(shí)放在后面來說。我們先從build開始。
構(gòu)建鏡像
構(gòu)建Docker鏡像的命令是docker build,這條命令的基礎(chǔ)是Dockerfile文件。命令的形式為:
docker build [OPTIONS] PATH | URL | -
其中,具體的選項(xiàng)有很多,建議參考幫助來學(xué)習(xí)(docker build --help)。我們著重介紹一些最常見的:
| 作用 | 參數(shù) | 備注 |
| 名稱標(biāo)記 | -t | 格式為-t xxx/yyy:zzz。xxx,yyy和zzz分別是用戶名,鏡像名和標(biāo)簽(版本 |
| Dockerfile位置 | -f | 如果Dockerfile不在當(dāng)前目錄,或者需要構(gòu)建的源文件文件名不是Dockerfile,則需要指定目標(biāo)文件。 |
| 環(huán)境變量 | --build-arg | 構(gòu)建時(shí)需要的環(huán)境變量。例如設(shè)置代理解決構(gòu)建時(shí)的網(wǎng)絡(luò)問題:--build-arg http_proxy=http://xxx:port |
?
一個(gè)簡(jiǎn)單的命令實(shí)例是:
docker build -t test .這條命令就是根據(jù)當(dāng)前目錄的Dockerfile內(nèi)容構(gòu)建名為test的鏡像,命令中最后的.表示構(gòu)建的目錄路徑。
運(yùn)行容器
運(yùn)行Docker容器的命令是docker run,這條命令的基礎(chǔ)是引用的鏡像必須已經(jīng)構(gòu)建好。Docker也為運(yùn)行命令準(zhǔn)備了非常多的選項(xiàng),具體可以參考幫助(docker run --help),這里先列出一部分比較常用的選項(xiàng):
? 相關(guān)參數(shù)可以自行百度
鏡像構(gòu)建可以通過上一步的docker build,自己來完成本地的構(gòu)建。大多情況下,也可以直接使用別人構(gòu)建好并上傳到Dockerhub等Docker鏡像托管網(wǎng)站的鏡像。例如下面一條命令:
docker run -d -p 8080:80 --rm --name mynginx nginx這條命令是后臺(tái)運(yùn)行一個(gè)名為mynginx的nginx服務(wù),把容器中的80端口映射為主機(jī)的8080,容器在停止時(shí)會(huì)自動(dòng)刪除。假設(shè)當(dāng)前系統(tǒng)沒有運(yùn)行過這條命令,Docker會(huì)顯示出以下信息:
?
第一條信息表示Docker沒有找到本地的nginx;latest鏡像;第二條信息顯示從library/nginx上拉取最新的鏡像。后面都是鏡像拉取的分層進(jìn)度,最后一行表示容器運(yùn)行成功后返回的容器ID。
從這里,我們可以發(fā)現(xiàn)docker run的邏輯先搜索本地是否有構(gòu)建過這個(gè)鏡像,找不到時(shí)會(huì)從遠(yuǎn)端服務(wù)器中的倉(cāng)庫拉取最新鏡像回來。這個(gè)過程非常類似Github上拉取代碼,也可以看作一種分布式。
編寫Dockerfile
Dockerfile為鏡像構(gòu)建提供了具體步驟,我們來看下今天介紹的項(xiàng)目中的Dockerfile內(nèi)容:
ADD requirements.txt /
RUN pip install -r /requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
ADD . /app
WORKDIR /app
EXPOSE 5000
CMD [ “python” , “app.py”]
其中,第一行的FROM python:3.6-slim-stretch中的FROM定義了基礎(chǔ)鏡像,這句表示該鏡像基于python:3.6-slim-stretch構(gòu)建,新鏡像會(huì)包含基礎(chǔ)鏡像的所有文件。后面的EXPOSE表示鏡像的容器對(duì)外暴露什么端口,這與docker run -p xxxx:yyyy中的yyyy對(duì)應(yīng)。CMD表示鏡像的容器運(yùn)行后,自動(dòng)執(zhí)行的一條命令,類似于容器的入口命令。而剩下中間的許多行,則是構(gòu)建鏡像中需要的具體指令。
?
完結(jié).
分類: NLP, 云計(jì)算 虛擬化 容器總結(jié)
以上是生活随笔為你收集整理的服务器部署docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KD Tree的原理及Python实现
- 下一篇: 论文浅尝 | Understanding