一、歷史演化
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,歡迎關注