1. 程式人生 > >Docker教程:docker的概念及安裝

Docker教程:docker的概念及安裝

Why docker

對於運維來說,Docker提供了一種可移植的標準化部署過程,使得規模化、自動化、異構化的部署成為可能甚至是輕鬆簡單的事情;而對於開發者來說,Docker提供了一種開發環境的管理方法,包括映像、構建、共享等功能。

程式設計師在搭建開發環境時遇到的一些問題

  • 軟體安裝麻煩,比如很多公司都使用redhat,一般開發人員又不給root,安裝一個nginx或者是mysql都得自己下載編譯安裝 許可權問題,沒有root,一些軟體無法執行,例如dnsmasq;
  • 沒有root,無法修改hosts,無法netstat -nptl,無法tcpdump,無法iptable
  • 隔離性差,例如不同的開發人員如果在同一臺主機環境下共享開發,雖然是使用者隔離,但埠如果不規範可能會衝突;同一個Mysql如果許可權管理不好很有可能誤刪別人的資料
  • 可移植性差,例如和生產環境不一致,開發人員之間也無法共享;更嚴重的情況是當有新人入職時,通常需要又折騰一遍開發環境,無法快速搭建
這些問題可以通過在本地搭建虛擬機器來解決,但虛擬機器是一個很笨重的解決方案,Docker是一個非常輕量級的方案,而且還擁有虛擬機器沒有的一些功能,例如標準化Image,Image共享等,更重要的是,利用Docker,你可以執行非常多的容器,在你的Mac下搭建一個分散式的開發環境根本不是什麼大的問題,而且對記憶體、磁碟和cpu的消耗相比傳統的虛擬機器要低許多,這些都要歸功於AUFS和LXC這兩大神奇的技術。

使用virtualenv配置python開發環境的問題

經常忘記啟用它,或者在切換工程時忘記切換它,這會遇到含糊的出錯資訊,另人倍感困惑。
它無法提供“純粹的”隔離,只能是Python級別的隔離(系統庫和非python的依賴項仍然會出問題)。
我通常不想在正式產品中執行它,這就意味著在開發環境和正式產品的不一致。
它讓人感覺有點“黑客”作法:它是依靠修改指令碼和設定新路徑實現的。

為什麼要在開發中使用Docker

1)一致的開發環境 
使用Docker,可以保證整個研發團隊使用一致的開發環境。 
2)開發環境與最終的生產環境保持一致 
這減少了部署出錯的可能性。 
3)簡化了編譯和構建的複雜性 
對於一些動輒數小時的編譯和構建工作,可以用Docker來簡化。 
4)在開發時只需Docker 
無需在自己的開發主機上搭建各種程式語言環境。 
5)可以使用同一程式語言的多個版本 
可以使用同一程式語言(如python, python, ruby, ruby, java, node)等的多個版本,無需解決多版本衝突的問題。 
6)部署很簡單 
應用程式在容器中執行,和在生產環境中部署執行是一樣的。只需打包你的程式碼並部署到帶有同樣映象的伺服器上,或者是把程式碼連同原映象建立一個新Docker映象再直接執行新映象。 

7)使用自己喜歡的開發IDE 
仍然可以繼續使用自己喜歡的開發IDE,無需執行VirtualBox虛擬機器或SSH。

其它:

Docker將業務打包成容器後,可以根據需求彈性擴充套件,快速擴充套件,輕鬆做到負載均衡。業務打包成容器後作為單獨的節點,利於運維,哪裡壞了修哪裡。開發中可以將Docker當做一個執行環境。也就是說,開發中程式碼通過掛載的形式放入到容器中。在容器外開發的程式碼放容器裡跑。所有的業務可以根據功能拆分成一個個服務放到容器中,便於擴充套件。

ELK、Graphite、Grafana已經是很成熟的運維管理了,但是結合了Docker讓整個運維更加的便利。開源ELK+Graphite/Grafana和Docker可以有效的結合起來高效運維。
用Docker可以儲存容器,儲存時間點,中小規模實現容災,這個需要更多的實踐(從攜程事件中的腦洞大開)。

