1. 程式人生 > 程式設計 >Ajax 的初步實現(使用vscode+node.js+express框架)

Ajax 的初步實現(使用vscode+node.js+express框架)

前言

Docker系列文章:

此篇是Docker系列的第四篇,大家一定要按照我做的Demo都手敲一遍,印象會更加深刻的,加油!

為什麼需要容器資料卷

  • 資料的持久化,假設MySQL的資料儲存在自身的映象當中,如果將映象刪除的話,儲存的資料就會丟失,這樣真的就是刪庫跑路了,因此需要將容器中的資料持久化到磁碟上去;
  • 如果將資料儲存於映象中,主機上的其他程序不方便訪問這些資料;

資料卷持久化的三種方式比較

bind mount

存在於主機系統中的任意位置,非 Docker 的程序或者 Docker 容器可能隨時對其進行修改,存在潛在的安全風險。bind mount在不同的宿主機系統時不可移植的,比如Windows和Linux的目錄結構是不一樣的,bind mount所指向的host目錄也不能一樣。

volume

存於主機檔案系統中的某個區域,由Docker管理檔案目錄(/var/lib/docker/volumes/)。非Docker程序不應該修改這些資料。卷是Docker中持久化資料的最好方式;

tmpfs mount

存於記憶體中,並不是持久化到磁碟。在容器的生命週期中,可以被容器用來存放非持久化的狀態或敏感資訊;

資料卷使用

bind mount

在使用bind mount可以使用-v或者--volume,這個引數在單容器的情況下使用,在swarm叢集中使用--mount,從 Docker 17.06 之後,可以統一使用引數--mount。對於新接觸 Docker的來說建議使用--mount,老司機可以繼續使用-v,但是還是建議使用--mount。

語法

-v語法

分為三部分,使用冒號進行分割,排列的順序不能發生變化,每個欄位所表達的含是不同的;

  • 對映到宿主機檔案的目錄的地址;
  • 掛載到容器上的檔案目錄的地址;
  • 可選欄位,用來增加附加專案,比如ro,rw等等;

--mount語法

由一組鍵值對組成,用逗號進行分割;


兩者差別:
使用-v的時候,如果在 Docker Host 不存在要掛載的檔案或者目錄,Docker 將會自動進行建立,通常是一個目錄;
使用--mount的時候,如果在 Docker Host 不存在要掛載的檔案或者目錄,Docker 不會自動建立目錄,並生成一個錯誤;
使用案例

我們使用Nginx來講解該案例;

  1. 後臺方式啟動一個版本為nginx:latest名字叫nginxvolumetest的容器,將容器內埠對映到宿主機9999埠,將宿主機~/Documents/app/docker對映到容器的/usr/share/nginx/html/下面;
dockerrun-d-it--namenginxvolumetest-p9999:80-v~/Documents/app/docker:/usr/share/nginx/html/nginx:latest
  1. 檢查掛載目錄;
dockerinspectnginxvolumetest
  1. 進入宿主機對應的目錄,在宿主機對應的目錄下建立index.html,編輯檔案,寫入hello,dcoker bind mount!;
#進入宿主機對應的目錄
~/Documents/app/docker
#宿主機在docker目錄下建立index.html
touchindex.html
#編輯檔案
vimindex.html
#插入
hello,dcokerbindmount!
  1. 進入容器內部,建立test.java檔案,檢查是否同步過來index.html;
#檢視映象ID
dcokerps
#進入容器內部
dockerexec-ite240f6b77437/bin/bash
#進入對應的目錄
cd/usr/share/nginx/html/
#在對應目錄下建立test.java檔案
touchtest.java
#檢視對應目錄下的檔案
ls
  1. 檢視宿主機對應下的目錄檔案;
  2. 在瀏覽器中訪問http://localhost:9999/;
  3. 刪除對應的docker容器;
dockerstope240f6b77437
dockerrme240f6b77437

-mount使用

#後臺方式啟動一個名字叫nginxmounttest的容器
#將容器內埠對映到宿主機9999埠
#將宿主機~/Documents/app/docker對映到/usr/share/nginx/html/
#版本為nginx:latest
dockerrun-d-it--namenginxmounttest-p9999:80--mounttype=bind,source=/Users/wangtongzhou/Documents/app/docker,target=/usr/share/nginx/html/nginx:latest
#進入容器內部
dockerexec-it7053db43219f/bin/bash
#檢視檔案內容
ls

從整個案例中我們看出本地的宿主機檔案和docker內部檔案是可以相互同步的,刪除掉容器以後也不會影響到本地宿主機檔案的內容。

只讀掛載

  1. 刪除之前容器;
dockerstop7053db43219f
dockerrm7053db43219f
  1. 後臺方式啟動版本為nginx:latest一個名字叫nginxmounttest的容器,將容器內埠對映到宿主機9999埠,將宿主機~/Documents/app/docker對映到容器的/usr/share/nginx/html/目錄下,並且設定為只讀;
dockerrun-d-it--namenginxmounttest-p9999:80--mounttype=bind,source=/Users/wangtongzhou/Documents/app/docker,target=/usr/share/nginx/html/,readonlynginx:latest
#或者-v
dockerrun-d-it--namenginxvolumetest-p9999:80-v~/Documents/app/docker:/usr/share/nginx/html/:ronginx:latest
  1. 查詢掛載詳情;
dockerinspectnginxmounttest
  1. 進入容器,建立aaa.java檔案
touchaaa.java

readonly設定了只讀許可權,在容器中是無法對bind mount資料進行修改的。只有宿主機可以進行資料修改。

