1. 程式人生 > 實用技巧 >vue+antDesign 查詢和修改資訊中遇到的問題

vue+antDesign 查詢和修改資訊中遇到的問題

路過花鳥市場,見一可愛金魚在魚缸遨遊,欲購之;缸與魚同售20元,魚單售5元。

囊中羞澀,遂單購魚;次日,魚卒。

找到魚店老闆:你的魚有問題,帶回家就死了。

魚店老闆:不可能,在我這活蹦亂跳的,肯定是你的魚缸有問題。

這一幕似曾相識,像極了開發和運維在上線過程中的扯皮。

運維:你這個java包有問題,生產環境跑不起來。

開發:一模一樣的jar包,在我本地跑的好好的,肯定是你產線哪裡的環境配置有問題。

程式跟小金魚一樣也會“水土不服”!而導致程式水土不服的原因一般就是環境配置的差異。

有沒有一種方案能遮蔽環境的差異,包括作業系統,包括各種配置項?

既然“水土不服”,那我把程式及程式的“魚缸”都打包遷移,這個技術就是docker!

什麼是docker

Docker 是一個使用Go語言開發的開源的應用容器引擎(Docker本身並不是容器,它是建立容器的工具,是應用容器引擎),讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,可以實現更輕量級的虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

這是docker的logo,這條可愛的鯨魚就是docker,而大海就是我們的作業系統,多個集裝箱就是在docker上執行的容器。

docker三個思想

集裝箱

把作業系統,jdk,tomcat,程式碼,配置都放到鯨魚上集裝箱裡。再打包放到鯨魚上,由鯨魚給我們送到伺服器上,在我的機器上怎麼執行,在別的機器上也怎麼執行;之前我們要把程式部署到一臺新的機器上,可能會啟動不起來,比如少一些配置檔案或者少了什麼資料,有了docker的集裝箱可以保證我們的程式不管執行在哪不會缺東西。即docker解決了執行環境不一致所帶來的問題。

標準化

  • 運輸方式

docker運輸東西有一個超級碼頭(Repository),任何地方需要貨物都由docker鯨魚先送到超級碼頭(docker push),然後再由docker鯨魚從超級碼頭把貨物送到目的地去(docker pull)。

運輸標準化:docker標準化了傳輸過程,執行docker命令就可完成傳送傳輸

  • 儲存方式

以前把程式拷貝到另一臺伺服器時,指定一個目錄,我們還要記住這個目錄,因為下次我們可能還要改動東西,有了docker之後就不用,我們就不用記住程式在哪裡了,docker鯨魚會把所有集裝箱放在統一標準的一個地方。

儲存標準化:不同程式被統一儲存。

  • API介面

docker提供了一系列rest api的介面,包含了對docker容器,也就是對我們的應用的啟動、停止、檢視、刪除等等,如當我們要啟動tomcat時我們要執行startup命令,當我們要停止時要執行shutdown命令,如果不是tomcat,我們可能還需要一些別的命令控制它。有了介面標準化,只需要執行同樣的命令,就能控制所有的應用,有了docker,我們記docker的命令就可以對其進行操作。

介面標準化:執行同樣的命令控制所有的應用,用docker命令執行就好。

隔離

一臺伺服器上跑了A和B兩個程式,如果A程式死迴圈瘋狂吃CPU、或是A程式瘋狂打日誌把硬碟佔滿,又或是A程式記憶體洩漏,都會影響B程式的正常執行。

所以要把每個服務都隔離起來,讓它們只使用自己那部分有限的cpu,記憶體和磁碟,以及自己依賴的軟體包。這個早先是用虛擬機器來實現隔離的,但是每個虛擬機器都要裝自己的作業系統核心,這是對資源有點浪費。於是就有了Docker, 一個機器上可以裝十幾個到幾十個docker,他們共享作業系統核心,佔用資源少,啟動速度快,但又能提供資源(cpu, 記憶體,磁碟等)的一定程度的隔離。

docker兩個口號

第一句,是:“Build, Ship and Run”。也就是,“搭建、傳送、執行”,三板斧。

第二句,是:“Build once,Run anywhere(搭建一次,到處能用)”。

docker基本組成要素

Docker 使用的是 C/S 結構,即客戶端/伺服器體系結構。客戶端向伺服器傳送請求,伺服器負責構建、執行和分發容器。

官網給出的架構圖:

這張圖裡面概括了docker的所有的元素!我們就逐一分析docker客戶端、docker服務、倉庫、映象、容器等概念!

docker客戶端

