30分鐘快速上手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/
(2)
(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 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
# 進入容器的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一樣,那麼啟動的容器的環境都一緻。牛逼!
下文我們将介紹:Dockerfile,歡迎關注