volume

volume由Docker來進行管理,比如volume的建立,可以使用命令 docker volume create 來建立一個 volume,當容器或者服務建立的時候,Docker 也可以自動的建立一個 volume。
當我們建立了一個volume,它儲存在Docker宿主機的儲存目錄上。當把volume掛載入容器時,此目錄就會同步掛載到容器中的目錄。與bind mount同步方式一樣,不同的是volume是由Docker來管理並且和Docker Host的核心功能進行隔離。
一個給定的volume可以同時掛載到多個容器中。我們在掛載volume時,可以進行命名,叫做具名掛載,也可以是預設隨機生成的名字,叫做匿名掛載。當不指定名稱的時候,Docker會用一個隨機字串對其進行命名,這樣可以保證 volume的唯一性。
此外volume支援使用 volume drivers,允許將資料儲存掛載到遠端主機上。

語法

-v語法

與bind mount語法類似,在不指定主機地址的時候,就是採用volume的方式進行掛載,分為三部分:

  1. 指定卷的名稱;
  2. 容器指定的掛載卷的地址;
  3. 可選欄位,用來增加附加專案,比如ro,rw等等;

--mount語法

與bind mount語法類似,使用逗號分隔:

使用案例
  1. 建立名叫test卷;
dockervolumetest
  1. 進入test卷的_data目錄該目錄下無檔案內容;
cd/var/lib/docker/volumes/test/_data
  1. 後臺方式啟動一個版本為nginx:latest名字叫nginxvolumetest的容器,將容器內埠對映到宿主機9999埠,source指定本地卷名稱,target指定容器中的掛載的地址;
dockerrun-d-it-p9999:80--namenginxvolumetest--mountsource=test,target=/usr/share/nginx/htmlnginx:latest
#或者-v命令
dockerrun-d-it-p9999:80--namenginxvolumetest-vtest:/usr/share/nginx/htmlnginx:latest
  1. 檢視容器的掛載詳情;
dockerinspectnginxvolumetest
  1. 訪問localhost:9999;
  2. 再次進入進入test卷的_data目錄 會發現檔案內容;
cd/var/lib/docker/volumes/test/_data
  1. 在volume的檔案中建立a.html;
toucha.html
  1. 進入到容器中 檢視掛載目錄中的檔案;
dockerps
dockerexec-itf24efa9063bcbash
ls
  1. 刪除容器 會發現卷中的內容還存在;
dockerstopf24efa9063bc
dockerrmf24efa9063bc

tmpfs

tmpfs不在磁碟上持久儲存,也不在 Docker Host 容器裡面儲存,他儲存在host的記憶體中,它可以在容器的整個生命週期內被容器所使用。

語法

在單容器的情況下使用--tmpfs,並且不能指定引數,在叢集的情況下使用--mount,可以指定一些引數;

使用

後臺方式啟動一個版本為nginx:latest名字叫nginxtmptest的容器,將容器內埠對映到宿主機9999埠,採用tmpfs使用卷,target指定容器中的掛載的地址;

dockerrun-d-it-p9999:80--namenginxtmptest--mounttype=tmpfs,target=/usr/share/nginx/htmlnginx:latest

使用場景

bind mount
  1. 宿主機中的配置檔案、開發環境、程式碼需要共享給宿主機上面的容器;
volume
  1. 多個正在執行的容器之間共享資料場景;
  2. 容器的資料永久儲存在一個遠端主機或者一個雲伺服器上;
  3. 當我們需要備份資料,或者恢復資料,或者需要把資料從一個宿主機遷移到另外一個宿主機的時候,我們可以將正在使用volume的容器停止下來,然後把volume的目錄備份下來就可以了;
tmpfs

不需要將持久化的資料保留在宿主機或容器內使用tmpfs;

資料卷容器

如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。資料卷容器也是一個容器,但是它的目的是專門提供資料卷給其他容器掛載。複製卷始終具有相同的掛載點,資料卷的生命週期一直持續到沒有容器使用它為止,類似於繼承關係。

  1. 守護程序方式啟動一個名字叫centos01共享目錄為/data1版本為centos最近一個版本的容器;
dockerrun-d-it--namecentos01-v/data1centos:latest
  1. 進入centos01容器內部;
#檢視下容器id
dockerps
#進入容器內部
dockerexec-itec09d368858f/bin/bash
  1. 進入目錄data1,建立檔案;
#檢視檔案目錄
ls
#進入目錄data1
cddata1
#建立檔案
touchdata01.txt
  1. 守護程序的方式啟動一個名字為centos02共享容器資料卷centos01版本為centos最近一個版本的容器;
dockerrun-d-it--namecentos02--volumes-fromcentos01centos:latest
  1. 進入centos02容器內部,檢查檔案目錄是否存在data01.txt檔案;
#進入容器內部
dockerexec-itec09d368858f/bin/bash
#進入data1
cddata1
#ls檢視檔案目錄發現存在data01.txt檔案
ls
  1. 進入centos02容器內部data1目錄,在對應目錄下建立data02.txt;
#在對應目錄下建立data02.txt
touchdata02.txt
  1. 再次進入centos01的容器進入data1目錄,會發現data02.txt檔案已經同步過來了;
cddata1
ls

總結

Docker將資料持久化的方式:

  1. docker cp命令將容器中的資料拷貝到宿主機上;
  2. 資料卷技術docker volume將容器內的資料對映到宿主機上;
  3. 資料卷容器docker --vlolumes-from使用特定的容器的資料卷,多個容器之間進行容器資料同步;

結束

歡迎大家點點關注,點點贊 !