一步一步圖文結合的方式帶你從零實戰Docker

一、歷史演化

1、演化史

在這裏插入圖片描述

2、物理機時代

2.1、圖解

一個物理機上安裝操作系統,然後直接運行我們的軟件。也就是說你電腦上直接跑了一個軟件,並沒有開虛擬機什麼的,資源極其浪費。

在這裏插入圖片描述

2.2、缺點

  • 部署慢
  • 成本高

虛擬機都不開,直接上物理機部署應用,那成本能不高嘛

  • 資源浪費

硬件資源沒有合理利用

  • 不易遷移和增加機器

每次遷移都要重新安裝一模一樣的運行環境等

  • 受限於硬件

3、虛擬機時代

3.1、圖解

一個物理機上虛擬化出來多個虛擬機,每個虛擬機上進行安裝操作系統,然後在虛擬機上直接運行我們的軟件。比如阿里雲、騰訊雲等雲服務器都是虛擬機。

在這裏插入圖片描述

3.2、特點

  • 多部署

一個物理機上創建多個虛擬機,每個虛擬機的ip都不同,一個軟件可以在不同虛擬機上進行部署。

  • 資源隔離

每個虛擬機都由獨立分配的內存磁盤等硬件資源,通過Hypervisor分配。

  • 易擴展

隨時隨地都能在一個物理機上開出新的虛擬機。成本也低。

  • 成本相對較低

3.3、缺點

  • VM需要安裝操作系統

假設我們的應用程序只有幾KB,或者幾十MB,但是卻要在虛擬機上安裝一個幾百兆的操作系統來跑。

4、容器化時代

4.1、有什麼用

看完了物理機時代和虛擬機時代後發現各有缺點,而容器化技術可以完美解決虛擬機時代的缺點。

或許你一定遇到過程序在我本地是正常的,爲毛到了QA環境就GG了?或者本地和QA都測試通過了,爲毛上線就GG了?這大多是因爲環境不同所導致的,最簡單的例子:本地和QA是jdk1.8,線上是1.6等等。容器化技術比如docker,開發者可以將安裝環境和程序一起打包給運維,運維直接安裝你這個打包的“腳本”即可,所有的環境都是你本地正常運行的。

如果沒看懂就粗淺的理解爲:你用shell命令寫了個腳本,下載jdk,配置環境變量、下載tomcat、部署你的程序等等這一套流程,然後交給運維,運維直接sh xxx.sh就完事了,環境什麼的都是你給的,不會出現環境不一致的情況。你肯定有疑問:我虛擬機上有jdk了,你給我的腳本里再安裝jdk肯定不行啊,容器化技術可以讓資源隔離,互不影響。

4.2、對比虛擬機時代

虛擬化技術是物理硬件的隔離,容器化技術是app層面的隔離,兩者不衝突。往往容器化時代都是基於虛擬機基礎之上做的資源隔離。它可以基於虛擬機的操作系統部署多服務,不再需要額外安裝操作系。

4.3、特點

  • 標準化的遷移方式

那肯定啊,開發者將環境和程序打包給運維,運維直接執行就完事了。

  • 統一的參數配置

廢話,包都是開發者給的,開發者難道把一個應用程序打兩個不同的包給運維?

  • 自動化部署
  • 應用集羣監控
  • 開發與運維之間的溝通橋樑

加粗了,自行體會。

二、什麼是Docker?

**Docker就是容器化技術的一種具體實現。**基於Go語言開發。

加粗的一句話已經解釋的明明白白了,不明白就等於沒看懂上面的。

三、Docker的安裝

基於Centos7的安裝。

1、官方安裝地址

https://docs.docker.com/engine/install/centos/

官方由於是國外的,所以不推薦,推薦下面的安裝方式。

2、國內源安裝

2.1、安裝工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

device-mapper-persistent-data lvm2是幹嘛的?

docker要想數據存儲就必須要安裝這兩個,這兩個是爲了docker做數據存儲用的。

2.2、添加源爲國內

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.3、更新安裝Docker-CE

sudo yum makecache fast
sudo yum -y install docker-ce

2.4、驗證是否安裝成功

sudo service docker start
docker version

2.5、先爽一把helloworld

好不容易安裝完了,先爽一把helloworld。

docker pull hello-world
docker run hello-world

在這裏插入圖片描述

四、更換鏡像地址

需要更換鏡像倉庫地址爲阿里雲的。

