Docker 入門 到部署Web 程式- (阿里面試常用的docker命令和優點)

OkidoGreen發表於2020-04-05

https://www.cnblogs.com/aspirant/p/8808809.html

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

一、Docker概述:

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

Java號稱“一次編譯,到處執行”,因為java虛擬機器解決平臺的相容性問題,所以有java虛擬機器的地方就能跑java程式碼;

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

一句話 應用打包工具

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。
一個完整的Docker有以下幾個部分組成:
DockerClient客戶端
Docker Daemon守護程式
Docker Image映象
DockerContainer容器 [2]

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

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

映象—Docker的映象和常見的系統ISO映象類似,包含了應用程式的資訊;

容器—容器相當於一個可以執行起來的虛擬機器,應用程式執行在容器中,Docker執行在“Docker”上;

倉庫—倉庫是存放映象的地方,有類似git的版本控制,同樣分為公開倉庫(Public)和私有倉庫(Private)兩種形式;

Docker支援大部分的Linux發行版,通過使用Docker容器,就可以在不同的作業系統,

不同的機器上執行自己的應用,不用關心硬體、執行環境之類的配置,應用程式的遷移變得非常簡單。

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

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

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

 vs

 

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

三、真正的部署一下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拉取就行了) 

?

1

docker pull tomcat

  

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

接下來我們就用Tomcat映象來啟動一個容器 

?

1

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

 

db3是後臺容器的NAMES,d48b21a7e439是容器的程式ID  CONTAINER ID

然後就進去了這個容器的ssh介面。

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

 

 

b:使用docker exec命令

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

 

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

 

db3是後臺容器的NAMES,d48b21a7e439是容器的程式ID  CONTAINER ID

 /bin/sh 是固定寫法

它也能進入這個容器

 

 

鑑於阿里的面試官問這個問題 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命令

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

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的五個最重要優勢,即持續整合、版本控制、可移植性、隔離性和安全性。

對於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常用命令

參考:安裝Docker和下載images映象和常用Docker命令

參考:docker從容器裡面拷檔案到宿主機或從宿主機拷檔案到docker容器裡面

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

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

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

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

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

相關文章