[雲端計算的樂高積木Docker如何重構應用程式開發]

常見使用場景

Automating the packaging and deployment of applications
Creation of lightweight, private PAAS environments
Automated testing and continuous integration/deployment

Deploying and scaling web apps, databases and backend services

why not?


Docker基本概念

2013年,dotCloud這家PaaS服務公司開源釋出了一套將Container標準化的平臺Docker,大受歡迎,所以,dotCloud決定以Docker為名成立新公司力推。 Docker是一個新的容器化的技術,它輕巧,且易移植,號稱“build once, configure once and run anywhere"。docker是Go寫的。

docker的英文字意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱裡面裝的可不是商品貨物,而是任意型別的App,Docker把App(叫Payload)裝在Container內,通過Linux Container技術的包裝將App變成一種標準化的、可移植的、自管理的元件,這種元件可以在你的latop上開發、除錯、執行,最終非常方便和一致地執行在production環境下。

Docker 提供了一個可以執行你的應用程式的封套(envelope),或者說容器。它原本是 dotCloud 啟動的一個業餘專案,並在前些時候開源了。它吸引了大量的關注和討論,導致 dotCloud 把它重新命名到 Docker Inc。它最初是用 Go 語言編寫的,它就相當於是加在 LXC(LinuX Containers,linux 容器)上的管道,允許開發者在更高層次的概念上工作。 Docker 擴充套件了 Linux 容器(Linux Containers),或著說 LXC,通過一個高層次的 API 為程序單獨提供了一個輕量級的虛擬環境。Docker 利用了 LXC, cgroups 和 Linux 自己的核心。和傳統的虛擬機器不同的是,一個 Docker 容器並不包含一個單獨的作業系統,而是基於已有的基礎設施中作業系統提供的功能來執行的。這裡有一個 Stackoverflow 的答案,裡面非常詳細清晰地描述了所有 Docker 不同於純粹的 LXC 的功能特性 Docker 會像一個可移植的容器引擎那樣工作。它把應用程式及所有程式的依賴環境打包到一個虛擬容器中,這個虛擬容器可以執行在任何一種 Linux 伺服器上。這大大地提高了程式執行的靈活性和可移植性,無論需不需要許可、是在公共雲還是私密雲、是不是裸機環境等等。

Docker採用了aufs檔案系統來設計一個可以層層堆疊的Container映象檔案,將Container內的所有程式(包括應用程式、相關函式庫、配置檔案),都打包進Docker映象檔,並且提供了一個Dockerfile配置檔案來記錄建立Container過程的每一個步驟包括引數。只要在任何支援Docker平臺的環境中,就可以從這個映象檔來建立出一個一模一樣的Container來執行同一個應用程式。如此一來,應用程式等於是可以透過Docker映象檔,或甚至只需要Dockerfile,就能將程式執行環境帶著走,移動到任何支援Docker的環境中。Docker公司也釋出API,可以用來控制所有的Container相關指令,任何人只要使用同一套Docker,就等於有了同一套管理和建立Container的方法,也就等同於將Container運用標準化了。

對Docker的認識

可以認為docker是一個類似虛擬機器(VM)的東西,你可以把你要釋出的應用打包成一個docker image,然後部署到實際的機器上。這種機器可以是實際的伺服器,也可以是VPS或其它PaaS之類的。

然後,在一個機器環境裡,你還可以同時跑幾個docker container。

