天天看點

30分鐘快速上手Docker,看這篇就對了! - Java知音号

30分鐘快速上手Docker,看這篇就對了!

一、曆史演化

1、演化史

30分鐘快速上手Docker,看這篇就對了! - Java知音号

2、實體機時代

2.1、圖解

一個實體機上安裝作業系統,然後直接運作我們的軟體。也就是說你電腦上直接跑了一個軟體,并沒有開虛拟機什麼的,資源極其浪費。
30分鐘快速上手Docker,看這篇就對了! - Java知音号

2.2、缺點

  • 部署慢
  • 成本高
虛拟機都不開,直接上實體機部署應用,那成本能不高嘛
  • 資源浪費
硬體資源沒有合理利用
  • 不易遷移和增加機器
每次遷移都要重新安裝一模一樣的運作環境等
  • 受限于硬體

3、虛拟機時代

3.1、圖解

一個實體機上虛拟化出來多個虛拟機,每個虛拟機上進行安裝作業系統,然後在虛拟機上直接運作我們的軟體。比如阿裡雲、騰訊雲等雲伺服器都是虛拟機。
30分鐘快速上手Docker,看這篇就對了! - Java知音号

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
           
30分鐘快速上手Docker,看這篇就對了! - Java知音号

四、更換鏡像位址

需要更換鏡像倉庫位址為阿裡雲的。

1、啥意思

記得maven嘛?maven下載下傳下來一般都會改配置檔案,将其遠端倉庫位址改為阿裡雲的,docker其實也一樣,如果把他比作maven的話,可以了解成從遠端倉庫(鏡像倉庫)拉取jar包(鏡像檔案),但是遠端鏡像倉庫是國外的,是以需要換成國内的。

2、更換步驟

(1)打開網站

https://www.aliyun.com/

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

30分鐘快速上手Docker,看這篇就對了! - Java知音号

(3)點選“立即開通”

30分鐘快速上手Docker,看這篇就對了! - Java知音号

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

30分鐘快速上手Docker,看這篇就對了! - Java知音号

(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、圖解

30分鐘快速上手Docker,看這篇就對了! - Java知音号

七、實戰部署Tomcat

1、找鏡像

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

(2)

30分鐘快速上手Docker,看這篇就對了! - Java知音号

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

30分鐘快速上手Docker,看這篇就對了! - Java知音号

(4)

30分鐘快速上手Docker,看這篇就對了! - Java知音号

2、安裝tomcat

2.1、拉取鏡像

docker pull tomcat
           
完整指令是:docker pull 鏡像名<:tags> 從遠端倉庫拉取鏡像。如果沒寫:tags則代表是latest版本。如下圖
30分鐘快速上手Docker,看這篇就對了! - Java知音号

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

docker pull tomcat:8.5.55-jdk8-openjdk
           

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

30分鐘快速上手Docker,看這篇就對了! - Java知音号

2.2、檢視鏡像

docker images
           

2.3、啟動容器

鏡像有了該啟動容器玩玩了。
docker run tomcat
           
完整指令是:docker run 鏡像名<:tags> 這裡沒指定tag就代表是latest, 

docker images

可以檢視鏡像tags等資訊。

2.4、問題

我們已經裝逼三連:

docker pull

docker images

docker 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
           
30分鐘快速上手Docker,看這篇就對了! - Java知音号
# 進入容器的tomcat
docker exec -it ac1c3d62b75d /bin/bash
           

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

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

-it:采用互動方式執行指令

執行

ls -l

檢視目錄

30分鐘快速上手Docker,看這篇就對了! - Java知音号

可以看下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

,可以發現帶了個紅帽系統
30分鐘快速上手Docker,看這篇就對了! - Java知音号
  • jdk
java -version
  • tomcat
這個還用驗證?

十、容器原理

1、圖解

30分鐘快速上手Docker,看這篇就對了! - Java知音号

2、總結

created -> running -> paused -> deleted

3、驗證

docker create tomcat
# 檢視容器狀态,會發現是created
docker ps -a
           
30分鐘快速上手Docker,看這篇就對了! - Java知音号
docker start 8c4a21f47b8f
# 檢視容器狀态,會發現是up, up就對應running,代表運作中
docker ps
           
30分鐘快速上手Docker,看這篇就對了! - Java知音号
# docker stop指令會讓容器進入exit狀态,這個不等于paused,paused沒有示範的必要。
docker stop 8c4a21f47b8f
           
# rm删除容器。也就對應deleted狀态
docker rm 8c4a21f47bf           

十一、docker總結

發現優點了沒?

  • 一個主控端上或者虛拟機上啟動N個docker,每個docker是一個tomcat,之前叢集是多個虛拟機,或者主控端,現在是一個虛拟機上開N個docker容器,然後映射不同的端口,牛逼。當然你會說負載均衡,挂了一個第二個還能支援,這種需要多台虛拟機的。但是也大大節省了資源消耗。雖然你一台機器也能改端口來完成,但是docker節省資源,而且資源隔離,N個容器之間彼此獨立。
  • 資源隔離,多個容器之間彼此不幹擾。
  • 環境統一,因為隻要鏡像的tag一樣,那麼啟動的容器的環境都一緻。牛逼!

下文我們将介紹:Dockerfile,歡迎關注