網(wǎng)站首頁 編程語言 正文
1、Docker 數(shù)據(jù)管理
在生產(chǎn)環(huán)境中使用 Docker ,往往需要對數(shù)據(jù)進行持久化,或者需要在多個容器之間進行數(shù)據(jù)共享,這必然涉及容器的數(shù)據(jù)管理操作
容器中的管理數(shù)據(jù)主要有兩種方式:
數(shù)據(jù)卷 Data Volumes 容器內(nèi)數(shù)據(jù)直接映射到本地主機環(huán)境;
數(shù)據(jù)卷容器(Data Volume Containers 使用特定容器維護數(shù)據(jù)卷
注1:上章節(jié)還介紹過cp命令在宿主機和docker容器之間復(fù)制文件
? ? ? ? docker cp 宿主機絕對路徑 ?容器id:路徑
2、數(shù)據(jù)卷(Data Volumes)
數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄,它將主機操作系統(tǒng)目錄直接映射進容器,它可以提供很多有用的特性:
? ?1.數(shù)據(jù)卷 可以在容器之間共享和重用
? ?2.對數(shù)據(jù)卷的修改會立馬生效
? ?3.對數(shù)據(jù)卷的更新,不會影響鏡像
? ?4.數(shù)據(jù)卷 默認會一直存在,即使容器被刪除
?
數(shù)據(jù)卷相關(guān)操作:
2.1.創(chuàng)建數(shù)據(jù)卷
docker volume create my-vol
?此時,數(shù)據(jù)卷默認會放到/var/lib/docker/volumes路徑下,會發(fā)現(xiàn)所新建的數(shù)據(jù)卷位置,查看命令如下:
## 參數(shù)可以為數(shù)字“1”,字母L:大小寫均可,但效果不一樣
ls -1 /var/lib/docker/volumes
2.2.查看所有的數(shù)據(jù)卷
docker volume ls
2.3.查看指定數(shù)據(jù)卷的詳細信息(顯示一個JSON格式的數(shù)據(jù))
docker volume inspect my-vol
2.4.刪除一個volume
docker volume rm my-vol
注1:數(shù)據(jù)卷 是被設(shè)計用來持久化數(shù)據(jù)的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷,無主的數(shù)據(jù)卷可能會占據(jù)很多空間,所以要及時刪除
## 掛載數(shù)據(jù)卷,最好是通過run而非create/start創(chuàng)建啟動容器
## create/start命令創(chuàng)建啟動容器后,再掛載數(shù)據(jù)卷相當(dāng)麻煩,要修改很多配置文件,但并非不可以
2.5.啟動一個掛載數(shù)據(jù)卷的容器
## demo1
docker run -d \
-it \
--name tomcat01 \
--mount source=my-vol,target=/webapp \
centos:latest
## demo2
docker run -d \
-it \
--name tomcat02 \
--mount type=bind,source=/root/webapp02,target=/root/webapp02 \
centos:latest
注1:linux命令結(jié)尾加斜杠有什么用
? ? ? ? ? 加了“\”意為將最后的回車換行給注釋了,系統(tǒng)理解為命令還沒有結(jié)束,因而是繼續(xù)等待用戶進行輸入,直到讀到結(jié)束符,如回車?注2:source=my-vol,target=/webapp
? ? ? ? ? my-vol為要掛載的數(shù)據(jù)卷,如果數(shù)據(jù)卷不存在,docker會自動創(chuàng)建
? ? ? ? ? /webapp為容器上目錄,如果目錄不存在, Docker會自動創(chuàng)建? ??注3:mount選項高級用法
? ? ? ? ? --mount選項的type參數(shù)支持三種類型的數(shù)據(jù)卷
? ? ? ? ? --mount標(biāo)志:由多個名值對組成,逗號分隔,每個鍵值由 <key> = <value> 元組組成?
? ? ? ? ? 1.type=volume普通數(shù)據(jù)卷(默認即這種類型),映射到主機/var/lib/docker/volumes路徑下;? ?
? ? ? ? ? ? --mount type=volume,source=my-vol,target=/webapp
? ? ? ? ? ? 注:type的默認值,提前先創(chuàng)建數(shù)據(jù)卷
? ? ? ? ? 2.bind:綁定數(shù)據(jù)卷,映射到主機指定路徑下;
? ? ? ? ? ? --mount type=bind,source=/webapp,destination=/webapp2
? ? ? ? ? 3.tmpfs :臨時數(shù)據(jù)卷,只存在于內(nèi)存中
? ? ? ? ? ? docker run -d \
? ? ? ? ? ? ? -it \
? ? ? ? ? ? ? --name tmptest \
? ? ? ? ? ? ? --mount type=tmpfs,destination=/app \
? ? ? ? ? ? ? nginx:latest
3、數(shù)據(jù)卷容器
如果用戶需要在多個容器之間共享一些持續(xù)更新的數(shù)據(jù),最簡單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器也是一個容器,但是它的目的是專門提供數(shù)據(jù)卷給其他容器掛載
??
數(shù)據(jù)卷容器相關(guān)操作:
3.1.新建數(shù)據(jù)卷容器
docker run -it -d --name db_data -v /db_data centos:latest
3.2.用容器db1測試數(shù)據(jù)卷容器是否可用
docker run -it -d --name db1 --volumes-from db_data centos:latest
docker exec -it db1 bash
cd db_data
## 使用echo命令向db1_test.txt中寫入內(nèi)容
echo "db1 beifen test" > db1_test.txt
3.3.備份數(shù)據(jù)卷容器
docker run --rm --name beifen --volumes-from db_data -v /zking:/container_backup centos:latest tar cvf /container_backup/backup.tar /db_data
新建1個名為beifen的(暫時性,之后會刪除)容器,由于volumes-from了db_data,所以在根目錄下也會生成1個db_data文件夾,經(jīng)過執(zhí)行命令后,將db_data文件下的數(shù)據(jù)壓縮在container_backup文件夾下,并存在宿主機上的host_backup_path下
? ?注:
? ?1)run:create+start
? ?2)--rm:創(chuàng)建之后刪除容器
? ?3)--name:容器名稱
? ?4)--volumes-from:來自于哪個數(shù)據(jù)卷容器的容器NAME
? ?5)-v:給容器掛載存儲卷,掛載到容器的某個目錄
3.4.還原數(shù)據(jù)卷容器
1.新建一個數(shù)據(jù)卷容器db_data2
? ? ? ?docker run -it -d --name db_data2 -v /db_data centos:latest2.docker run --rm --name huanyuan --volumes-from db_data2 -v ~/host_backup:/container_backup centos:latest tar xvf /container_backup/backup.tar -C /db_data
? ? ? ?新建1個名為huanyuan的(暫時性,之后會刪除)容器,由于volumes-from了db_data2,所以在根目錄下也會生成1個db_data文件夾,宿主機上的host_backup_path下的壓縮數(shù)據(jù)映射到了container_backup文件夾下,并解壓至db_data文件夾下? ? ?
4、dockerfile
dockerfile 是一個文本格式的配置文件, 用戶可以使用 Dockerfile 來快速創(chuàng)建自定義的鏡像,另外,使用Dockerfile去構(gòu)建鏡像好比使用pom去構(gòu)建maven項目一樣,有異曲同工之妙
??
5、dockerfile基本結(jié)構(gòu)
dockerfile基本結(jié)構(gòu)
? ?Dockerfile 由一行行命令語句組成, 并且支持以#開頭的注釋行,一般而言, Dockerfile 主體內(nèi)容分為四部分:
? ?基礎(chǔ)鏡像信息、 維護者信息、 鏡像操作指令和容器啟動時執(zhí)行指令。? ?部分? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?命令
? ?基礎(chǔ)鏡像信息 ? ? ? ? ? ? ? ? ? ? FROM
? ?維護者信息? ? ? ? ? ? ? ? ? ? ? ??MAINTAINER
? ?鏡像操作指令 ? ? ? ? ? ? ? ? ? ?RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
? ?容器啟動時執(zhí)行指令? ? ? ? ? CMD、ENTRYPOINT
6、docker使用Dockerfile創(chuàng)建jdk容器
啟動虛擬機,進入CentOS
6.1 創(chuàng)建文件夾上傳jdk的安裝包,和在同級目錄下編寫Dockerfile文件
? ? ? $ mkdir –p /zking/java
? ? ? # 注意d是大寫
? ? ? $ touch Dockerfile?
? ? ? 將jdk-8u221-linux-x64.tar.gz上傳到Linux或者使用cp命令復(fù)制一個本地已經(jīng)有的jdk-8u221-linux-x64.tar.gz文件到指定目錄中
? ? ? $ cp /lky/tools/jdk-8u221-linux-x64.tar.gz /zking/java
6.2 編寫 Dockerfile 文件
? ? ? 6.2.1 vi Dockerfile進入編輯模式
? ? ? :wq ?#退出并保存文件
? ? ? :q! ?#退出不保存文件
? ? ? 按i鍵進入insert編輯模式
? ? ? 6.2.2 指定基礎(chǔ)鏡像,并且必須是第一條指令
? ? ? FROM centos:latest? ? ? 6.2.3 指明該鏡像的作者和其電子郵件
? ? ? MAINTAINER zs "zs@qq.com"
? ? ? 6.2.4 在構(gòu)建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創(chuàng)建目錄
? ? ? WORKDIR /zking/java
? ? ? 6.2.5 一個復(fù)制命令,把jdk安裝文件復(fù)制到鏡像中,語法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相對路徑
? ? ? ADD jdk-8u151-linux-x64.tar.gz /zking/java/
? ? ? 注:如果在宿主機的當(dāng)前路徑下,文件直接使用相對路徑即可;? ? ? 6.2.6 配置環(huán)境變量
? ? ? ENV JAVA_HOME=/zking/java/jdk1.8.0_151
? ? ? ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
? ? ? ENV PATH=$JAVA_HOME/bin:$PATH
? ? ? #容器啟動時需要執(zhí)行的命令
? ? ? #CMD ["java","-version"]
6.3 執(zhí)行Dockerfile文件,初次依賴鏡像的時候會下載相應(yīng)鏡像
? ? ? docker build -t jdk8:v1.0 .
? ? ? 注1:-t ?jdk8:v1.0 ?給新構(gòu)建的鏡像取名為 jdk8, 并設(shè)定版本為v1.0
? ? ? 注2:注意最后有個點,代表使用當(dāng)前路徑的 Dockerfile 進行構(gòu)建?
6.4 查看鏡像
? ? ? docker images
6.5 創(chuàng)建并啟動容器
? ? ? docker run -it jdk8:v1.0 /bin/bash
6.6 檢查是否有問題
? ? ? javac
7、dockerfile實踐經(jīng)驗
1. 精簡鏡像用途:盡量讓每個鏡像的用途都比較集中單一,避免構(gòu)造大而復(fù)雜、多功能的鏡像
2. 選用合適的基礎(chǔ)鏡像:容器的核心是應(yīng)用,選擇過大的父鏡像(如CentOS系統(tǒng)鏡像)會造成最終生成應(yīng)用鏡像的臃腫,推薦選用瘦身過的應(yīng)用鏡像或者較為小巧的系統(tǒng)鏡像(alpine)
附錄一:SecureCRT上傳文件到Linux服務(wù)器上
1. 輸入rz命令,看是否已經(jīng)安裝了lrzsz,如果沒有安裝則執(zhí)行 apt install lrzsz -y 命令進行安裝。
2. 安裝成功后,輸入rpm命令確認是否正確安裝
3. 使用 rz -y命令進行文件上傳,此時會彈出上傳的窗口
還可以通過sz下載文件
原文鏈接:https://blog.csdn.net/m0_62246061/article/details/128159176
相關(guān)推薦
- 2022-05-23 vmware增加新硬盤無需重啟即可生效的命令腳本_VMware
- 2022-11-23 Python?defaultdict方法使用分析_python
- 2022-09-18 GO實現(xiàn)文件上傳操作_Golang
- 2022-05-12 android ViewModel+LiveData簡單使用
- 2022-09-19 Docker安裝部署單機版Rocket及基礎(chǔ)講解_docker
- 2022-07-03 C語言詳細講解const的用法_C 語言
- 2022-08-15 springboot使用配置文件配置bean屬性產(chǎn)生中文亂碼問題
- 2023-12-24 http中的get和post方法的區(qū)別
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支