image和container的關係可以理解為“類”和“例項”的關係。而且在一個機器環境裡跑的container還可以是基於不同的image。你可以隨時把一個container打包成一個image作再次的部署。

        其次,你在一個container裡作的修改也可以更新到基於同一image的其它container裡。因為可以只更新修改過的部分,類似於版本控制下的更新。[Docker教程:docker遠端repository和自建本地registry]

        最後,它與VM的不同之處就在於一個字:輕。一個VM實際上包含了一套虛擬的硬體,一個完整的OS,再加入應用程式。而docker container只是一個隔離的應用程式執行環境,對於應用程式來說,docker環境相當於一個完整的OS,但是實際上它是跑在宿主OS上的,一個container只包含這個應用環境與宿主機環境的差異部分,非常的輕量。更貼切的類比應該是:類似於python的virtualenv。只不過這是一個OS層面的virtualenv。

Docker的核心底層技術

Docker的核心底層技術是LXC(Linux Container),Docker在其上面加了薄薄的一層,添加了許多有用的功能。這篇stackoverflow上的問題和答案很好地詮釋了Docker和LXC的區別,能夠讓你更好的瞭解什麼是Docker, 簡單翻譯下就是以下幾點:

  • Docker提供了一種可移植的配置標準化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植執行;
  • Docker以App為中心,為應用的部署做了很多優化,而LXC的幫助指令碼主要是聚焦於如何機器啟動地更快和耗更少的記憶體;
  • Docker為App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;
  • Docker提供了一種類似git的Container版本化的機制,允許你對你建立過的容器進行版本管理,依靠這種機制,你還可以下載別人建立的Container,甚至像git那樣進行合併;
  • Docker Container是可重用的,依賴於版本化機制,你很容易重用別人的Container(叫Image),作為基礎版本進行擴充套件;
  • Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以建立自己的Docker使用者並上傳和下載Docker Image;
  • Docker提供了很多的工具鏈,形成了一個生態系統;這些工具的目標是自動化、個性化和整合化,包括對PAAS平臺的支援等;

Docker 特徵

Docker的特性主要包括以下幾點:
  • 速度飛快以及優雅的隔離框架
  • 物美價廉
  • CPU/記憶體的低消耗
  • 快速開/關機
  • 跨雲端計算基礎構架

Docker 元件與元素

Docker三個元件:

  • Docker Client 是使用者介面,它支援使用者與Docker Daemon之間通訊。
  • Docker Daemon運行於主機上,處理服務請求。
  • Docker Index是中央registry,支援擁有公有與私有訪問許可權的Docker容器映象的備份。
Note: Docker系統有兩個程式:docker服務端和docker客戶端。其中docker服務端是一個服務程序,管理著所有的容器。docker客戶端則扮演著docker服務端的遠端控制器,可以用來控制docker的服務端程序。大部分情況下,docker服務端和客戶端執行在一臺機器上。 [視訊]

Docker採用C/S架構開發,整體架構如圖所示: 
Docker架構

包括:1)Docker客戶端:即Docker的可執行程式,它可以通過命令列和API的形式與Docker的守護程序進行通訊。

2)Docker守護程序:Docker守護程序提供Docker服務。

三個基本要素:

  • Docker Containers負責應用程式的執行,包括作業系統、使用者新增的檔案以及元資料。
  • Docker Images是一個只讀模板,用來執行Docker容器。
  • DockerFile是檔案指令集,用來說明如何自動建立Docker映象。

Note

Docker映象:Docker中的映象就是一堆檔案的集合,並不是像VM那樣的是一個作業系統。映象可以簡單到只有一個程式檔案。如果你寫一個helloworld 靜態編譯後放到一個空的Image中(可以用FROM scratch作為基礎映象),那麼整個image的大小,就是你編譯後的二進位制檔案的大小。 如果你不是靜態編譯的話,就要把相應的連結庫放到映象中相應的位置,才能使得程式正確執行,否則會提示找不到檔案。官方提供的ubuntu等基礎映象,就是把依賴的檔案放到正確的地方,從而使得絕大部分程式可以正常執行。和VM的映象是完全不同的概念。

