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 MachineDocker 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 //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就是一個運維工具,也不是一個非常高深的技術,而且在一般正規公司都是專門的運維來操作,個人認為作為開發只要會使用就好了