應用容器引擎:docker的簡介與安裝

 

目錄

Docker概述:

Docker和傳統虛擬化技術的對比

部署Docker的開發環境

Docker常用命令

Docker的優點:

持續部署與測試

多雲平臺

環境標準化和版本控制

隔離性

安全性

結語


最近阿里的面試官問我Docker是做什麼用的,我記得之前360和美團,京東的都問過,但是一直沒時間看,最近有時間了,系統的學習了一下Docker,在此做一下記錄,方便各位看官學習交流

 

Docker概述:

(1)Docker: 本意是碼頭工人,言外之意是集裝箱;

(2)Java號稱“一次編譯,到處運行”,因爲java虛擬機解決平臺的兼容性問題,所以有java虛擬機的地方就能跑java代碼;

(3)Docker是:“一次封裝,到處運行”,因爲docker解決了應用環境的問題,安裝了docker的平臺就能跑“docker包”,這樣就決絕了“開發環境能跑,一上線就崩”的尷尬。

(4)總結一句話:應用打包工具;

(5)Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,可以實現快速部署,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。如果出現的故障,可以通過鏡像,快速恢復服務。

(6)一個完整的Docker有以下幾個部分組成:

  • DockerClient客戶端
  • Docker Daemon守護進程
  • Docker Image鏡像
  • DockerContainer容器 [2]

(7)Docker 是一個基於Linux容器(LXC-linux container)的高級容器引擎,基於go語言開發,
源代碼託管在 Github 上, 遵從Apache2.0協議開源。Docker的目標是實現輕量級的操作系統虛擬化解決方案。

(8)學習Docker首先要了解幾個概念:

  • 鏡像—Docker的鏡像和常見的系統ISO鏡像類似,包含了應用程序的信息;
  • 容器—容器相當於一個可以運行起來的虛擬機,應用程序運行在容器中,Docker運行在“Docker”上;
  • 倉庫—倉庫是存放鏡像的地方,有類似git的版本控制,同樣分爲公開倉庫(Public)和私有倉庫(Private)兩種形式;

(9)Docker支持大部分的Linux發行版,通過使用Docker容器,就可以在不同的操作系統,不同的機器上運行自己的應用,不用關心硬件、運行環境之類的配置,應用程序的遷移變得非常簡單。

 

Docker和傳統虛擬化技術的對比

相比傳統虛擬機技術,Docker資源佔用少,啓動更快,很大的方便了項目的部署和運維。Docker是在操作系統層面上實現虛擬化,複用本地主機的操作系統,傳統方式是在硬件的基礎上,虛擬出多個操作系統,然後在系統上部署相關的應用。

下面的這張圖片參考相關博文,很形象的說明了Docker和VM之類的傳統虛擬化技術的區別:

 vs

就像一個集裝箱一樣,不管需要運送服裝還是化工產品,還是汽車,只需要放在集裝箱裏面,不管到那個船上,也不管到那個鐵路上,我直接機械化的搬運就行了。很簡單

 

部署Docker的開發環境

首先要安裝VMware 虛擬機和 並下載Centos 操作系統,然後安裝上 Linux 環境,

此處如果不懂的話,可直接百度,安裝完之後,我這邊不能上網,後來做了一下配置:參考:VMware 虛擬機 不能上網 CentOS 6.5 Windows 7上面安裝了VMware,然後安裝了CentOS系統,安裝完了無法上網;

然後可以上網了,好了linux環境 準備好了,開始安裝了;

(1) 直接使用yum 安裝 docker:

首先肯定是要機器中安裝了docker,如果沒安裝就用以下命令安裝一下 

yum install -y docker

 

(2) 既然是部署web應用,那麼當然少不了Tomcat了,所以我們應該先拉取Tomcat鏡像。

命令如下,(開始的時候,我還跑到網上去下載tomcat,後來發現,根本不需要,直接用docker拉取就行了) 

docker pull tomcat

這個鏡像有點大,所以可以事先拉取好,節省時間。

 

(3) 接下來我們就用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包。

 

(4) 如何將文件從主機複製到容器中?

因爲我之前的終端在容器裏面,這裏我開啓第二個終端進行操作。我的war包文件我放在/mnt/的目錄下

這裏寫圖片描述

從主機複製到容器: sudo docker cp host_path containerID:container_path

從容器複製到主機: sudo docker cp containerID:container_path host_path

將war包放入到docker下的tomcat中
首先你是需要把war包放入到centos系統中,本文中將一個test.war的項目放入centos系統的主目錄,這個通過ssh工具就可以放到centos中,大家應該都很熟悉。從centos中將test.war移動到docker下tomcat鏡像啓動的容器中。

docker cp test.war containerID:/usr/local/tomcat/webapps/

執行以下命令可進入容器內部:

docker exec -it tomcat001 /bin/bash

docker端口映射或啓動容器時報錯:

Error response from daemon: Container 7c5a2350c4cb2370d8aba94eef9cec4a6c2ac3207030

現象:

