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