導讀: 軟件開發最大的麻煩事之一就是環境配置,操做系統設置,各類庫和組件的安裝。只有它們都正確,軟件才能運行。若是從一種操做系統裏面運行另外一種操做系統,一般咱們採起的策略就是引入虛擬機,好比在 Windows 系統裏面運行 Linux 系統。這種方式有個很大的缺點就是資源佔用多、冗餘步驟多、啓動慢。目前最流行的 Linux 容器解決方案之一就是Docker,它最大優勢就是輕量、資源佔用少、啓動快。本文從什麼是Docker?Docker解決什麼問題?有哪些好處?如何去部署實現去全面介紹。php
設想這樣一個真實案例,假如咱們要部署一個Python應用程序,要作哪些工做?python
能夠看出,在 Docker 以前軟件行業的運維存在着如下這些痛點:mysql
在完成Docker部署安裝以前,咱們仍是先認識下Docker的優勢:web
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,聽從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。2013年3月,dotCloud公司的創始人之一,Docker之父,28歲的Solomon Hykes正式決定,將Docker項目開源,Docker 自開源後受到普遍的關注和討論。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中普遍應用。WIn10下Docker下載地址:連接: https://pan.baidu.com/s/1GlneodbQduUdX9yLRF2hcA 提取碼: mqf6redis
Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。有了 Docker,就不用擔憂環境問題。整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。算法
通俗解釋Dockersql
Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。docker就是相似的理念。如今都流行雲計算了,雲計算就比如大貨輪。docker就是集裝箱。docker
Docker 的主要用途,目前有三大類。shell
(1)提供一次性的環境。本地測試的軟件、持續集成的時候提供單元測試和構建的環境。數據庫
(2)提供彈性的雲服務。由於 Docker 容器能夠隨開隨關,很適合動態擴容和縮容。
(3)組建微服務架構。一臺機器能夠跑多個服務,在本機能夠模擬出微服務架構。
應用場景
Docker 能幹什麼?
簡化配置:這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各類配置不同的平臺(軟件、系統),Docker在下降額外開銷的狀況下提供了一樣的功能。它能讓你將運行環境和配置放在代碼中而後部署,同一個Docker的配置能夠在不一樣的環境中使用,這樣就下降了硬件要求和應用環境之間耦合度。
代碼流水線管理:前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,須要通過不少的中間環境。而每個中間環境都有本身微小的差異,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單很多。
提升開發效率:這就帶來了一些額外的好處:Docker能提高開發者的開發效率。若是你想看一個詳細一點的例子,能夠參考Aater在DevOpsDays Austin 2014大會或者是DockerCon上的演講。 不一樣的開發環境中,咱們都想把兩件事作好。一是咱們想讓開發環境儘可能貼近生產環境,二是咱們想快速搭建開發環境。
理想狀態中,要達到第一個目標,咱們須要將每個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,咱們卻不想每次都須要網絡鏈接,每次從新編譯的時候遠程鏈接上去特別麻煩。這就是Docker作的特別好的地方,開發環境的機器一般內存比較小,以前使用虛擬的時候,咱們常常須要爲開發環境的機器加內存,而如今Docker能夠輕易的讓幾十個服務在Docker中跑起來。
隔離應用: 有不少種緣由會讓你選擇在一個機器上運行不一樣的應用,好比以前提到的提升開發效率的場景等。咱們常常須要考慮兩點,一是由於要下降成本而進行服務器整合,二是將一個總體式的應用拆分紅松耦合的單個服務(譯者注:微服務架構)。若是你想了解爲何鬆耦合的應用這麼重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜作了比較。
整合服務器:正如經過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker能夠整合多個服務器以下降成本。因爲沒有多個操做系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker能夠比虛擬機提供更好的服務器整合解決方案。
調試能力:Docker提供了不少的工具,這些工具不必定只是針對容器,可是卻適用於容器。它們提供了不少的功能,包括能夠爲容器設置檢查點、設置版本和查看兩個容器之間的差異,這些特性能夠幫助調試Bug。你能夠在《Docker拯救世界》的文章中找到這一點的例證。
多租戶: 另一個Docker有意思的使用場景是在多租戶的應用中,它能夠避免關鍵應用的重寫。咱們一個特別的關於這個場景的例子是爲IoT(譯者注:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼很是複雜,很難處理,從新規劃這樣一個應用不但消耗時間,也浪費金錢。使用Docker,能夠爲每個租戶的應用層的多個實例建立隔離的環境,這不只簡單並且成本低廉,固然這一切得益於Docker環境的啓動速度和其高效的diff
命令。
快速部署: 在虛擬機以前,引入新的硬件資源須要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker經過爲進程僅僅建立一個容器而無需啓動一個操做系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。你能夠在數據中心建立銷燬資源而無需擔憂從新啓動帶來的開銷。一般數據中心的資源利用率只有30%,經過使用Docker並進行有效的資源分配能夠提升資源的利用率。
Docker在整個開發週期均可以完美的輔助你實現快速交付。Docker容許開發者在裝有應用和服務本地容器作開發。能夠直接集成到可持續開發流程中。例如:開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
第一步:啓動虛擬環境
Win10 系統下安裝Docker,首先WIN+X,點擊應用和功能;以後點擊右側的「程序和功能」,接着點擊左側欄「啓用或關閉Windows功能」,並作如下Hyper-V(hyper-v能夠理解爲虛擬機平臺)的配置:
第二步:安裝Toolbox
最新版 Toolbox下載地址 連接: https://pan.baidu.com/s/1Nx3gVdbRrO32elJcRBfiOA 提取碼: dsd4 。下載完成後,雙擊下載的 Docker for Windows Installer 安裝文件,一路 Next,點擊 Finish 完成安裝。docker toolbox是一個工具集,它主要包含如下一些內容:
安裝完成後,Docker 會自動啓動。通知欄上會出現個小鯨魚的圖標,這表示 Docker 正在運行。桌邊也會出現三個圖標,咱們能夠在命令行執行 docker version 來查看版本號,docker run hello-world 來載入測試鏡像測試。
點擊WIN+R,輸入CMD打開命令行窗口,輸入命令docker version結果以下:
運行docker run hello-world 來載入測試鏡像測試,效果以下:
第三步:鏡像加速
鑑於國內網絡問題,後續拉取 Docker 鏡像十分緩慢,咱們能夠須要配置加速器來解決,我使用的是網易的鏡像地址:http://hub-mirror.c.163.com。新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。請在該配置文件中加入(沒有該文件的話,請先建一個):
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
也能夠經過點擊小鯨魚右鍵settings來設置:
第一步:建立MySQL鏡像:docker pull mysql
查找Docker Hub上的mysql鏡像: docker search mysql
第二步:下載鏡像: docker pull mysql:5.6
第三步:查看鏡像。列表裏查到REPOSITORY爲mysql,標籤爲5.6的鏡像。docker images mysql
第四步:使用最新的MySQL鏡像。
# docker 中下載 mysql docker pull mysql #啓動,設置初始密碼 docker run --name bnc-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql #進入容器 docker exec -it bnc-mysql bash #登陸mysql mysql -u root -p ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; #添加遠程登陸用戶 CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';
第五步:遠程鏈接MySQL數據庫。
第六步:新受權用戶鏈接測試。
場景描述:咱們使用一個簡單的python項目,本項目是中文分詞的算法。如何實現Docker安裝部署。
第一步: Win10下建立目錄文本
選擇在D盤下建立docker目錄,分別新建三個文件:Dockerfile,app.py,equirements.txt
Dockerfile(沒有後綴):一個文本文件,包含了一條條的指令(Instruction),每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。建立鏡像必須文件。
# 基於鏡像基礎 FROM python:3.7 # 設置代碼文件夾工做目錄 /app WORKDIR /app # 複製當前代碼文件到容器中 /app ADD . /app # 安裝所需的包 RUN pip install -r requirements.txt # Run app.py when the container launches CMD ["python", "app.py"]
app.py:python項目的源代碼,這裏測試的單個python文件,若是是一個完整項目,能夠將整個文件夾拷貝到這裏。
# coding:utf8 """ DESC: Python數據預處理之第一個分詞程序範例 Author:伏草唯存 Prompt: code in Python3 env """ import jieba str = "道路千萬條,安全第一條;行車不規範,親人兩行淚。" print("原句: \n" + str) seg_list = jieba.cut(str) print("分詞: \n" + " / ".join(seg_list))
第二步:生成鏡像。本文采用的windows環境。docker build -t friendlyhello .命令中最後的點不要忘記,這裏表示當前目錄
第三步:查看鏡像是否生成
第四步:運行鏡像程序,這裏能夠看到分詞效果
第一步:載入鏡像。通常採用自構建的方法,本文采用直接pull下載完成。docker pull training/webapp
第二步:運行鏡像。docker run -d -P training/webapp python app.py # 多個PORTS端口
第三步:瀏覽器輸入本地ip:端口號,訪問網頁信息
擴展:使用 Docker 和 Elasticsearch 構建一個全文搜索應用程序https://www.zcfy.cc/article/building-a-full-text-search-app-using-docker-and-elasticsearch
【機器學習和天然語言QQ羣:436303759】:
機器學習和天然語言(QQ羣號:436303759)是一個研究深度學習、機器學習、天然語言處理、數據挖掘、圖像處理、目標檢測、數據科學等AI相關領域的技術羣。其宗旨是純粹的AI技術圈子、綠色的交流環境。本羣禁止有違背法律法規和道德的言行舉止。羣成員備註格式:城市-自命名。微信訂閱號:datathinks