最左邊是docker的客戶端,類似我們操作mysql的工具navcat,只不過我們這裡的是沒有圖形化介面的命令終端。docker客戶端是使用者與docker服務互動的視窗!我們能看到圖中就是各種操作的命令!

docker服務端

中間的是docker後臺執行的服務端,一個稱為docker daemon的守護程序。可以理解為我們mysql的服務,我們的操作命令都是在這部分進行處理!docker deamon監聽著客戶端的請求,並且管理著docker的映象、容器、網路、磁碟(圖中只列出了映象與容器)等物件。同樣,docker的客戶端與服務可以執行在同一機器上,也可以用某臺機器上的客戶端遠端連線另一臺機器上的docker服務,這跟我們的mysql一樣。

倉庫

倉庫(Repository)是集中存放映象檔案的場所。

倉庫(Repository)和倉庫註冊伺服器(Registry)是有區別的。倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映象,每個映象有不同的標籤(tag)。

圖中右邊部分是註冊倉庫,與Git的概念相似,可以pull遠端下載常用的映象,也可以push包到遠端倉庫(如圖中的redis、nginx等映象),同一個映象又可以有多個版本,在docker中稱為tag。

倉庫分為兩種,公有倉庫,和私有倉庫,最大的公開倉庫是docker Hub,存放了數量龐大的映象供使用者下載。

映象

官方給出的定義是:docker映象是一個只讀模板,可以用來建立docker容器。映象是一種輕量級的、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體。它包含執行某個軟體所需要的所有的內容,包括程式碼、執行時、庫、環境變數、配置檔案等。我們開發的web應用需要jdk環境、需要tomcat容器、需要linux作業系統,那我們可以把我們所需要的一切都進行打包成一個整體(包括自己開發的web應用+jdk+tomcat+centos/ubuntu+各種配置檔案)。打包後的映象在某臺機器上能執行,那它就能夠在任何裝有docker的機器上執行。

任何映象的建立會基於其他的父映象,也就是說映象是一層套一層,比如一個tomcat映象,需要執行在centos/ubuntu上,那我們的tomcat映象就會基於centos/ubuntu映象建立。

容器

