1.Docker基本介紹 Docker就是虛擬化的一種輕量級替代技術,基於Go語言的開源應用容器引擎。Docker的容器技術不依賴任何語言、框架或系統,可以將應用程式變成一種標準化的、可移植的、自管理的組件,並脫離伺服器硬體在任何主流系統中開發、調試和運行。 光看這個介紹還不足以知道Docker是什 ...
1.Docker基本介紹
Docker就是虛擬化的一種輕量級替代技術,基於Go語言的開源應用容器引擎。Docker的容器技術不依賴任何語言、框架或系統,可以將應用程式變成一種標準化的、可移植的、自管理的組件,並脫離伺服器硬體在任何主流系統中開發、調試和運行。
光看這個介紹還不足以知道Docker是什麼,能做什麼,多半一頭霧水,我第一眼看到這些介紹時也是一樣的感受,其實我們可以這樣理解,相信很多人應該都用過虛擬機,虛擬機就是一個獨立的完整電腦, 我們暫且先將Docker理解為縮小或者閹割版的虛擬機,它具有啟動速度快、資源利用率高、性能開銷小這些特點。
這樣做是為了在我們的思維認知中先建立一個簡單概念,因為使用已知的事物去類比學習未知的東西理解起來更快一些,當然Docker!=虛擬機
,因為虛擬機是在os Hypervisor
之上做的擴展,而Docker相當於是直接在os層面上的擴展,共用內核,只是在某些抽象層面相同而已,例如它們都是可以作為容器。可以承載應用程式,至於對它們具體的認識和細節,在下麵會做介紹
2.虛擬機 Docker對比
上邊這張圖如果有過瞭解的應該知道,左邊是虛擬機的架構,右邊是Docker的架構,我們來簡單分析下圖中看到的的內容
1.我們可以看到無論是Docker還是虛擬機都有一個相同點,它們最上層承載的是我們的應用程式。
2.它們的底層是OS內核,應用程式和依賴對每一個虛擬機是獨立的,而Docker那邊應用程式和依賴是同一個Docekr Engine
3.虛擬機架構層數多一些,
應用程式
>虛擬機
>Hypervisor
>os
,Docker架構層少一些,應用程式
>Docker Engine
>os
1.一個小故事
老闆讓你在虛擬機上安裝RabbitMQ和Redis
,你的做法就是需要下載安裝包,然後安裝,這時2個應用的所有依賴都在虛擬機上,類似一個大盒子中放了2樣東西。
有一天虛擬機突然出問題了,你搞了一晚上檢查發現同時安裝了RabbitMQ和Redis
的機器會有衝突,導致不能正常運行,為了隔離環境依賴和衝突,你跟老闆說需要把他們分開安裝,然後你老老實實的再安裝了一臺虛擬機,分別裝RabbitMQ和Redis
。問題解決了,老闆之誇你幹得好。
一段時間後老闆又跟你說公司規模擴大,別的開發小組也要獨立的RabbitMQ和一個Redis伺服器,我們現在一個RabbitMQ和一個Redis肯定不行,讓你多裝幾台,老闆又買了10台虛擬機,並且給你一周時間搞定這個事情,為了快速複製應用和環境,你選擇將已經安裝了的2個虛擬機操作系統做了鏡像,直接給其他虛擬機安裝時選擇這個鏡像,避免了每一臺虛擬機都親自去安裝軟體配置環境,不到2天你搞完了,為摸魚留下了5天寶貴時間。
後面你用摸魚的時間學習了Docker,知道了它們的優點,你選擇嘗試在Docker上安裝RabbitMQ和Redis
,發現只需要在DockerHub上拉取他們各自的鏡像,然後根據鏡像創建容器運行就好了,想多搞幾個,就根據鏡像直接多運行幾個實例就好了,非常簡單快捷,之前需要2天時間搭建的,一上午就搞完了,不禁感嘆這才是為了摸魚留下了充足且寶貴的時間。
2.虛擬機和Docker
我們思考上面使用虛擬機存在的問題,它有自己獨立的桌面,操作系統,然後可以在操作系統中,安裝軟體運行應用。每一個虛擬機都如此,10台虛擬機,就有10個獨立的桌面,以及10個獨立的操作系統,為了隔離環境裝一個軟體,就搞一個虛擬機,為了快速複製遷移就鏡像一整個系統,這是不是太浪費了一點,並且每台機器的資源根本就沒有完全利用。
Docker就不同了,他不需要安裝操作系統、桌面這些,只需要安裝Docker就好了,要想運行應用,只需要一個鏡像,Docker就可以創建一個容器,然後通過容器去承載應用,而且每一個容器中運行的實例都是獨立的,他們之間沒有關係,也不會影響。類似一個大盒子中放了2個完全獨立的小盒子,一個盒子裝RabbitMQ,一個盒子裝Redis,他們的依賴在各自的容器中獨立,不會衝突,那些環境衝突之類的事情,再也不用操心了,並且大大的節省了資源和成本。
說了這麼多,總結一下其實Docker就是一種可以讓應用和依賴獨立起來,高效而且能快速複製的解決方案,Docker中的容器更像是為應用提供了一個隔離的運行環境,而Docker引擎就是為了承載容器的,各個容器共用Docker引擎 我們看圖中
Docker 是一個Client/Server模式應用 ,就是圖中在水裡的鯨魚船,這個傳能裝很多集裝箱,反推虛擬機就是很多條船,上面只裝一個集裝箱。
Docke容器就是船上的集裝箱,集裝箱中裝的是應用程式和運行環境,不同容器只裝一個程式,還有一個個集裝箱可以快速移植和複製
Docker鏡像就是類似集裝箱的模型,可以根據模型快速製造一個集裝箱,換句話說容器就是鏡像的實例,用面向對象解釋(鏡像=類),(容器= new 鏡像)
3.物理機、虛擬機、Docker對比
我們依然還是使用圖片來闡述他們之間的關係,在網上看到一幅圖很多人用,可以說這時目前很生動形象的比喻了,所以我也借用了
1.物理機就是圖1中的別墅,獨立地基上,獨立的花園,獨立的房子,獨立的洗手間,一臺物理機可以虛擬化出很多的虛擬機
2.虛擬機對應圖2中的每一套商品房,共用一個地基,花園,獨立的房子
,獨立的洗手間
3.Docker對應圖3中的隔斷間
每一間住著一個租戶,租房的應該明白,共用一個地基,花園,房子、洗手間 ,空間越來越小,資源和成本利用最大化,符合發展趨勢
4.部署Docker和應用
Linux中安裝Docker並且部署程式等操作,單獨有個筆記,按照操作來,比較簡單。可以看看這裡,主要介紹了
1.Docker 部署掛載Net Core程式
2.Dockerfile 部署Net Core程式
3.Docker 部署Nginx
4.Docker 部署Redis
如果你沒有使用過Docker,但是想學習它,並且能做一個簡單的Demo應用,那建議一定要按照其中的步驟來完整操作一遍
,如果有遇到什麼問題,可以留言一起討論。
5.Docker管理
1.基本介紹
隨著Docker 的發展及其容器技術的優點,使得它在現代互聯網中得到大量的應用,相信小伙伴們除了聽到它的名字之外,肯定對K8S
的 這個名詞也不陌生吧,在我不瞭解的時候,聽到這個就覺得很牛,後面瞭解了之後,知道了K8S全稱 Kubernetes,是Google開發的一款基於容器的集群管理平臺,說白了就是Docker的管理工具
而已。
除了K8S之外,Docker還有很多其他的管理工具,例如Docker Machine、Docker Swarm以及Docker Compose只是它們和K8S應對的場景有略微的不同,但是都是對Docker進行管理的工具,Docker Machine現在基本已經淘汰了,Docker Swarm和K8S的角色定位都是Docker 的集群管理工具,作用差不多,但是現在以及被K8S所替代了,對於K8S後面會專門的進行學習。
目前就簡單的學習一下Docker Compose,Compose 是用於定義和運行多容器 Docker 應用程式的工具,類似像一個容器的管家,想象一下當你的Docker中有成百上千的容器需要啟動,如果一個一個的啟動那得多費時間。有了Docker-Compose
只需要編寫一個文件,在這個文件裡面聲明好要啟動的容器,配置一些參數,執行一下這個文件,Docker
就會按照你聲明的配置去把所有的容器啟動起來,
有點像Windows系統的bat
批處理文件,例如我要開啟3個 視窗,我就在一個批處理中寫3個start命令,一次執行就好了。但是Docker-Compose只能管理當前主機上的Docker,不能去啟動其他主機上的Docker容器,只是單實例的操作。
2.安裝Docker Compose
通過 Compose,可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服務。
1.下載 Docker Compose 然後授權,並且使用docker-compose
命令來查看幫助信息
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.Docker Compose常用命令
docker-compose
docker-compose version
docker-compose up
3.配置docker-compose.yml對應文件
version: '3.3'
services:
service1:
build:
context: /apppath/app
image: apinet5
ports:
- 8081:80/tcp
service2:
image: apinet5
ports:
- 8082:80/tcp
command: ["dotnet", "/app/FileSharding.dll"]
nginx:
image: nginx:latest
ports:
- 8086:80/tcp
volumes:
- /apppath/nginx/nginx.conf:/etc/nginx/nginx.conf
redis:
image: redis
ports:
- 8085:6380/tcp
volumes:
- /apppath/redis/redis.conf:/usr/local/etc/redis/redis.conf
- /apppath/redis/data:/data:rw
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
version: | 版本,指定yml依從的 compose 哪個版本制定的 |
---|---|
services: | 相當於一個集合,包裹下麵所有的內容 |
build: | 指定為構建鏡像的上下文路徑,在上面代表從/apppath/app/FileSharding下麵構建鏡像,名稱為netapi5 |
image: | 鏡像名稱 |
ports: | 設置埠和Docker映射 |
command: | 執行的命令 |
volumes: | 使用目錄掛載 |
4.幹掉在運行的所有容器,然後執行compose命令運行容器
#刪除所有已有容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
#在docker-compose.yml所在目錄下執行命令創建容器運行
docker-compose -up -d
小結
到目前為止,我們對Docker也有了簡單的認識,歸根結底的細分Docker就是一個運維工具,也不是一個非常高深的技術,而且在一般正規公司都是專門的運維來操作,個人認為作為開發只要會使用就好了