最近阿里的面試官問我Docker是作什麼用的,我記得以前360和美團,京東的都問過,可是一直沒時間看,最近有時間了,系統的學習了一下Docker,在此作一下記錄,方便各位看官學習交流html
後來去面試,他們問我 若是如今有5臺服務器 同時部署docker 你會如何處理,我當時說一臺臺部署,那哥們聽完臉色鐵青,說有沒有用過swarm和compose 作docker的批量部署,我說沒有,後來回來一查,我暈,本身每天在用compose 我寫了篇博客:docker swarm和compose 的使用(阿里)前端
1、Docker概述:java
Docker: 本意是碼頭工人,言外之意是集裝箱;node
Java號稱「一次編譯,處處運行」,由於java虛擬機解決平臺的兼容性問題,因此有java虛擬機的地方就能跑java代碼;linux
Docker是:「一次封裝,處處運行」,由於docker決絕了應用環境的問題,安裝了docker的平臺就能跑「docker包」,這樣就決絕了「開發環境能跑,一上線就崩」的尷尬。git
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有如下幾個部分組成:
DockerClient客戶端
Docker Daemon守護進程
Docker Image鏡像
DockerContainer容器 [2] web
Docker 是一個基於Linux容器(LXC-linux container)的高級容器引擎,基於go語言開發,
源代碼託管在 Github 上, 聽從Apache2.0協議開源。Docker的目標是實現輕量級的操做系統虛擬化解決方案。面試
學習Docker首先要了解幾個概念:docker
鏡像—Docker的鏡像和常見的系統ISO鏡像相似,包含了應用程序的信息;centos
容器—容器至關於一個能夠運行起來的虛擬機,應用程序運行在容器中,Docker運行在「Docker」上;
倉庫—倉庫是存放鏡像的地方,有相似git的版本控制,一樣分爲公開倉庫(Public)和私有倉庫(Private)兩種形式;
Docker支持大部分的Linux發行版,經過使用Docker容器,就能夠在不一樣的操做系統,
不一樣的機器上運行本身的應用,不用關心硬件、運行環境之類的配置,應用程序的遷移變得很是簡單。
2、Docker和傳統虛擬化技術的對比
相比傳統虛擬機技術,Docker資源佔用少,啓動更快,很大的方便了項目的部署和運維。
Docker是在操做系統層面上實現虛擬化,複用本地主機的操做系統,傳統方式是在硬件的基礎上,虛擬出多個操做系統,而後在系統上部署相關的應用。
下面的這張圖片參考相關博文,很形象的說明了Docker和VM之類的傳統虛擬化技術的區別:
vs
就像一個集裝箱同樣,無論須要運送服裝仍是化工產品,仍是汽車,只須要放在集裝箱裏面,無論到那個船上,也無論到那個鐵路上,我直接機械化的搬運就好了。很簡單
3、真正的部署一下Dock的開發環境
首先要安裝VMware 虛擬機和 並下載Centos 操做系統,而後安裝上 Linux 環境,
此處若是不懂的話,可直接百度,
安裝完以後,我這邊不能上網,後來作了一下配置:
參考:VMware 虛擬機 不能上網 CentOS 6.5 Windows 7上面安裝了VMware,而後安裝了CentOS系統,安裝完了沒法上網;
而後能夠上網了,好了linux環境 準備好了,開始安裝了
(1)直接使用yum 安裝 docker:
首先確定是要機器中安裝了docker,若是沒安裝就是用yum install -y docker 命令安裝一下
yum install -y docker
既然是部署web應用,那麼固然少不了Tomcat了,因此咱們應該先拉取Tomcat鏡像。
命令以下,(開始的時候,我還跑到網上去下載tomcat,後來發現,根本不須要,直接用docker拉取就好了)
docker pull tomcat
這個鏡像有點大,因此能夠事先拉取好,節省時間。
接下來咱們就用Tomcat鏡像來啓動一個容器
docker run -it --name webdemo -p 80:8080 tomcat /bin/bash
docker run -i -t <IMAGE_ID> /bin/bash:-i:標準輸入給容器 -t:分配一個虛擬終端 /bin/bash:執行bash腳本
這裏咱們啓動一個交互式的容器,名字是webdemo,-p 80:8080表示將容器的8080端口映射到主機的80端口,這樣咱們只要訪問主機的80端口就能夠訪問到容器的服務了。
容器建立好了以後是會進入容器裏面的,這時咱們恰好能夠看看內部的文件結構。那裏有個webapps文件,咱們只要把咱們的web應用程序保存成war包的格式,而後再複製到這個文件中就能夠了。由於Tomcat會自動幫咱們解壓而且部署war包。
如何將文件從主機複製到容器中?
由於我以前的終端在容器裏面,這裏我開啓第二個終端進行操做。個人war包文件我放在/mnt/的目錄下
從主機複製到容器 sudo docker cp host_path containerID:container_path
從容器複製到主機 sudo docker cp containerID:container_path host_path
咱們這裏用的命令是:
docker cp /mnt/webdemo.war a2f2091a661fa51e02c0be54f252fc46fc604932526b17038ccc267affcef12c:/usr/local/tomcat/webapps
其中那個長的字符串是容器的id,本身去查一下。 後面的路徑是容器的內部路徑,實在不懂能夠複製過去,這裏要注意:冒號後面沒有空格,我以前有空格,一直複製不過去。
接下來就是啓動Tomcat了。
war包已經導入容器中了,這個時候咱們能夠去第一個終端查看一下
能夠看到war包已經導入了。可是這個時候Tomcat服務實際上是沒有啓動的,下面咱們就啓動Tomcat服務,讓Tomcat幫咱們完成war包的解壓和部署。
這裏咱們進入bin目錄把目錄下的catalina.sh文件run起來,這樣Tomcat就跑起來了,並且Tomcat跑起來是在前端運行的,這也是我爲何打開第二個終端的緣由。
最後咱們能夠在瀏覽器中查看效果:
我照着網上的應用去作,上面的都沒問題,成功了,不事後來把原來建立的容器ssh關閉了,而後又打開,
如何進入已經打開的容器呢,兩種方法
a:使用docker attach命令
docker attach db3 或者 docker attach d48b21a7e439
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
db3是後臺容器的NAMES,d48b21a7e439是容器的進程ID CONTAINER ID
鑑於阿里的面試官問這個問題 Docker經常使用的命令,有必要對Docker經常使用的命令作一次梳理:
(1) 安裝 docker:
yum install -y docker
(2) 啓動 docker服務:
service docker start //啓動docker service
若是想要關閉docker服務:
service docker stop
(3) 獲取鏡像:
sudo docker pull NAME[:TAG]
sudo docker pull centos:latest
好比獲取tomcat 鏡像:
docker pull tomcat //命令格式: docker pull NAME
(4) 羅列全部鏡像:
docker images
(5)、刪除鏡像,從本地刪除一個已經下載的鏡像
sudo docker rmi IMAGE [IMAGE...]
sudo docker rmi centos:latest
(5)建立docker容器 並進入 webdemo1:
docker run -it --name webdemo1 -p 81:8080 tomcat /bin/bash
docker run -i -t <IMAGE_ID> /bin/bash:-i:標準輸入給容器 -t:分配一個虛擬終端 /bin/bash:執行bash腳本
注意:name前面是兩個-, 端口前面有-p, 後面有個tomcat;
這裏咱們啓動一個交互式的容器,名字是webdemo1,-p 81:8080表示將容器的8080端口映射到主機的81端口,這樣咱們只要訪問主機的81端口就能夠訪問到容器的服務了。若是還想建立其餘的容器,那麼名稱 要改,並且不能再掛載到主機的81上了,能夠82上掛載;
(6)啓動一箇中止的容器:
docker start webdemo
(7) 羅列全部的docker容器:包含了啓動的Docker和沒有啓動的容器Docker
docker ps -a;
(8) 啓動容器:
docker start webdemo
可能端口會被佔用,咱們能夠先把運行的docker實例停掉,而後再刪掉,
docker kill webdemo
docker rm webdemo
(9) 進入其中一個容器:使用docker exec命令
docker exec -it webdemo /bin/bash
(10)拷貝文件
從主機複製到容器 sudo docker cp host_path containerID:container_path
從容器複製到主機 sudo docker cp containerID:container_path host_path
請注意,以上這兩個命令都是在主機中執行的,不能再容器中執行
docker cp /root/software/docker.war webdemo:/
docker cp demo:/abc.txt /root/software/
(10) 在容器中啓動tomcat:
cd /usr/local/tomcat/bin
./catalina.sh run
(11)記住一個服務器能夠有多個容器,可是一個服務器只須要安裝一個tomcat,而後每一個容器能夠掛載到不一樣的tomcat的端口上面,就是這關係。前臺訪問:
http://192.168.163.128:80/docker //這是第一個容器webdemo http://192.168.163.128:81/docker; //這是第二個容器webdemo1
Docker五大優點:持續集成、版本控制、可移植性、隔離性和安全性
【編者的話】 隨着Docker技術的不斷成熟,愈來愈多的企業開始考慮使用Docker。Docker有不少的優點,本文主要講述了Docker的五個最重要優點,即持續集成、版本控制、可移植性、隔離性和安全性。
對於Docker,應該不須要進行詳細的介紹了。它是最火熱的開源項目之一,經過在容器中增長一個抽象層(a layer of abstraction),就能夠將應用程序部署到容器中。在看似穩定而成熟的場景下,使用Docker的好處愈來愈多。在這篇文章中,我不談論Docker是什麼或者Docker是怎麼工做的,取而代之,我會提出使用這個不斷成長的平臺的五大好處。
Docker在開發與運維的世界中具備極大的吸引力,由於它能保持跨環境的一致性。在開發與發佈的生命週期中,不一樣的環境具備細微的不一樣,這些差別多是因爲不一樣安裝包的版本和依賴關係引發的。然而,Docker能夠經過確保從開發到產品發佈整個過程環境的一致性來解決這個問題*Docker容器經過相關配置,保持容器內部全部的配置和依賴關係始終不變。最終,你能夠在開發到產品發佈的整個過程當中使用相同的容器來確保沒有任何差別或者人工干預。
使用Docker,你還能夠確保開發者不須要配置徹底相同的產品環境,他們能夠在他們本身的系統上經過VirtualBox創建虛擬機來運行Docker容器。Docker的魅力在於它一樣可讓你在亞馬遜EC2實例上運行相同的容器。若是你須要在一個產品發佈週期中完成一次升級,你能夠很容易地將須要變動的東西放到Docker容器中,測試它們,而且使你已經存在的容器執行相同的變動。這種靈活性就是使用Docker的一個主要好處。和標準部署與集成過程同樣,Docker可讓你構建、測試和發佈鏡像,這個鏡像能夠跨多個服務器進行部署。哪怕安裝一個新的安全補丁,整個過程也是同樣的。你能夠安裝補丁,而後測試它,而且將這個補丁發佈到產品中。
Docker最大的好處之一就是可移植性。在過去的幾年裏,全部主流的雲計算提供商,包括亞馬遜AWS和谷歌的GCP,都將Docker融入到他們的平臺並增長了各自的支持。Docker容器能運行在亞馬遜的EC2實例、谷歌的GCP實例、Rackspace服務器或者VirtualBox這些提供主機操做系統的平臺上。舉例來講,若是運行在亞馬遜EC2實例上的Docker容器可以很容易地移植到其餘幾個平臺上,好比說VirtualBox,而且達到相似的一致性和功能性,那這將容許你從基礎設施層中抽象出來。除了AWS和GCP,Docker在其餘不一樣的IaaS提供商也運行的很是好,例如微軟的Azure、OpenStack和能夠被具備不一樣配置的管理者所使用的Chef、Puppet、Ansible等。
經過上面的討論,Docker容器能夠在不一樣的開發與產品發佈生命週期中確保一致性,進而標準化你的環境。除此以外,Docker容器還能夠像git倉庫同樣,可讓你提交變動到Docker鏡像中並經過不一樣的版原本管理它們。設想若是你由於完成了一個組件的升級而致使你整個環境都損壞了,Docker可讓你輕鬆地回滾到這個鏡像的前一個版本。這整個過程能夠在幾分鐘內完成,若是和虛擬機的備份或者鏡像建立流程對比,那Docker算至關快的,它可讓你快速地進行復制和實現冗餘。此外,啓動Docker就和運行一個進程同樣快。
Docker能夠確保你的應用程序與資源是分隔開的。幾個月前,Gartner發表了一篇報告,這份報告說明了運行Docker 容器進行資源隔離的效果和虛擬機(VM)管理程序同樣的好,可是管理與控制方面還須要進行完善。
咱們考慮這樣一個場景,你在你的虛擬機中運行了不少應用程序,這些應用程序包括團隊協做軟件(例如Confluence)、問題追蹤軟件(例如JIRA)、集中身份管理系統(例如Crowd)等等。因爲這些軟件運行在不一樣的端口上,因此你必須使用Apache或者Nginx來作反向代理。到目前爲止,一切都很正常,可是隨着你的環境向前推動,你須要在你現有的環境中配置一個內容管理系統(例如Alfresco)。這時候有個問題發生了,這個軟件須要一個不一樣版本的Apache Tomcat,爲了知足這個需求,你只能將你現有的軟件遷移到另外一個版本的Tomcat上,或者找到適合你現有Tomcat的內容管理系統(Alfresco)版本。
對於上述場景,使用Docker就不用作這些事情了。Docker可以確保每一個容器都擁有本身的資源,而且和其餘容器是隔離的。你能夠用不一樣的容器來運行使用不一樣堆棧的應用程序。除此以外,若是你想在服務器上直接刪除一些應用程序是比較困難的,由於這樣可能引起依賴關係衝突。而Docker能夠幫你確保應用程序被徹底清除,由於不一樣的應用程序運行在不一樣的容器上,若是你不在須要一款應用程序,那你能夠簡單地經過刪除容器來刪除這個應用程序,而且在你的宿主機操做系統上不會留下任何的臨時文件或者配置文件。
除了上述好處,Docker還能確保每一個應用程序只使用分配給它的資源(包括CPU、內存和磁盤空間)。一個特殊的軟件將不會使用你所有的可用資源,要否則這將致使性能下降,甚至讓其餘應用程序徹底中止工做。
如上所述,Gartner也認可Docker正在快速地發展。從安全角度來看,Docker確保運行在容器中的應用程序和其餘容器中的應用程序是徹底分隔與隔離的,在通訊流量和管理上賦予你徹底的控制權。Docker容器不能窺視運行在其餘容器中的進程。從體系結構角度來看,每一個容器只使用着本身的資源(從進程到網絡堆棧)。
做爲緊固安全的一種手段,Docker將宿主機操做系統上的敏感掛載點(例如/proc和/sys)做爲只讀掛載點,而且使用一種寫時複製系統來確保容器不能讀取其餘容器的數據。Docker也限制了宿主機操做系統上的一些系統調用,而且和SELinux與AppArmor一塊兒運行的很好。此外,在Docker Hub上可使用的Docker鏡像都經過數字簽名來確保其可靠性。因爲Docker容器是隔離的,而且資源是受限制的,因此即便你其中一個應用程序被黑,也不會影響運行在其它Docker容器上的應用程序。
將雲計算一塊兒考慮,上面提到的這些好處可以清楚地證實Docker是一個有效的開源平臺。使用Docker的好處愈來愈多,今天我只想強調這前五大好處。若是你使用了Docker,歡迎分享你的使用案例或者任何你以爲使用Docker帶來的好處。
參考:Docker經常使用命令