一個Container的映象檔內可以安裝多支程式,例如同時安裝Ubuntu、Apache、MySQL、Node.js、Ruby等。不過,Docker官方建議,一隻程式安裝在一個Container內,再把這些Container迭起來提供一個完整的服務。
Docker稱這是一種Microservices(微服務)的新軟體架構,將組成一個應用系統的每一個Stack,拆解成許多小型服務,例如Apache服務、MySQL服務、Node.js服務、Ruby服務,每一個服務都是包在Container裡的一隻程式,例如MySQL服務就是部署在Container內的MySQL。這麼做的好處是可以建立一個鬆散耦合的彈性應用程式架構,也能輕易地抽換其中一個Container,例如要升級MySQL,只需要過載新版MySQL的Container映象檔案,就可以完成資料庫升級,不用將整套應用系統停機。

Container和Image 在Docker的世界裡,Image是指一個只讀的層(Layer),這裡的層是AUFS裡的概念,最直觀的方式就是看一下docker官方給出的圖:

docker-filesystems-multilayer

Docker使用了一種叫AUFS的檔案系統,這種檔案系統可以讓你一層一層地疊加修改你的檔案,最底下的檔案系統是隻讀的,如果需要修改檔案,AUFS會增加一個可寫的層(Layer),這樣有很多好處,例如不同的Container可以共享底層的只讀檔案系統(同一個Kernel),使得你可以跑N多個Container而不至於你的硬碟被擠爆了!這個只讀的層就是Image!而如你所看到的,一個可寫的層就是Container。

那Image和Container的區別是什麼?很簡單,他們的區別僅僅是一個是隻讀的層,一個是可寫的層,你可以使用docker commit 命令,將你的Container變成一個Image,也就是提交你所執行的Container的修改內容,變成一個新的只讀的Image,這非常類似於git commit命令。[利用Docker構建開發環境][Docker的映象和容器的區別]

image-1.png 在討論Docker元件和基本要素如何互動之前,讓我們來談談Docker的支柱。 Docker使用以下作業系統的功能來提高容器技術效率:
  • Namespaces 充當隔離的第一級。確保一個容器中執行一個程序而且不能看到或影響容器外的其它程序。
  • Control Groups是LXC的重要組成部分,具有資源核算與限制的關鍵功能。
  • UnionFS(檔案系統)作為容器的構建塊。為了支援Docker的輕量級以及速度快的特性,它建立了使用者層。

執行應用程式:把它們放在一起

執行任何應用程式,都需要有兩個基本步驟:
  1. 構建一個映象。
  2. 執行容器。
這些步驟都是從Docker Client的命令開始的。Docker Client使用的是Docker二進位制檔案。在基礎層面上,Docker Client會告訴Docker Daemon需要建立的映象以及需要在容器內執行的命令。當Daemon接收到建立映象的訊號後,會進行如下操作:

第1步:構建映象

Docker Image是一個構建容器的只讀模板,它包含了容器啟動所需的所有資訊,包括執行程式和配置資料。
每個映象都源於一個基本的映象,然後根據Dockerfile中的指令建立模板。對於每個指令,在映象上建立一個新的層面。
一旦映象建立完成,就可以將它們推送到中央registry: Docker Index,以供他人使用。然而,Docker Index為映象提供了兩個級別的訪問許可權:公有訪問和私有訪問。你可以將映象儲存在私有倉庫,Docker官網有私有倉庫的套餐可以供你選擇。總之,公有倉庫是可搜尋和可重複使用的,而私有倉庫只能給那些擁有訪問許可權的成員使用。 Docker Client可用於Docker Index內的映象搜尋。

第2步:執行容器

執行容器源於我們在第一步中建立的映象。當容器被啟動後,一個讀寫層會被新增到映象的頂層。當分配到合適的網路和IP地址後,需要的應用程式就可以在容器中運行了。

Docker的安裝

linux下的安裝

