[TOC]
# 數據卷與目錄
~~~
docker run -itd --name 【容器的名字】 -v 【宿主機目錄】:【容器目錄】 【依賴鏡像】【命令可選】
docker run -itd --name tmp-nginx -v /home/abc/tmp/:/tmp-text nginx
~~~
# 數據卷與文件
~~~
docker run -itd --name 【容器的名字】 -v 【宿主機文件】:【容器文件】 【依賴鏡像】【命令可選】
docker run -itd --name tmp-txt -v /home/abc/tmp/hello.go:/nihao/nihao.sh nginx
~~~
# 創建1個數據卷容器
格式 :
~~~
docker create -v 【容器數據卷目錄】 --name 【容器名稱】 【依賴的鏡像名稱 】 【命令可選】
docker create -v /data-tmp --name v-tmp nginx
~~~
# 創建兩個容器掛載同一個數據卷容器進行交互
格式:
~~~
docker run --volumes-from【數據卷容器的id或名字】-itd --name 【容器名字】 【鏡像名字】【參數可選]
docker run --volumes-from v-tmp -itd --name tmp01 nginx docker run --volumes-from v-tmp -itd --name tmp02 nginx
~~~
# 數據卷容器
需要在多個容器之間共享一些持續更新的數據,最簡單的方式就是使用數據卷容器.數據卷容器也是一個容器,但是他的目的是專門用來提供數據卷供其他容器掛載
數據卷容器:使用特定容器維護數據卷
如果使用數據卷容器,在多個容器之間共享數據,并永久保存這些數據,需要有一個規范流程才能做到
1. 創建數據卷容器
2. 其他容器掛載數據卷容器
注意: 數據卷容器自身并不需要啟動,但是啟動的時候依然可以進行數據卷容器的工作
## 創建一個數據卷容器
創建兩個容器,同時掛載數據卷容器
~~~
#命令格式:
docker create -v [容器數據卷目錄] --name [容器名字][鏡像名稱] [命令(可選)]
#執行效果
$ docker create -v /data --name v1-test1 nginx
~~~
## 創建兩個容器,同時掛載數據卷容器
~~~
#命令格式:
docker run --volumes-from [數據卷容器id/name] -tid --name [容器名字][鏡像名稱] [命令(可 選)]
#執行效果:
#創建 vc-test1 容器:
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash
#創建 vc-test2 容器:
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash
~~~
## 確認卷容器共享
~~~
#進入vc-test1,操作數據卷容器:
:~$ docker exec -it vc-test1 /bin/bash root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt root@c408f4f14786:/# exit
#進入vc-test2,確認數據卷:
:~$ docker exec -it vc-test2 /bin/bash root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# exit
#回到vc-test1進行驗證
:~$ docker exec -it vc-test1 /bin/bash root@c408f4f14786:/# ls /data/
v-test1.txt v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2
~~~
# 數據備份原理
為什么需要數據備份和恢復? 工作中很多的容器的數據需要查看,所有需要備份將數據很輕松的拿到本地目錄

數據備份方案:
1. 創建一個掛載數據卷容器的容器
2. 掛載宿主機本地目錄作為備份數據卷
3. 將數據卷容器的內容備份到宿主機本地目錄掛載的數據卷中 4 完成備份操作后銷毀剛創建的容器
## 數據備份實踐
在2.3.4的數據卷容器基礎上做數據的備份
~~~
#命令格式:
$ docker run --rm --volumes-from [數據卷容器id/name] -v [宿主機目錄]:[容器目錄][鏡像名稱] [備份命令]
#命令演示:
#創建備份目錄:
$ mkdir /backup/
#創建備份的容器:
$ docker run --rm --volumes-from 60205766d61a -v /home/itcast/backup/:/backup/ nginx tar zcPf /backup/data.tar.gz /data
#驗證操作:
$ ls /backup
$ zcat /backup/data.tar.gz
~~~
注釋: -P:使用原文件的原來屬性(屬性不會依據使用者而變),恢復字段到它們的原始方式,忽略現有的用戶權 限屏蔽位(umask)。 加了\-p之后,tar進行解壓后,生成的文件的權限,是直接取自tar包里面文件的權限(不會再 使用該用戶的umask值進行運算),那么不加\-p參數,將還要再減去umask的值(位運算的減),但是如果使用 root用戶進行操作,加不加\-p參數都一樣。
# 數據還原