1、啥意思

記得maven嘛?maven下載下來一般都會改配置文件,將其遠程倉庫地址改爲阿里雲的,docker其實也一樣,如果把他比作maven的話,可以理解成從遠程倉庫(鏡像倉庫)拉取jar包(鏡像文件),但是遠程鏡像倉庫是國外的,所以需要換成國內的。

2、更換步驟

(1)打開網站

https://www.aliyun.com/

(2)搜索“容器鏡像服務”

在這裏插入圖片描述

(3)點擊“立即開通”

在這裏插入圖片描述

(4)點擊“鏡像加速器”

在這裏插入圖片描述

(5)執行命令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

(6)大功告成

上面1-5步驟執行完成後就大功告成了,就可以用docker pull xxx來測試下了,速度賊拉快。

五、Docker的基本概念

1、容器與鏡像

1.1、鏡像

鏡像是只讀的文件,提供了運行程序完整的軟硬件資源,是應用程序的“集裝箱”。

1.2、容器

容器是鏡像的實例,由Docker負責創建,容器之間彼此隔離。

1.3、一句話概況

一個鏡像可以創建多個容器,容器之間彼此隔離,互不影響。

2、倉庫

2.1、本地倉庫

存放了自己docker pull下來的鏡像。

2.2、遠程倉庫

存放了各種各樣的鏡像,docker pull命令就是先去本地倉庫檢查是否有這個鏡像,沒有的話就去遠程倉庫拉取鏡像放到本地倉庫。鏡像都是別人打包好的應用程序,只讀。

docker遠程倉庫地址:https://hub.docker.com/

直接搜索就行,不用註冊登錄。

2.3、一句話概況

跟maven倉庫的含義幾乎一樣。

3、Docker Daemon

用於管理鏡像和容器,客戶端發起docker run的請求會交給docker daemon處理,docker daemon會給這個鏡像開闢一個新的容器。再比如客戶端發起docker pull命令也是交給docker daemon,docker daemon去檢查本地倉庫有沒有,本地倉庫沒有的話docker daemon去遠程倉庫拉取鏡像放到本地倉庫。

六、docker原理

1、描述

原理很簡單,核心在於docker daemon,客戶端所有的請求都會交給daemon處理,比如下圖中的三個命令的完整執行流程是這樣的:

1.1、docker build

client發送docker build給docker daemon,docker daemon收到請求後會構建鏡像放到本地倉庫。

1.2、docker pull

client發送docker pull命令給docker daemon,docker daemon收到命令後會優先檢查本地倉庫是否存在此鏡像,若不存在則去遠程倉庫拉取鏡像並放到本地倉庫,若存在則不走遠程倉庫。

1.3、docker run

client發送docker run命令給docker daemon,docker daemon收到命令後會啓動一個新的容器,所以一個鏡像可以有多個容器,只要我run一次就會產生一個新的容器出來。

2、圖解

在這裏插入圖片描述

七、實戰部署Tomcat

1、找鏡像

(1)去遠程倉庫找鏡像 https://hub.docker.com/

在這裏插入圖片描述

(3)一般帶官方logo的,且名字就是官方名字的(比如tomcat),且start最高的,那就是正品。其他的可能都是個人的,個人的不靠譜。

在這裏插入圖片描述

(4)

在這裏插入圖片描述

2、安裝tomcat

2.1、拉取鏡像

docker pull tomcat

完整命令是:docker pull 鏡像名<:tags> 從遠程倉庫拉取鏡像。如果沒寫:tags則代表是latest版本。如下圖

在這裏插入圖片描述

比如也可以拉取帶tags的鏡像

docker pull tomcat:8.5.55-jdk8-openjdk

這個tag是從如下地方獲取的

在這裏插入圖片描述

2.2、查看鏡像

docker images

2.3、啓動容器

鏡像有了該啓動容器玩玩了。

docker run tomcat

完整命令是:docker run 鏡像名<:tags> 這裏沒指定tag就代表是latest, docker images可以查看鏡像tags等信息。

2.4、問題

我們已經裝逼三連:docker pulldocker imagesdocker run,將tomcat正常啓動了,默認端口8080,問題來了,我怎麼訪問呢?它是在docker裏的,不是我宿主機的8080端口,這就需要做一個端口映射。宿主機和docker啓動的tomcat的端口映射。

2.5、端口映射

docker run -p 8000:8080 tomcat