Ubuntu 14.04 x64安裝Docker,需要確保Ubuntu的版本是64位,而且核心版本(uname -r )需大於3.10版(如Ubuntu 12.04的軟體倉庫中沒有Docker軟體)。
[email protected]:/home/pi# apt-get update [email protected]:/home/pi# apt-get install docker.io  #Ubuntu的軟體倉庫裡,Docker叫docker.io,原因是已經有別的軟體先佔據了Docker這個名字 [email protected]:/home/pi# service docker status        #校驗Docker服務的狀態,確保Docker服務是啟動的
docker start/running, process 7155
# docker info    Note: docker需要root許可權
安裝docker時,預設的安裝位置是/var/lib/docker
$sudo ls /var/lib/docker/
aufs  containers  graph  init  linkgraph.db  repositories-aufstmp  trust  volumes
[Docker映象儲存位置、目錄分析及目錄遷移]

Docker解除安裝和重灌

sudo apt-get remove docker
sudo apt-get remove --auto-remove docker
sudo apt-get autoremove --purge
{可能是這麼解除安裝,lz不是很確定,解除安裝時有點亂}
再同上一樣安裝,要重啟,就ok了
[如何解除安裝重灌docker? ]

window下的安裝

基本上一路確定就ok了,但是如果已經安裝了git的,可以去掉git安裝的選擇。
Note: 安裝需要cpu支援並開啟虛擬化;且系統是64位的?

啟用dockerRT

每次使用docker時都要啟用dockerRT?

安裝完成後,命令列中進入docker toolbox安裝目錄下cd /d/Docker\ Toolbox/,輸入sh start.sh

結果如下:

不啟用時會出現


檢查Docker的安裝是否正確

docker info

出現以下內容就說明安裝正確


其它系統安裝參考

相關推薦

Docker教程docker概念安裝

Why docker 對於運維來說,Docker提供了一種可移植的標準化部署過程,使得規模化、自動化、異構化的部署成為可能甚至是輕鬆簡單的事情;而對於開發者來說,Docker提供了一種開發環境的管理方法,包括映像、構建、共享等功能。 程式設計師在搭建開發環境時遇到的一些

Docker教程Docker映象匯出遷移

repositories-aufs:記錄了映象名稱以及對應的Id的json檔案graph:儲存的是下載映象的元資料,包括json和layersize,其中json檔案記錄了相應的image id、依賴關係、建立時間和配置資訊等。layersize為對應層的大小。進入graph檔案會發現下面包含著多個資料夾,進

Docker教程docker遠端repository和自建本地registry

Docker有一個類似版本管理倉庫(Repositry)的東西,有docker.io提供的官方倉庫(index.docker.io,相當於github),也可以自建(叫docker-registry,相當於自己搭建一個小型github)。 比較 Docker 和 Git

Docker容器(一)-- 基本概念安裝

1.docker簡介 1.1 雲端計算簡介 什麼是雲端計算:        雲端計算是一種資源的服務模式,該模式可以實現隨時隨地、便捷按需地從可配置計算資源共享池中獲取所需的資源(如網路、伺服器、儲存、應用及服務),資源能夠快速供應並釋放,大大減少了資源管理工作

Docker(一)Docker入門教程

所在 公有 物理 自己的 定性 屬於 apach 占用 重啟 如今Docker的使用已經非常普遍,特別在一線互聯網公司。使用Docker技術可以幫助企業快速水平擴展服務,從而到達彈性部署業務的能力。在雲服務概念興起之後,Docker的使用場景和範圍進一步發展,如今在微服務架

Dockerdocker安裝ELK(logstash,elasticsearch,kibana)

一:安裝logstash 1.拉取映象 docker pull logstash:5.6.11 2.建立目錄 mkdir /docker/logstash cd /docker/logstash 3.建立配置檔案 touch logstash.config 檔案內容: i

Docker教程映象構建和自動映象構建dockerfile

Docker透過Dockerfile來記錄建立Container映象檔案的每一個步驟,可以將建立應用程式執行環境的過程和配置引數,完整地記錄下來。開發人員和維運人員之間可以利用Dockerfile來溝通對執行環境的討論。甚至結合版本控制服務如GitHub,可以讓Docke

