在軟體開發中,最麻煩的事情之一就是環境設定。在正常情況下,如果要保證程式能執行,我們需要設定好作業系統,以及各種庫和元件的安裝。
舉例來說,要執行一個Python程式,計算機必須要有 Python 引擎,還需要安裝好程式的各種依賴,甚至還要設定特定的環境變數。假設你有兩個程式都需要部署在同一個伺服器上,一個需要軟體是基於Python2.0,一個是Python3.0,那麼在部署上就很容易造成混亂。因為不同版本的Python模組可能互不相容,況且不同開發環境上的庫也需要額外的設定。如果要部署很多程式,而開發環境和部署環境各不相同的話,可想而知設定得多麼麻煩。
為了更好地將軟體從一個環境移植到另一個環境上,必須從根源上解決問題,那麼如何在移植軟體的時候,將一模一樣的原始環境遷移過來呢?
虛擬機器器是移植環境的一種解決方案。虛擬機器器本質上也是一個軟體,在這個軟體中,我們可以執行另一種作業系統。比如我們想要在 MacOS 上執行 Linux 系統,我們就在電腦上安裝 Linux 映象,並使用虛擬機器器開啟此映象,就能建立出一個鏡中鏡了。這個方案非常方便,想要新環境,就安裝映象,然後使用虛擬機器器開啟,不想要直接刪除。但是這個方案有幾個缺點:
佔用資源多:虛擬機器器需要安裝整個作業系統,自然會消耗大量記憶體和硬碟空間。如我們只需要執行1MB的軟體,有時候也不得不安裝幾個G的環境才能執行。
執行步驟冗餘:虛擬機器器安裝的是完整的系統,每次執行程式都需要按部就班,開啟系統、登入使用者等等之類麻煩的步驟,很不方便。
執行速度慢:為了執行特定環境中的軟體,虛擬機器器必須先執行系統,而系統佔用的資源往往很多(網路,GUI,IO等等),自然也會影響執行速度。
在實際的生產環境中,虛擬化技術主要用來解決高效能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體 對資源充分利用
虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機器器等等。
虛擬化技術:VMware、VirtualBox、阿里雲伺服器、docker 虛擬化技術
名詞解釋:
kvm,VMware:kvm:Kernel-based Virtual Machine,linux上虛擬化的技術,把一臺機器虛擬化成多臺
openstack:python寫的,建立,管理,銷燬 虛擬機器器的管理工具,web管理介面,點點點就能建立,刪除虛擬機器器
kvm+openstack的方案:公司多臺伺服器,openstack是管理虛擬機器器的工具
docker:容器技術
k8s:kubernetes,kubernetes是管理container(docker)的工具
公司主流:k8s+docker、kvm+k8s+docke
功能上:kubernetes是管理container的工具,openstack是管理VM的工具。
業務上:openStack是定位於laaS平臺的專案,Kubernetes是定位於PaaS平臺的專案
時間上:雲平臺方案的第一階段:虛擬機器器;雲平臺方案的第二階段:容器技術;
虛擬機器器需要虛擬化出作業系統:笨重,資源消耗大
容器:輕量級,資源消耗小
'''一 IaaS基礎設施服務'''
IaaS: Infrastructure-as-a-Service(基礎設施即服務)
第一層叫做IaaS,有時候也叫做Hardware-as-a-Service,幾年前如果你想在辦公室或者公司的網站上執行一些企業應用,你需要去買伺服器,或者別的高昂的硬體來控制本地應用,讓你的業務執行起來。
但是現在有IaaS,你可以將硬體外包到別的地方去。IaaS公司會提供場外伺服器,儲存和網路硬體,你可以租用。節省了維護成本和辦公場地,公司可以在任何時候利用這些硬體來執行其應用。
一些大的IaaS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.
'''二 paas平臺即服務'''
第二層就是所謂的PaaS,某些時候也叫做中介軟體。你公司所有的開發都可以在這一層進行,節省了時間和資源。
PaaS公司在網上提供各種開發和分發應用的解決方案,比如虛擬伺服器和作業系統。這節省了你在硬體上的費用,也讓分散的工作室之間的合作變得更加容易。網頁應用管理,應用設計,應用虛擬主機,儲存,安全以及應用開發共同作業工具等。
一些大的PaaS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近興起的公司有AppFog, Mendix 和 Standing Cloud
不僅賣伺服器,還賣軟體
OSS物件儲存,阿里雲mysql服務,阿里雲的redis
'''三saas軟體即服務'''
第三層也就是所謂SaaS。這一層是和你的生活每天接觸的一層,大多是通過網頁瀏覽器來接入。任何一個遠端伺服器上的應用都可以通過網路來執行,就是SaaS了。
你消費的服務完全是從網頁如Netflix, MOG, Google Apps, Box.net, Dropbox或者蘋果的iCloud那裡進入這些分類。儘管這些網頁服務是用作商務和娛樂或者兩者都有,但這也算是雲技術的一部分。
一些用作商務的SaaS應用包括Citrix的GoToMeeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors
多租戶
社保局:社保軟體
'''四FAAS函數及服務'''
Serverless:無服務
為了解決虛擬機器器存在的這些缺點,Linux發展出了另一種虛擬化的技術:Linux容器。Linux 容器不是模擬一個完整的作業系統,而是對程序進行隔離。或者說,就是在正常程序的外面套用了一個保護層。對於容器裡面的程序來說,它接觸到的各種資源都是虛擬的,從而實現與底層程式的隔離。由於容器是程序級別的,相比虛擬機器器有更多優勢:
Docker屬於Linux容器的一種封裝,提供簡單易用的容器使用介面,它也是目前最流行的Linux容器解決方案。Docker 將軟體程式碼和其依賴,全打包在一個檔案中。執行單個檔案,就會生成虛擬容器。在這個虛擬容器中,不管原生的作業系統是如何的不同,此容器都能照常執行。
簡而言之,Docker的介面非常簡單,可以幫助使用者更好地建立和使用容器,讓相同的程式碼在不同的環境上正常執行。
Docker是一個使用者端-伺服器(c/s)架構程式,Docker使用者端只需要向Docker伺服器或者守護行程發出請求,伺服器或者守護行程將完成所有工作並返回結果,Docker提供了一個命令列工具Docker以及一整套RESTful API,你可以在同一臺宿主機上執行Docker守護行程和使用者端,也可以從原生的Docker使用者端連線到執行在另一臺宿主機上的遠端Docker守護行程
映象是構建Docker的基石。使用者基於映象來執行自己的容器。映象也是Docker生命週期中的「構建」部分。映象是基於聯合檔案系統的一種層式結構,由一系列指令一步一步構建出來。
Docker可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,映象是Docker生命週期中的構建或者打包階段,而容器則是啟動或者執行階段。 容器基於映象啟動,一旦容器啟動完成後,我們就可以登入到容器中安裝自己需要的軟體或者服務。
Docker用Registry來儲存使用者構建的映象。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。使用者可以在Docker Hub註冊賬號,分享並儲存自己的映象(說明:在Docker Hub下載映象巨慢,可以自己構建私有的Registry)。
使用者端cli
伺服器端 server
Images:映象
containers:容器 (想象成一個作業系統執行了一個軟體)
networks:網路
Volumes:資料卷,檔案
Registry:遠端倉庫
倉庫裡放了許多映象
# docker 可以安裝在各個作業系統之上
centos 7.5
win10 以上可以
mac
最好,在虛擬機器器的centos上安裝
# 版本介紹
Docker-CE指的是Docker社群版,由社群維護和提供技術支援,為免費版本,適合個人開發人員和小團隊使用
Docker-EE指Docker企業版,由售後團隊和技術團隊提供支援,專為企業開發和IT團隊設計
# 解除安裝
停止服務:systemctl stop docker
# 安裝
- 安裝一些依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 把yum源設定為阿里雲
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安裝docker
sudo yum install docker-ce
- 檢視docker版本
docker -v # Docker version 20.10.22, build 3a2c30b
# 設定國內映象站:倉庫在國外,下載映象很慢,設定國內映象站
- 阿里雲:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- mkdir /etc/docker
- vim /etc/docker/daemon.json
寫入:
{
"registry-mirrors": ["https://moxywhnb.mirror.aliyuncs.com"]
}
重啟:
- sudo systemctl daemon-reload
- sudo systemctl restart docker
# docker 命令
# 啟動docker:
systemctl start docker
#停止docker:
systemctl stop docker
#重啟docker:
systemctl restart docker
#檢視docker狀態:
systemctl status docker
#開機啟動:
systemctl enable docker
#檢視docker概要資訊
docker info # docker使用者端,伺服器端的概要資訊
# 搜尋映象
-docker search 映象名字
直接取網站搜尋
# 從遠端倉庫拉去的檔案
-docker pull centos:centos7.9.2009
-docker pull python:3.8-slim
-docke pull redis # 最新版
-docker pull mysql:5.7
# 檢視本地映象
-docker images
# 刪除映象
-docker rmi 映象id
# 一次性刪除所有映象
-docker rmi `docker images -q`
# 一次性刪除所有容器
-docker rm `docker ps -aq`
# 自己製作一個映象,想傳到自己的倉庫裡
把原生的映象打個標籤
docker tag 映象id 賬戶名/XXXX
docker login 輸入使用者民密碼
docker push 賬戶名/XXXX
映象是一堆檔案,方便快速上傳到遠端倉庫,原來已經分了好多層,只需要掛載上去就好了,還有快速的下載,下載的時候只需要下載新的層就好了
映象上傳到遠端倉庫
從遠端倉庫下載映象
做加速
只要在容器中新增了檔案,就會多一層
# 1 基於映象執行成容器
-建立容器,執行容器
# -it和-id區別 :it進入到容器內部 ,id以守護行程執行容器,不進入
# --name=名字 不寫會隨機
# centos:7 映象的名字和tag
# -p 3307:3306 把宿主機的3307埠對映到容器的3306埠,以後存取宿主機的3307,就等於存取容器的3306
# -v /root/lqz:/home 把宿主機的/root/lqz對映到容器的 /home ,以後再宿主機或容器內修改這個資料夾,都會相互影響
# 在容器內部,退出來:exit ---》只要退出,容器也退出了
-docker run -it --name=centos centos:7 # 基於centos:7映象 建立並執行容器,進入到容器中,名字為centos
# 2 檢視正在執行的容器
docker ps
# 3 檢視所有容器
docker ps -a
# 4 在容器上執行命令
docker exec 容器id ls
docker exec 12a6a0281168 ls
docker exec -it 12a6a0281168 /bin/bash
# 5 停止容器
docker stop 容器id
# 6 執行容器
docker start 容器id
# 7 刪除
docker rm 容器id # 正在執行的容器不能刪
# 8 對映從容器裡面zxr資料夾對映到宿主機裡面的homme資料夾
docker run -id --name=centos3 -v /root/zxr:/home centos:7
# 8 檔案拷貝
-把宿主機檔案cp到容器內部
docker cp 宿主機檔案 容器id:容器路徑
-把容器內部檔案cp到宿主機
docker cp 容器id:路徑/檔案 /root/ss.py
# 9 檢視容器資訊
docker inspect 容器id
docker inspect --format='{{.NetworkSettings.IPAddress}} 容器id # 檢視ip地址