參考資料
http://baijiahao.baidu.com/s?id=1585063200948693359&wfr=spider&for=pc
http://www.javashuo.com/article/p-qrccuenz-be.html
http://www.javashuo.com/article/p-mlwpdzsw-w.htmlhtml
官網 www.docker.com
github https://github.com/docker/docker.github.io
開源的容器引擎,可讓開發者打包應用以及依賴的庫,而後發佈到任何流行的linux發行版上,移植很方便。由go語言編寫,基於apache2.0協議發佈,基於linux kernel,要想在win下運行須要藉助一個vm(虛擬機)來實現 。自2013年開始,近些年發展迅猛。docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考http://blog.csdn.net/chenhaifeng2016/article/details/68062414linux
傳統的虛擬機技術是虛擬出一套硬件,在虛擬的硬件上運行一個操做系統,虛擬機中的應用在 Guest OS 中運行。而 docker 容器內的應用直接在宿主機上運行,容器沒有虛擬出硬件也沒有本身的內核,是一種輕量級的虛擬化技術。從下圖的對比中能夠看出,Docker 的 Docker Engine 層替代了虛擬機中的 Hypervisor 層和 Guest OS 層。
虛擬化的核心是對資源進行抽象,目標每每是爲了在同一個機器上運行多個系統或應用,從而提升系統資源的利用率。虛擬化分爲不少類型,好比常見的硬件輔助虛擬化(VMware workstation、 KVM等)。Docker所表明的容器虛擬化技術屬於操做系統級虛擬化:內核經過建立多個虛擬的操做系統實例(內核和庫)來隔離不一樣的進程。
傳統虛擬化和容器技術結構比較:傳統虛擬化技術是在硬件層面實現虛擬化,增長了系統調用鏈路的環節,有性能損耗;容器虛擬化技術以共享Kernel的方式實現,幾乎沒有性能損耗。
能夠這樣理解,咱們不考慮最終的應用軟件的話,傳統的虛擬話須要四層結構,而docker 只須要三層。
傳統的虛擬化,
最底層 :硬件物理機
第二層: 宿主機操做系統。好比windos
第三層:hypervisor 指的是硬件資源的虛擬化。 能夠是kvm vmvare
第四層:就是虛擬機操做系統, 好比centos
docker
最低層 : 硬件物理機
第二層: 宿主機操做系統
第三層:docker engine
docker 的優點
啓動很是快,秒級實現
資源利用率高,一臺高配置服務器能夠跑上千個docker容器
更快的交付和部署,一次建立和配置後,能夠在任意地方運行Build once,Runanywhere
內核級別的虛擬化,不須要額外的hypevisor支持,會有更高的性能和效率
易遷移,平臺依賴性不強
git
1 鏡像
鏡像,是一個只讀的模板,相似於安裝系統用到的那個iso文件,咱們經過鏡像來完成各類應用的部署。一個鏡像能夠只包含一個操做系統環境(好比SUSE鏡像),也能夠安裝了用戶程序及其運行環境(好比eBackup鏡像)。鏡像其實就是一個文件,任何用戶程序均可以成爲鏡像的一部分。
鏡像=操做系統+軟件運行環境+用戶程序
2 容器:
容器是從鏡像建立的運行實例,能夠被啓動、開始、中止、刪除等操做,每一個容器都是相互隔離的。若是鏡像能夠比做類的話,容器就是鏡像實例化後的對象。容器是咱們直接用來操做的,他是具體的,動態的。而鏡像是抽象的,靜態的。
3 倉庫
存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)github
1 docker 安裝curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
yum install -y docker-ce
速度比較慢,你們也能夠直接下載rpm包https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下載完,上傳到linux下
也須要用yum安裝,能夠自動解決依賴關係web
yum install -y docker-ce-xxxx.rpm systemctl start docker 啓動docker
2 docker 鏡像管理docker pull centos
//下載centos鏡像docker images
查看本地的鏡像docker search xxx
//搜索鏡像,其中xxx是關鍵詞docker tag centos lv
//給鏡像打標籤docker run -itd centos
//把鏡像啓動爲容器,-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面docker ps
//查看運行的容器,加上-a選項後能夠查看全部容器,包括未運行的docker rmi centos
//用來刪除指定鏡像, 其中後面的參數能夠是tag,若是是tag時,其實是刪除該tag。當後面的參數爲鏡像ID時,則會完全刪除整個鏡像,全部標籤也會一同刪除
3 docker經過容器建立鏡像
docker run啓動容器後,能夠經過下面命令進入容器docker exec -it xxxxx bash
//其中xxxxx爲容器id,這個id能夠用docker ps查看,最後面的bash爲進入容器後咱們要執行的命令,這樣就能夠打開一個終端
進入到該容器中,咱們作一些變動,好比安裝一些東西,而後針對這個容器進行建立新的鏡像
在容器中執行 yum install -y net-tools,而後ctrl d退出容器docker commit -m "change somth" -a "somebody info" container_id new_image_name //container_id經過docker ps -a獲取,後面的new_image_name爲新鏡像名字
例如: docker commit -m "install net-tools" -a "lv" 2c74d574293f centos_with_nettool 這個命令有點像svn的提交,-m 加一些改動信息,-a 指定做者相關信息 2c74d這一串爲容器id,再後面爲新鏡像的名字
4 docker使用模板建立鏡像
首先去下載一個模板
http://openvz.org/Download/templates/precreated //下載一個centos6的模板centos-6-x86-minimal.tar.gz
wget https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
地址會有變動,請到官網主頁找相應連接。
導入該鏡像的命令爲:cat centos-6-x86-minimal.tar.gz|docker import - centos6
docker images
查看導入的鏡像
把現有鏡像,導出爲一個文件:docker save -o centos6.tar centos6
// -o 後面跟文件名和鏡像名
咱們還能夠用該文件恢復本地鏡像:docker load --input centos6.tar
或者docker load < centos6.tar
docker push image_name
//能夠把本身的鏡像傳到dockerhub官方網站上去,前提是須要先註冊一個用戶
5 docker容器管理docker create -it centos6 bash
//這樣能夠建立一個容器,但該容器並無啓動docker start container_id
//啓動容器後,可使用 docker ps 查看到,有start 就有stop,和restart
以前咱們使用的docker run 至關於先create再startdocker run -it centos bash
這樣進入了一個虛擬終端裏面,咱們能夠運行一些命令,使用命令exit或者ctrl d 退出該bash,當退出後這個容器也會中止。
docker run -d 可讓容器在後臺運行
好比:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
docker run --name web -itd centos bash
// --name 給容器自定義名字docker run --rm -it centos bash -c "sleep 30"
//--rm 可讓容器退出後直接刪除,在這裏命令執行完容器就會退出docker logs
能夠獲取到容器的運行歷史信息,用法以下docker logs container_id
docker attach
能夠進入一個後臺運行的容器,好比docker attach container_id
//可是attach命令不算好用,好比咱們想要退出終端,就得exit了,這樣容器也就退出了,還有一種方法docker exec -it container_id bash
//能夠臨時打開一個虛擬終端,而且exit後,容器依然運行着docker rm container_id
//container_id是ps的時候查看到的,這樣就能夠把container刪除,若是是運行的容器,能夠加-fdocker export container_id > file.tar
// 導出容器,能夠遷移到其餘機器上,須要導入cat file.tar |docker import - test
//這樣會生成test的鏡像
批量關閉和刪除容器docker
docker ps -a | awk '{print $1}'|xargs docker stop docker ps -a | awk '{print $1}'|xargs docker rm
6 docker倉庫管理docker pull registry
//下載registry 鏡像,registy爲docker官方提供的一個鏡像,咱們能夠用它來建立本地的docker私有倉庫。docker run -d -p 5000:5000 registry
//以registry鏡像啓動容器,-p會把容器的端口映射到宿主機上,:左邊爲宿主機監聽端口,:右邊爲容器監聽端口curl 127.0.0.1:5000/v2/_catalog
//能夠訪問它
下面咱們來把其中一個鏡像上傳到私有倉庫docker tag centos 192.168.56.132:5000/centos6
//標記一下tag,必需要帶有私有倉庫的ip:port
其中centos 爲鏡像名docker push 192.168.56.132:5000/centos6
//把標記的鏡像給推送到私有倉庫
此時並不會成功,出現以下提示
Get https://192.168.56.132:5000/v2/: http: server gave HTTP response to HTTPS client
更改配置文件,vi /etc/docker/daemon.json
//更改成{ "insecure-registries":["192.168.56.132:5000"] }
備註:更改了倉庫的http訪問路徑。默認是公有倉庫。systemctl restart docker
docker ps -a
//查看容器已經關閉,還須要啓動docker start id
//這裏的id爲registry容器id
再次push docker push 192.168.56.132:5000/centos6
curl 127.0.0.1:5000/v2/_catalog
//能夠查看到推送上來的鏡像
7 docker export save的區別
導出(Export)
Export命令用於持久化容器(不是鏡像)。因此,咱們就須要經過如下方法獲得容器ID:
sudo docker ps -a
接着執行導出:
docker export <CONTAINER ID> > /home/export.tar
保存(Save)
Save命令用於持久化鏡像(不是容器)。因此,咱們就須要經過如下方法獲得鏡像名稱:
sudo docker images
接着執行保存:
sudo docker save busybox-1 > /home/save.tar
導出後再導入(exported-imported)的鏡像會丟失全部的歷史,而保存後再加載(saveed-loaded)的鏡像沒有丟失歷史和層(layer)。這意味着使用導出後再導入的方式,你將沒法回滾到以前的層(layer),同時,使用保存後再加載的方式持久化整個鏡像,就能夠作到層回滾(能夠執行docker tag <LAYER ID> <IMAGE NAME>來回滾以前的層)。
經過實驗咱們能夠得知,import 導入的文件是export 導出的模板。export導出是針對容器來操做的。
load裝載的文件是save保存的鏡像。save保存是針對鏡像來操做的。這兩組命令不能搞混。apache
說了這麼多,docker到底用在哪裏?下面的回答來自一個叫瘋狂的愛因斯坦的網友。
好比你用的是Ubuntu,服務器用的是CentOS,那麼此時你要把項目部署到服務器上,可能在環境的配置上就要花費很多的時間了。又或者好比你用的MySQL,放在之前每次重裝一次系統或者換一個環境,你就要把你的環境重裝一次,東西越多花費的時間越多。
而使用Docker,你只須要一條命令,你就能夠在你的Ubuntu上再運行一個「新的環境」,固然這一個環境仍是基於你現有的環境的,也就是說實際上共享的仍是同一套資源,可是這套環境裏面已經有了你須要的東西。
你須要MySQL,那就安裝一個帶MySQL的鏡像, 而後啓動一個容器。
你須要Redis,那就安裝一個帶Redis的鏡像, 而後啓動一個容器。
你須要..., 那就..., 而後...。
固然你也能夠在別人的基礎之上,對容器進行修改後,好比添加了一些你本身的軟件或修改配置文件,而後再commit,這樣你就把這個容器製做成了一個鏡像,之後你能夠用這個鏡像建立出N個如出一轍的容器。
好比你要學習搭載Redis集羣,那麼你能夠下載一個Redis的鏡像,而後啓動容器,把集羣的配置設置好後,提交這個容器生成鏡像,再根據這個鏡像運行出6個或更多容器,這樣一個集羣就搭起來了。
並且Docker佔用的資源很小。json