Docker實戰Docker安裝部署RabbitMQ

使用Docker安裝部署RabbitMQ 1、docker search rabbitmq:management 2、docker pull rabbitmq:management 注意:如果docker pull rabbitmq 後面不帶management

Docker教程使用docker配置python開發環境

Docker的安裝和配置 皮皮blog Docker開發環境配置 Docker下配置python開發環境 使用dockerfile和pip安裝python拓展包 lz使用atp-get install和pip install共同完成python拓展包的安裝,原因

Docker(3)Dockerfile介紹簡單示例

maintain cmd 方法 source mon onf 本地 bubuko author Dockerfile 概念   Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。它們簡化了從頭到尾的流程並極大的簡化了部署工作。

Docker教程Docker 安裝 Redis)

Docker 安裝 Redis方法一、通過 Dockerfile 構建建立Dockerfile首先,建立目錄redis,用於存放後面的相關東西。[email protected]:~$ mkdir -p ~/redis ~/redis/datadata目錄將對映為r

Python簡明教程基本概念

python1 字面意義上的常量,如2、‘This is ok‘這樣的字符串>>> print(‘a,2,3‘)a,2,32 字符串單引號(‘)使用單引號指示字符串,類似shell中的強引用,所有的空格、制表符照原樣保留。>>> print(‘This is ok‘)Thi

Mycat的使用 - 01.概念, 安裝

Mycat初識Mycat1. Mycat是什麽Mycat是一款數據庫中間件, 其用於分庫分表, 還實現了讀寫分離, 故障切換等功能.2. Mycat的工作原理用一個動詞來概括就是"攔截", 它攔截了用戶發送的SQL語句, 首先對其做了一些特定的分析: 如分片分析, 路由分析, 讀寫分離分析

iBrand 教程Git 軟件安裝過程截圖

target windows mes ccf .com 軟件下載 安裝 comm 單選 下載 教程中使用的相關軟件下載網盤: https://pan.baidu.com/s/1bqVD5MJ 密碼:4lku 安裝 請右鍵 以管理員身份運行 進行軟件安裝,安裝過程如下:

Docker(六)Docker 三劍客之 Docker Swarm

lib ini 節點數 box 流量 虛擬 .html 刪除 解釋 實踐中會發現,生產環境中使用單個 Docker 節點是遠遠不夠的,搭建 Docker 集群勢在必行。然而,面對 Kubernetes, Mesos 以及 Swarm 等眾多容器集群系統,我們該如何選擇呢?它

python selenium系列(一)框架介紹安裝

row pre ive AS baidu mar 在操作 pan 但是 一 selenium是什麽?引用百度百科的介紹selenium的一段話:“Selenium 是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的

Docker 教程】- Docker 架構

倉庫 對象 通過命令 架構 進程 架構模式 docker api 命令 1、Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。 2、Docker 容器通過 Docker 鏡像來創建。 3、容器與鏡像的關系類似於面向對象編

資料實時監控平臺(二)Telegraf簡介安裝

接著上一篇部落格:InfluxDB簡介及安裝,這篇部落格介紹下Linux環境下Telegraf安裝以及其功能特點。。。 官網地址:influxdata 官方文件:telegraf文件   環境:CentOS7.4 64位 Telegraf版本:0.11.1-1   一、Tel

數據實時監控平臺(二)Telegraf簡介安裝

完成 成功 show user 官方文檔 targe 相關 erp tps 設計 接著上一篇博客:InfluxDB簡介及安裝,這篇博客介紹下Linux環境下Telegraf安裝以及其功能特點。。。 官網地址:influxdata 官方文檔:telegraf文檔 環境:C

Python 基礎全套教程 01環境的安裝和使用

Python環境搭建 Python可應用於多平臺包括Windows、 Linux/Unix 和 Mac OS。 Python下載 Python最新原始碼,二進位制文件,新聞資訊等可以在Python的官網檢視到: Python官網:http://www.py