1. 創建一個新的數據卷容器(或刪除原數據卷容器的內容)
2. 創建一個新容器,掛載數據卷容器,同時掛載本地的備份目錄作為數據卷
3. 將要恢復的數據解壓到容器中
4. 完成還原操作后銷毀剛創建的容器
## 數據還原實踐
~~~
#命令格式:
docker run --rm -itd --volumes-from [數據要到恢復的容器] -v [宿主機備份目錄]:[容器備份目錄] [鏡像名稱] [解壓命令]
#命令實踐:
#啟動數據卷容器
$ docker start c408f4f14786
#刪除源容器內容:
$ docker exec -it vc-test1 bash root@c408f4f14786:/# rm -rf /data/*
#恢復數據:
docker run --rm --volumes-from v-test -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /data
#驗證:
:~$ docker exec -it vc-test1/bin/bash root@c408f4f14786:/# ls /data/data/ v-test1.txt v-test2.txt
#新建新的數據卷容器:
:~$ docker create -v /newdata --name v-test2 nginx
#簡歷新的容器掛載數據卷容器
:~$ docker run --volumes-from a7e9a33f3acb -tid --name vc-test3 nginx /bin/bash #恢復數據:
docker run --rm --volumes-from v-test2 -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /newdata
#驗證:
:~$ docker exec -it vc-test3 /bin/bash
root@c408f4f14786:/# ls /newdata
v-test1.txt v-test2.txt
~~~
注意: 解壓的時候,如果使用目錄的話,一定要在解壓的時候使用 \-C 制定掛載的數據卷容器,不然的話容器數據 是無法恢復的,因為容器中默認的backup目錄不是數據卷,即使解壓后,也看不到文件。
數據是最寶貴的資源,docker在設計上考慮到了這點,并且為數據的操作提供了充分的支持
- 基礎
- 簡介
- 主要特征
- 變量和常量
- 編碼轉換
- 數組
- byte與rune
- big
- sort接口
- 和mysql類型對應
- 函數
- 閉包
- 工作區
- 復合類型
- 指針
- 切片
- map
- 結構體
- sync.Map
- 隨機數
- 面向對象
- 匿名組合
- 方法
- 接口
- 權限
- 類型查詢
- 異常處理
- error
- panic
- recover
- 自定義錯誤
- 字符串處理
- 正則表達式
- json
- 文件操作
- os
- 文件讀寫
- 目錄
- bufio
- ioutil
- gob
- 棧幀的內存布局
- shell
- 時間處理
- time詳情
- time使用
- new和make的區別
- container
- list
- heap
- ring
- 測試
- 單元測試
- Mock依賴
- delve
- 命令
- TestMain
- path和filepath包
- log日志
- 反射
- 詳解
- plugin包
- 信號
- goto
- 協程
- 簡介
- 創建
- 協程退出
- runtime
- channel
- select
- 死鎖
- 互斥鎖
- 讀寫鎖
- 條件變量
- 嵌套
- 計算單個協程占用內存
- 執行規則
- 原子操作
- WaitGroup
- 定時器
- 對象池
- sync.once
- 網絡編程
- 分層模型
- socket
- tcp
- udp
- 服務端
- 客戶端
- 并發服務器
- Http
- 簡介
- http服務器
- http客戶端
- 爬蟲
- 平滑重啟
- context
- httptest
- 優雅中止
- web服務平滑重啟
- beego
- 安裝
- 路由器
- orm
- 單表增刪改查
- 多級表
- orm使用
- 高級查詢
- 關系查詢
- SQL查詢
- 元數據二次定義
- 控制器
- 參數解析
- 過濾器
- 數據輸出
- 表單數據驗證
- 錯誤處理
- 日志
- 模塊
- cache
- task
- 調試模塊
- config
- 部署
- 一些包
- gjson
- goredis
- collection
- sjson
- redigo
- aliyunoss
- 密碼
- 對稱加密
- 非對稱加密
- 單向散列函數
- 消息認證
- 數字簽名
- mysql優化
- 常見錯誤
- go run的錯誤
- 新手常見錯誤
- 中級錯誤
- 高級錯誤
- 常用工具
- 協程-泄露
- go env
- gometalinter代碼檢查
- go build
- go clean
- go test
- 包管理器
- go mod
- gopm
- go fmt
- pprof
- 提高編譯
- go get
- 代理
- 其他的知識
- go內存對齊
- 細節總結
- nginx路由匹配
- 一些博客
- redis為什么快
- cpu高速緩存
- 常用命令
- Go 永久阻塞的方法
- 常用技巧
- 密碼加密解密
- for 循環迭代變量
- 備注
- 垃圾回收
- 協程和纖程
- tar-gz
- 紅包算法
- 解決golang.org/x 下載失敗
- 逃逸分析
- docker
- 鏡像
- 容器
- 數據卷
- 網絡管理
- 網絡模式
- dockerfile
- docker-composer
- 微服務
- protoBuf
- GRPC
- tls
- consul
- micro
- crontab
- shell調用
- gorhill/cronexpr
- raft
- go操作etcd
- mongodb