docker exec -it 7c5a2350c4cb /bin/bash
Error response from daemon: Container 7c5a2350c4cb2370d8aba94eef9cec4a6c2ac3207030961637072be82a4e9d64 is not running。

解決:

docker start 5ec54ba35b1e

我們這裏用的命令是:

docker cp /mnt/webdemo.war a2f2091a661fa51e02c0be54f252fc46fc604932526b17038ccc267affcef12c:/usr/local/tomcat/webapps

其中那個長的字符串是容器的id,自己去查一下。 後面的路徑是容器的內部路徑,實在不懂可以複製過去,這裏要注意:冒號後面沒有空格,我之前有空格,一直複製不過去。

 

(5) 接下來就是啓動Tomcat了。

war包已經導入容器中了,這個時候我們可以去第一個終端查看一下

這裏寫圖片描述

可以看到war包已經導入了。但是這個時候Tomcat服務其實是沒有啓動的,下面我們就啓動Tomcat服務,讓Tomcat幫我們完成war包的解壓和部署。

20180108102455567.png20180108102455567.png這裏寫圖片描述

這裏我們進入bin目錄把目錄下的catalina.sh文件run起來,這樣Tomcat就跑起來了,而且Tomcat跑起來是在前端運行的,這也是我爲什麼打開第二個終端的原因。

最後我們可以在瀏覽器中查看效果:

這裏寫圖片描述

 

我照着網上的應用去做,上面的都沒問題,成功了,不過後來把原來創建的容器ssh關閉了,然後又打開,

 

(6) 如何進入已經打開的容器呢,兩種方法

a:使用docker attach命令

docker attach db3 或者 docker attach d48b21a7e439

說明:
1. db3是後臺容器的NAMES,d48b21a7e439是容器的進程ID  CONTAINER ID

2. 然後就進去了這個容器的ssh界面。

3. 但是它有一個缺點,只要這個連接終止,或者使用了exit命令,容器就會退出後臺運行

b:使用docker exec命令

這個命令使用exit命令後,不會退出後臺,一般使用這個命令,使用方法如下

docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh

說明:
1. db3是後臺容器的NAMES,d48b21a7e439是容器的進程ID  CONTAINER ID

2. /bin/sh 是固定寫法

它也能進入這個容器

 

Docker常用命令

鑑於阿里的面試官問這個問題 Docker常用的命令,有必要對Docker常用的命令做一次梳理:

(1) 安裝 docker:

    yum install -y docker

(2) docker服務:

    service docker start   //啓動docker service

    service docker stop   //關閉docker服務

(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


(6)創建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上掛載;

(7) 啓動一個停止的容器:

    docker start webdemo
	
(8) 羅列所有的docker容器:包含了啓動的Docker和沒有啓動的容器Docker

    docker ps -a;
	
(9) 啓動容器:

    docker start webdemo
	
    可能端口會被佔用,我們可以先把運行的docker實例停掉,然後再刪掉,

    docker kill webdemo

    docker rm webdemo


(10) 進入其中一個容器使用命令:docker exec

    這個命令使用exit命令後,不會退出後臺,一般使用這個命令,使用方法如下

    docker exec -it webdemo /bin/bash
	
(11)拷貝文件

    從主機複製到容器: 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/

	(12) 在容器中啓動tomcat:  

    cd /usr/local/tomcat/bin
	
    ./catalina.sh run
	
(12)記住一個服務器可以有多個容器,但是一個服務器只需要安裝一個tomcat,然後每個容器可以掛載到不同的tomcat的端口上面,
就是這關係。前臺訪問:

    http://192.168.163.128:80/docker  //這是第一個容器webdemo

    http://192.168.163.128:81/docker; //這是第二個容器webdemo1

 

Docker的優點:

 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需要的依賴
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
1
2
3
第二步,下載docker的repo文件
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
1
2
3
第三步,安裝docker
sudo yum install docker-ce
1
第四步,啓動docker
sudo service docker start
1
或者

sudo systemctl start docker
--------------------- 
作者:暴沸 
來源:CSDN 
原文:https://blog.csdn.net/baofeidyz/article/details/80652668 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

結語

將雲計算一起考慮,上面提到的這些好處能夠清楚地證明Docker是一個有效的開源平臺。使用Docker的好處越來越多,今天我只想強調這前五大好處。如果你使用了Docker,歡迎分享你的使用案例或者任何你覺得使用Docker帶來的好處。

參考:Docker常用命令

參考:安裝Docker和下載images鏡像和常用Docker命令

參考:docker從容器裏面拷文件到宿主機或從宿主機拷文件到docker容器裏面

參考:如何通俗解釋Docker是什麼?

參考:Docker搭建Java Web運行環境

參考:在Docker中如何利用Tomcat快速部署web應用?

參考:docker進入後臺運行的容器

參考:Docker五大優勢:持續集成、版本控制、可移植性、隔離性和安全性

 

原文鏈接:https://blog.csdn.net/baofeidyz/article/details/80652668

發佈了78 篇原創文章 · 獲贊 272 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章