1.物理機時代
- 部署非常慢
- 成本很高 ,比如啟動一個程序需要依賴JVM
- 資源浪費
- 難於擴展與遷移
- 受制於硬件
2.虛擬機時代 主要解決上面硬件的問題
- 多部署 彼此獨立彼此隔離
- 資源池 共享操作系統的資源,CPU 內存 硬盤等
- 資源隔離
- 很容易擴展
- VM 需要安裝操作系統
3.容器化時代 主要解決虛擬機操作系統還要占用資源
為了解決虛擬機中 操作系統
虛擬機是物理資源層面的隔離,容器是App層面的隔離。
容器化是一種標准化的應用打包。就是把所有的數據、應用程序等一起打包給運維,運維就可以直接把包進行還原部署
作為阿里雲/騰訊雲的容器化應用
是虛擬機+容器化的實現,比如我在阿里雲買Mysql數據庫使用,這個服務器就是一台服務器,根據應用場景的不同,來安裝不同的容器。
Docker 標准化的應用
安裝docker ,虛擬機要求 Centos 7
- 安裝 yum 工具包
yum install -y yum-utils device-mapper-persistent-data | v2
- 修改安裝源,因為國內安裝很慢,使用阿里雲安裝源
- 安裝docker, 后綴是ce 代表社區版本,如果是ee代表企業版本
yum -y install | docker-ce
- 啟動docker
service docker start
啟動后查看docker版本號
docker version
會安裝客戶端上面 和服務端 下面 兩個版本
我們可以嘗試從docker 的中央倉庫中 把hello-world 這個鏡像拉取下來並運行
阿里雲Docker 鏡像加速服務
Docker 基本概念
Docker 是容器化平台
Docker Daemon 主要是鏡像的獲取,容器的創建,作為servier 主要提供服務的
Rest Api 層證明 docker 客戶端是基於Http請求的
這種CS 架構下有什么好處呢?
作為客戶端可以同時管理 上圖右面的三台機器。、
容器與鏡像
- 鏡像: 鏡像是文件,只讀的,提供了運行程序完整的硬件資源,是應用程序的集裝箱。
- 容器:是鏡像的實例,由Docker負責創建,容器之間彼此隔離
Docker 執行流程
比如我們想裝Redis,客戶端先執行Pull 命令。 Dockers_Host 中的Docker daemno 會在本地鏡像中尋找是否由redis鏡像,如果沒有,就會從遠程鏡像拉取下來。燃火本地需要執行Docker run 命令 。會根據redis 鏡像 創建一個Redis 的Container 容器。
Docker 常用命令
其中 -f 代表強制執行
Docker 宿主機 與容器通信 : 以上創建了一個tomcat 容器后不是直接能夠訪問了,因為外界是不能夠直接訪問里面容器的端口的,必須通過宿主機進行端口的映射才能訪問。
端口的映射過程
然后輸入 netstat -tulpn 查看端口號的使用情況
可以看到8000端口是監聽狀態,提供服務的程序名是docker proxy
這個程序主要是把8000端口轉發到內部8080端口的一個代理。
但上面的程序運行是阻塞狀態,如果想在后台運行需要 加一個 -d tomcat 命令可以后台運行。
容器內部結構
以tomcat舉例,其實在容器內部是有一個迷你版的tomcat的
Docker 的生命周期
Dockerfile 主要為了 構建鏡像
鏡像分層(layer) 概念
- 先創建一個臨時容器。就像一個存檔
- 再上一個臨時容器生成一個臨時快照。
- 好處就是 在上層容器 基礎上繼續做操作,節省資源,加快創建速度
Dockerfile 基礎命令
Dockerfile 執行指令
- RUN :在構建鏡像時執行命令
- ENTRYPOINT: 在容器啟動時執行命令,一定會被運行,而cmd 如果有多個只有最后一個可以運行
- CMD 也是在容器啟動時執行命令。用於設置默認執行的命令