也就是啓動參數裏多加個-p參數,-p參數用於端口映射,前面是宿主機端口,後面是容器端口。

2.6、測試

瀏覽器輸入:http://localhost:8800

404?那是因爲新版本tomcat將webapps下面的內容都刪了,所以找不到了原來的index.jsp文件了。這又有問題了,我怎麼進入我容器裏的tomcat目錄?比如看個log,找到webapps給他添加文件等操作。

2.7、進入容器裏的tomcat

# 先用docker ps命令查看啓動的容器
docker ps

在這裏插入圖片描述

# 進入容器的tomcat
docker exec -it ac1c3d62b75d /bin/bash

格式:docker exec [-it] 容器id 命令

exec:在對應容器中執行命令

-it:採用交互方式執行命令

執行ls -l查看目錄

在這裏插入圖片描述

可以看下webapps,裏面空空如也。所以404,但是外層有一個webapps.dist文件夾,這個文件夾是原有tomcat的主頁面,我們可以刪除webapps,然後mv命令將webapps.dist改爲webapps,等自動部署完在訪問網頁就正常了。

mv後tomcat部署稍微慢點,等1-2min,在訪問就行。

2.8、怎麼後臺啓動

現在問題:ctrl+c就結束進程了。

# -d 參數即可
docker run -p 8000:8080 -d tomcat

2.9、總結

以上步驟其實就幹了這麼幾件事:

  • docker pull 鏡像
  • docker run 鏡像

-p 端口映射

-d 後臺啓動

  • docker exec -it 鏡像id /bin/bash

八、常用命令總結

命令 解釋
docker pull 鏡像名<:tags> 從遠程倉庫拉取鏡像到本地倉庫
docker images 查看本地倉庫所有鏡像
docker run 鏡像名<:tags> 基於鏡像創建容器並啓動,可以添加-d port1:port2參數,port1:宿主機端口,port2:容器端口, -d參數代表後臺運行
docker ps 查看當前所有啓動的容器
docker ps -a 查看本地所有容器,包含未啓動的,刪除容器的時候可用來查詢容器id
docker start/stop/restart 容器id 啓動/停止/重啓容器
docker rm <-f> 容器id 刪除<-f:強制刪除>容器,運行中的容器不能刪除,-f可以強制
docker rmi <-f> 鏡像名稱 <:tags> 刪除<強制刪除>鏡像,鏡像有容器在啓動,不能被刪除,-f可以強制
docker exec [-it] 容器id 命令 進入容器主目錄,exec:在對應容器中執行命令,-it:採用交互方式執行命令

九、容器內部結構

1、內部結構

你jdk都沒安裝,怎麼就能跑tomcat? tomcat容器內部包含了如下:

  • 一個超級迷你的linux系統
  • jdk
  • tomcat

2、驗證

先進入容器

docker exec -it ac1c3d62b75d /bin/bash
  • linux系統

執行cat /proc/version,可以發現帶了個紅帽系統

在這裏插入圖片描述

  • jdk

java -version

  • tomcat

這個還用驗證?

十、容器原理

1、圖解

在這裏插入圖片描述

2、總結

created -> running -> paused -> deleted

3、驗證

docker create tomcat
# 查看容器狀態,會發現是created
docker ps -a

在這裏插入圖片描述

docker start 8c4a21f47b8f
# 查看容器狀態,會發現是up, up就對應running,代表運行中
docker ps

在這裏插入圖片描述

# docker stop命令會讓容器進入exit狀態,這個不等於paused,paused沒有演示的必要。
docker stop 8c4a21f47b8f
# rm刪除容器。也就對應deleted狀態
docker rm 8c4a21f47bf

十一、docker總結

發現優點了沒?

  • 一個宿主機上或者虛擬機上啓動N個docker,每個docker是一個tomcat,之前集羣是多個虛擬機,或者宿主機,現在是一個虛擬機上開N個docker容器,然後映射不同的端口,牛逼。當然你會說負載均衡,掛了一個第二個還能支持,這種需要多臺虛擬機的。但是也大大節省了資源消耗。雖然你一臺機器也能改端口來完成,但是docker節省資源,而且資源隔離,N個容器之間彼此獨立。
  • 資源隔離,多個容器之間彼此不干擾。
  • 環境統一,因爲只要鏡像的tag一樣,那麼啓動的容器的環境都一致。牛逼!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章