官方給出的定義是:docker的容器是用映象建立的執行例項,docker可以利用容器獨立執行一個或一組應用。我們可以使用客戶端或者API控制容器的啟動、開始、停止、刪除。映象只是一個靜態的檔案,這個檔案需要執行就需要變為容器,我們可以把容器看做是一個簡易版的linux系統(包括root使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式! 就是前面看到的鯨魚背上的一個一個的集裝箱,每個集裝箱都是獨立的! 容器的定義和映象幾乎是一模一樣的,也是一堆層的統一視角, 唯一區別的是容器的最上面那一層是可讀可寫的。

另外,官方建議遵循單一原則,即一個容器只執行一個主程序(一個服務)。
多個程序都部署在一個容器中,弊端很多。比如更新某個程序的映象時,其他程序也會被迫重啟,如果一個程序出問題導致容器掛了,所有程序都將無法訪問。
容器 = 應用 + 依賴的執行環境,而不是像虛擬機器一樣,把一堆程序都部署在一起。

映象與容器關係

容器與映象的關係類似於面向物件程式設計中的物件和類,可以理解為容器就是映象的一個例項,相信大家都寫過類似下面的程式碼:

public void Dog extends Animal{  
    ......
}  
......
Dog dog = new Dog()
我們在程式碼中定義了一個Dog類,這個類就相當於一個映象,可以根據這個類new出很多的例項,new出來的例項就相當於一個個的容器。映象是靜態的檔案,而容器就是有生命的個體! Dog類可以繼承父類Animal,如果不顯式的指定繼承關係,Dog類就預設繼承Object類。同樣docker中的映象也有繼承關係,一個映象可以繼承其他的映象建立,新增新的功能!

Docker在Windows和Mac

上面說了,Docker底層用的Linux的cgroup和namespace這兩項技術來實現應用隔離,那Windows和Mac使用者能用Docker嗎?

  • 之前,Windows和Mac使用Docker實際上就是跑了一層Linux虛擬機器。
    • 比如在Windows下安裝的是Docker Toolbox,它需要Oracle Virtual Box來跑Docker
  • 現在,Windows和Mac都已經原生支援Docker了。但需要一些安裝的條件,詳情可以檢視官網
    • 比如Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V

虛擬機器和Docker

提到隔離和映象,不得不提虛擬機器,虛擬機器也能實現對應用的隔離,安裝特定的映象也能跑出我們想要的環境。

為什麼我們還需要Docker呢?

虛擬機器(vm)是一個物理硬體層抽象,用於將一臺伺服器變成多臺伺服器。每個vm都包含一整套作業系統、依賴資源(二進位制檔案和庫資源)和應用。因此佔用大量空間,vm啟動也十分緩慢。

容器(docker)是一個應用層抽象,用於將程式碼和依賴資源打包在一起。多個容器可以在同一臺機器上執行,共享作業系統與核心,但各自作為獨立的程序在使用者空間中執行。與虛擬機器相比,容器佔用的空間較少(容器映象大小通常只有幾十兆),瞬間就能完成啟動。 簡單總結docker為什麼比vm快? 1.vm需要Hypervisor實現硬體資源虛擬化,docker不需要。 2.vm需要Guest OS(來賓作業系統);docker利用的是宿主機的核心,而不需要Guest OS。

docker安裝

前提條件

1.Docker支援以下的CentOS版本:

CentOS 7 (64-bit)

CentOS 6.5 (64-bit)或更高的版本

檢視CentOS版本:

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

2.CentOS僅發行版本中的核心支援Docker。

Docker執行在CentOS 7上,要求系統為64位、系統核心版本為3.10以上。

Docker執行在CentOS-6.5或更高的版本的CentOS上,要求系統為64位、系統核心版本為2.6.32-431或者更高版本。

檢視CentOS 核心:

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64

安裝步驟(CentOS 7)

Docker 分為 CE 和 EE 兩大版本。CE 即社群版,免費支援週期 7 個月;EE 即企業版,強調安全,付費使用,支援週期 24 個月。

一般使用CE版本,按照官網:https://docs.docker.com/engine/install/centos/

1.設定docker資源庫

#安裝yum的擴充套件包(因為系統預設沒有安裝yum-config-manager命令,這個命令在yum-utils包裡)
yum install -y yum-utils
#新增docker的官方資源庫:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

psyum-config-manager命令的本質是對/etc/yum.repos.d/(庫資料的儲存位置)資料夾下檔案的增刪查改,推薦使用yum-config-manager命令進行改動
yum-config-manager –add-repo=“倉庫路徑”   --新增倉庫
yum-config-manager –disable “倉庫名"      --禁用倉庫
yum-config-manager –enable  “倉庫名”      --啟用倉庫

2.安裝最新版本的Docker Engine和容器

yum install docker-ce docker-ce-cli containerd.io

3.啟動docker

systemctl start docker

4.檢視docker程序

[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# ps -ef|grep docker|grep -v grep
root     12353     1  0 Dec09 ?        00:00:57 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
[root@iZbp1dnapcnoxqoyi0jwqaZ ~]# docker -v
Docker version 20.10.0, build 7287ab3

ps,如果要解除安裝docker的話:

#解除安裝Docker Engine,CLI和Containerd軟體包
yum remove docker-ce docker-ce-cli containerd.io
#主機上的映像,容器,卷或自定義配置檔案不會自動刪除,要刪除手動刪除
rm -rf /var/lib/docker

配置映象加速

為了提高獲取Docker官方映象的速度,在國內會使用映象加速器,一般使用阿里雲或者網易雲的。

1.需要一個阿里雲的賬戶,獲取加速器的地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

2.按照提示配置加速器

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

第一個helloworld

執行 docker run hello-world:

首先是有hello from docker!的輸出,證明docker的安裝成功並正常工作。

其次詳細解釋了整個過程中,docker依次幹了四件事:

1.Docker客戶端連線Docker守護程序

2.Docker守護程式從Docker Hub中提取hello-world映象

3.Docker守護程式從該映象建立了一個新容器,該容器執行可執行檔案,生成你當前正在讀取的輸出

4.Docker守護程式將該輸出流傳輸到Docker客戶端,該客戶端將其傳送到你的終端

這裡由於我不是第一次執行這個命令,所以沒有去遠端倉庫提取hello-world映象,因為我本地已經有這個映象了,只需要以該映象為模板生成容器例項執行即可。

run命令幹了什麼:

總結

絕大部分應用,開發者都可以通過docker build建立映象,通過docker push上傳映象;而使用者通過docker pull下載映象,用docker run執行應用。使用者不需要再去關心如何搭建環境,如何安裝,如何解決不同發行版的庫衝突——而且通常不會需要消耗更多的硬體資源,不會明顯降低效能。這就是docker的標準化、集裝箱的優勢體現。

參考:

https://www.zhihu.com/question/28300645

https://www.cnblogs.com/liuawen/p/12854029.html

https://www.zhihu.com/question/28300645/answer/719167966

https://www.cnblogs.com/venicid/p/11870260.html#auto-id-17