Linux 學習總結(六十九)docker-1

參考資料
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

一 docker概述

官網 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

二 docker 與傳統的虛擬化比較

Linux 學習總結(六十九)docker-1
Linux 學習總結(六十九)docker-1
傳統的虛擬機技術是虛擬出一套硬件,在虛擬的硬件上運行一個操做系統,虛擬機中的應用在 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支持,會有更高的性能和效率
易遷移,平臺依賴性不強
Linux 學習總結(六十九)docker-1git

三 docker 的核心概念

1 鏡像
鏡像,是一個只讀的模板,相似於安裝系統用到的那個iso文件,咱們經過鏡像來完成各類應用的部署。一個鏡像能夠只包含一個操做系統環境(好比SUSE鏡像),也能夠安裝了用戶程序及其運行環境(好比eBackup鏡像)。鏡像其實就是一個文件,任何用戶程序均可以成爲鏡像的一部分。
鏡像=操做系統+軟件運行環境+用戶程序
2 容器:
容器是從鏡像建立的運行實例,能夠被啓動、開始、中止、刪除等操做,每一個容器都是相互隔離的。若是鏡像能夠比做類的話,容器就是鏡像實例化後的對象。容器是咱們直接用來操做的,他是具體的,動態的。而鏡像是抽象的,靜態的。
3 倉庫
存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)github

四 docker 基本操做

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再start
docker 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刪除,若是是運行的容器,能夠加-f
docker 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具體應用

說了這麼多,docker到底用在哪裏?下面的回答來自一個叫瘋狂的愛因斯坦的網友。
好比你用的是Ubuntu,服務器用的是CentOS,那麼此時你要把項目部署到服務器上,可能在環境的配置上就要花費很多的時間了。又或者好比你用的MySQL,放在之前每次重裝一次系統或者換一個環境,你就要把你的環境重裝一次,東西越多花費的時間越多。
而使用Docker,你只須要一條命令,你就能夠在你的Ubuntu上再運行一個「新的環境」,固然這一個環境仍是基於你現有的環境的,也就是說實際上共享的仍是同一套資源,可是這套環境裏面已經有了你須要的東西。
你須要MySQL,那就安裝一個帶MySQL的鏡像, 而後啓動一個容器。
你須要Redis,那就安裝一個帶Redis的鏡像, 而後啓動一個容器。
你須要..., 那就..., 而後...。
固然你也能夠在別人的基礎之上,對容器進行修改後,好比添加了一些你本身的軟件或修改配置文件,而後再commit,這樣你就把這個容器製做成了一個鏡像,之後你能夠用這個鏡像建立出N個如出一轍的容器。
好比你要學習搭載Redis集羣,那麼你能夠下載一個Redis的鏡像,而後啓動容器,把集羣的配置設置好後,提交這個容器生成鏡像,再根據這個鏡像運行出6個或更多容器,這樣一個集羣就搭起來了。
並且Docker佔用的資源很小。json

相關文章
相關標籤/搜索