网站建设硬件架构设计,网络设置网址,沈阳地区精神文明建设网站,网站空间续费合同【Docker】Docker学习⑤ - Docker数据管理 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理1. 数据类型1.1 什么是数据卷#xff08;data volume#xff09;1.1.1 创建APP目录并生成web页面1.1.2 启动容器并验证数据1.… 【Docker】Docker学习⑤ - Docker数据管理 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理1. 数据类型1.1 什么是数据卷data volume1.1.1 创建APP目录并生成web页面1.1.2 启动容器并验证数据1.1.3 web界面访问1.1.4 在宿主机修改数据1.1.5 删除容器1.1.6 数据卷的特点及使用 1.2 文件挂载1.2.1 创建容器并挂载文件1.2.2 验证参数生效1.2.3 如何一次挂载多个目录1.2.4 数据卷使用场景 1.3 数据卷容器1.3.1 启动一个卷容器Server1.3.2 启动端容器Client1.3.3 进入容器测试读写1.3.4 关闭卷容器Server测试能否启动新容器1.3.5 测试删除源卷容器Server创建容器1.3.6 测试之前的容器是否正常1.3.7 重新创建容器卷Server 六、网络部分七、Docker仓库之单机Dokcer Registry八、Docker仓库之分布式Harbor九、单机编排之Docker Compose 一、Docker简介
参考【Docker】Dokcer学习① - 简介
二、Docker安装及基础命令介绍
参考【Docker】Docker学习② - Docker安装及基础命令介绍
三、Docker镜像管理
参考【Docker】Docker学习③ - Docker镜像管理
四、Docker镜像与制作
参考【Docker】Docker学习④ - Docker镜像与制作
五、Docker数据管理
如果运行中的容器修改如果生成了新的数据或者修改了现有的一个已经存在的文件内容那么新产生的数据将会被复制到读写层进行持久化保存这个读写层也就是容器的工作目录此即“写时复制COWcopy on write”机制
1. 数据类型
Docker 的镜像是分层设计的底层是只读的通过镜像启动的容器添加了一层可读写的文件系统用户写入的数据都保存在这一层当中如果要将写入的数据永久生效需要将其提交为一个镜像然后通过这个镜像再启动实例然后就会给这个启动的实例添加一层可读写的文件系统。目前Docker的数据类型分为两种一是数据卷二是数据容器数据卷类似于挂载的一块磁盘数据容器是将数据保存在一个容器上。
#查看指定PID的容器信息 日志 [rootgbase8c_private haproxy-1.8.31]# docker inspect bd4ec06804db.......GraphDriver: {Data: {LowerDir: /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a-init/diff:/var/lib/docker/overlay2/d214d50660ae41a278d91e2c6c29fd4a7cc8184a98d5a6806c083e69dcc6e3fa/diff:/var/lib/docker/overlay2/7519ab25a179a968ecea9c106ff942cb7773ccdf45a28481fffb0459e18820ce/diff:/var/lib/docker/overlay2/d3bb81d4b06b5a73c5ced34a63078c386bdf78e7284673222ab2a620d5f0961f/diff:/var/lib/docker/overlay2/d9c3436b42f5d4b6d20e657640f1367ccbdba9521bc24d2f4e28dfaaf1d35537/diff:/var/lib/docker/overlay2/eb71623e9d9461ab5f07a015ce1882ad64366fd660e2431819cc248211d49b02/diff:/var/lib/docker/overlay2/0a665e15bd865f0001c1627b299c1704ac24c5411c4f10253946aae3087d54a6/diff:/var/lib/docker/overlay2/dac7c052b6df0bc270aa518861aff146477172886deb3dc593eaef00cd0de4cb/diff:/var/lib/docker/overlay2/d82086cfc2f1bc7fddb53f836e70daa237746cbd4a53dc5d8f70e59d8650c846/diff:/var/lib/docker/overlay2/a86b253e60b8498a4c59a48951e43f5c77a5e5e8266e405f8a7e8e1b20a63dc9/diff:/var/lib/docker/overlay2/ce3de19266860f7e3493ba9b16649347e9bd92ba648261843bd14fb1dd9e1e54/diff:/var/lib/docker/overlay2/f1bf8e7f890b1a1071493b75983686629b4e50c2bb38a7b77b1c044660a762f2/diff:/var/lib/docker/overlay2/43af4ff05b28f124d174b05c8f91a519e026386552867953fd4cc7c228497827/diff,MergedDir: /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/merged,UpperDir: /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/diff,WorkDir: /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/work},.......[rootgbase8c_private haproxy-1.8.31]# docker exec -it bd4ec06804db bash[rootbd4ec06804db /]# dd if/dev/zero offile bs1M count1001000 records in1000 records out104857600 bytes (105 MB, 100 MiB) copied, 0.0658615 s, 1.6 GB/s[rootbd4ec06804db /]# md5sum file2f282b84e7e608d5852449ed940bfc51 file[rootbd4ec06804db /]# lsapps dev file lib lostfound mnt proc run srv tmp varbin etc home lib64 media opt root sbin sys usr[rootbd4ec06804db /]# cp file /opt/file.log[rootgbase8c_private haproxy-1.8.31]# tree /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/diff/var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/diff├── apps│ └── apache-tomcat-8.5.96│ ├── conf│ │ └── Catalina│ │ └── localhost│ ├── logs│ │ ├── catalina.2023-12-10.log│ │ ├── catalina.2023-12-12.log│ │ ├── catalina.out│ │ ├── host-manager.2023-12-10.log│ │ ├── host-manager.2023-12-12.log│ │ ├── localhost.2023-12-10.log│ │ ├── localhost.2023-12-12.log│ │ ├── localhost_access_log.2023-12-10.txt│ │ ├── localhost_access_log.2023-12-12.txt│ │ ├── manager.2023-12-10.log│ │ └── manager.2023-12-12.log│ └── work│ └── Catalina│ └── localhost│ ├── docs│ ├── examples│ ├── host-manager│ ├── manager│ ├── myapp│ └── ROOT│ └── org│ └── apache│ └── jsp│ ├── index_jsp.class│ └── index_jsp.java├── file ######当前容器中产生的数据├── opt ######当前容器中产生的数据│ └── file.log ######当前容器中产生的数据├── root├── tmp│ └── hsperfdata_www│ └── 29└── var└── log└── lastlog24 directories, 17 files#验证md5值一致[rootgbase8c_private haproxy-1.8.31]# md5sum /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/diff/opt/file.log 2f282b84e7e608d5852449ed940bfc51 /var/lib/docker/overlay2/dddd5100022dc9dd378bbf2335238c397d1af17a5aea082bb92fbef9c812c93a/diff/opt/file.log1.1 什么是数据卷data volume
数据卷实际上就是宿主机上的目录或者是文件可以被直接mount到容器当中使用。 实际生成环境中需要针对不同类型的服务、不同类型的数据存储要求做相应的规划最终保证服务的可扩展性、稳定性及安全性。
需要存储有状态redis、mysql不需要存储有状态tomcat session在内存中不需要存储无状态nginx proxy、lvs
1.1.1 创建APP目录并生成web页面 mkdir /usr/local/testapp/echo Test App Page /usr/local/testapp/index.htmlcat /usr/local/testapp/index.html[rootgbase8c_private testapp]# cat /usr/local/testapp/index.htmlTest App Page1.1.2 启动容器并验证数据
使用-v参数将宿主机目录映射到容器内部web2的ro标示在容器内对该目录只读默认是可读写的 docker run -d --name web1 -v /usr/local/testapp/:/apps/tomcat/webapps/testapp -p8888:8080 tomcat-web:app1docker run -d --name web2 -v /usr/local/testapp/:/apps/tomcat/webapps/testapp:ro -p8889:8080 tomcat-web:app2日志 [rootgbase8c_private testapp]# docker run -d --name web1 -v /usr/local/testapp/:/apps/tomcat/webapps/testapp -p8888:8080 tomcat-web:app15406ca7307ee47cf6a29d47822b33d1c9964cf64563b8e7beb839932cfe7a259[rootgbase8c_private testapp]# docker run -d --name web2 -v /usr/local/testapp/:/apps/tomcat/webapps/testapp:ro -p8889:8080 tomcat-web:app2903990f7d923082bc124158319c2226a8859c4b7d34b6af0ca8622b0d2fb4fd6[rootgbase8c_private testapp]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES903990f7d923 tomcat-web:app2 /apps/tomcat/bin/ru… 50 seconds ago Up 49 seconds 8009/tcp, 0.0.0.0:8889-8080/tcp web25406ca7307ee tomcat-web:app1 /apps/tomcat/bin/ru… 56 seconds ago Up 55 seconds 8009/tcp, 0.0.0.0:8888-8080/tcp web1[rootgbase8c_private testapp]# docker inspect -f {{.State.Pid}} 5406ca7307ee30824[rootgbase8c_private testapp]# nsenter -t 30824 -m -u -i -n -p[root5406ca7307ee /]# cat /apps/tomcat/webapps/testapp/index.html Test App Page[root5406ca7307ee /]# echo docker /apps/tomcat/webapps/testapp/index.html[root5406ca7307ee /]# cat /apps/tomcat/webapps/testapp/index.html Test App Pagedocker[root5406ca7307ee /]# logout[rootgbase8c_private testapp]# docker inspect -f {{.State.Pid}} 903990f7d92330996[rootgbase8c_private testapp]# nsenter -t 30996 -m -u -i -n -p[root903990f7d923 /]# cat /apps/tomcat/webapps/testapp/index.htmlTest App Pagedocker[root903990f7d923 /]# echo docker /apps/tomcat/webapps/testapp/index.html-bash: /apps/tomcat/webapps/testapp/index.html: Read-only file system#只读#宿主机验证[rootgbase8c_private testapp]# cat /usr/local/testapp/index.html Test App Pagedocker1.1.3 web界面访问 http://192.168.56.199:8888/testapp/1.1.4 在宿主机修改数据
日志 echo 111 /usr/local/testapp/index.htmlweb界面访问验证1.1.5 删除容器
创建容器的时候指定参数-v可以删除/var/lib/docker/containers/的容器数据目录但是不会删除数据卷的内容。 删除所有容器之后容器的数据目录被删除但是数据卷还在所以数据卷数据是可以持久保存的。 日志 [rootgbase8c_private testapp]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES903990f7d923 tomcat-web:app2 /apps/tomcat/bin/ru… 11 minutes ago Up 11 minutes 8009/tcp, 0.0.0.0:8889-8080/tcp web25406ca7307ee tomcat-web:app1 /apps/tomcat/bin/ru… 11 minutes ago Up 11 minutes 8009/tcp, 0.0.0.0:8888-8080/tcp web1[rootgbase8c_private testapp]# docker rm -f -v 5406ca7307ee5406ca7307ee[rootgbase8c_private testapp]# docker rm -f -v 903990f7d923903990f7d923[rootgbase8c_private testapp]# ll /var/lib/docker/containers/总用量 0[rootgbase8c_private testapp]# cat /usr/local/testapp/index.html Test App Pagedocker1111.1.6 数据卷的特点及使用
数据卷是目录或者文件并且可以在多个容器之间共同使用。对数据卷更改数据在所有容器里面会立即更新。数据卷的数据可以持久保存即使删除使用该容器卷的容器也不影响。在容器里面的写入数据不会影响到镜像本身。
1.2 文件挂载
文件挂载用于很少更改文件内容的场景比如nginx的配置文件、tomcat的配置文件等。
1.2.1 创建容器并挂载文件 vim /usr/local/testapp/catalina.sh[rootgbase8c_private testapp]# cat catalina.sh | grep JAVA_OPTS#自定义JAVA选项JAVA_OPTS-server -Xms4g -Xmx4g -Xss512k -Xmn1g -XX:CMSInitiatingOccupancyFraction65 -XX:UseFastAccessorMethods -XX:AggressiveOpts -XX:UseBiasedLocking -XX:DisableExplicitGC -XX:MaxTenuringThreshold10 -XX:NewSize2048M -XX:MaxNewSize2048M -XX:NewRatio2 -XX:PermSize128m -XX:MaxPermSize512m -XX:CMSFullGCsBeforeCompaction5 -XX:ExplicitGCInvokesConcurrent -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:CMSParallelRemarkEnabled -XX:UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes128m -XX:UseFastAccessorMethodsdocker run -d --name web1 -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -p8811:8080 tomcat-web:app11.2.2 验证参数生效
日志 [rootgbase8c_private testapp]# docker inspect -f {{.State.Pid}} b62074be97a924222[rootgbase8c_private testapp]# docker inspect -f {{.State.Pid}} b62074be97a924222[rootgbase8c_private testapp]# nsenter -t 24222 -m -u -p -i -n[rootb62074be97a9 /]# ps -ef | grep javawww 29 1 7 21:28 ? 00:00:06 /usr/local/jdk/jre/bin/java -Djava.util.logging.config.file/apps/tomcat/conf/logging.properties -Djava.util.logging.managerorg.apache.juli.ClassLoaderLogManager -server -Xms4g -Xmx4g -Xss512k -Xmn1g -XX:CMSInitiatingOccupancyFraction65 -XX:UseFastAccessorMethods -XX:AggressiveOpts -XX:UseBiasedLocking -XX:DisableExplicitGC -XX:MaxTenuringThreshold10 -XX:NewSize2048M -XX:MaxNewSize2048M -XX:NewRatio2 -XX:PermSize128m -XX:MaxPermSize512m -XX:CMSFullGCsBeforeCompaction5 -XX:ExplicitGCInvokesConcurrent -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:CMSParallelRemarkEnabled -XX:UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes128m -XX:UseFastAccessorMethods -Djdk.tls.ephemeralDHKeySize2048 -Djava.protocol.handler.pkgsorg.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK0027 -Dignore.endorsed.dirs -classpath /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar -Dcatalina.base/apps/tomcat -Dcatalina.home/apps/tomcat -Djava.io.tmpdir/apps/tomcat/temp org.apache.catalina.startup.Bootstrap start1.2.3 如何一次挂载多个目录
多个目录要位于不同的目录下 docker run -d --name web1 -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /usr/local/testapp:/apps/tomcat/webapps/testapp -p8811:8080 tomcat-web:app11.2.4 数据卷使用场景
日志输出静态web界面应用配置文件多容器间目录或文件共享
1.3 数据卷容器
数据卷容器最大的功能是可以让数据在多个docker容器之间共享即可以让B容器访问A容器的内润而容器C也可以访问A容器的内容即先要创建一个后台运行的容器作为Server用于卷提供这个卷可以为其他容器提供数据存储服务其他使用此卷的容器作为clinet端。
1.3.1 启动一个卷容器Server
先启动一个容器并挂载宿主机的数据目录 docker run -d --name volume-docker -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /usr/local/testapp:/apps/tomcat/webapps/testapp -p8800:8080 tomcat-web:app11.3.2 启动端容器Client docker run -d --name web1 -p8801:8080 --volumes-from volume-docker tomcat-web:app1docker run -d --name web2 -p8802:8080 --volumes-from volume-docker tomcat-web:app21.3.3 进入容器测试读写
读写权限依赖于源数据卷Server容器
1.3.4 关闭卷容器Server测试能否启动新容器 docker stop volume-dockerdocker run -d --name web3 -p8803:8080 --volumes-from volume-docker tomcat-web:app21.3.5 测试删除源卷容器Server创建容器 docker rm -fv volume-dockerdocker run -d --name web4 -p8804:8080 --volumes-from volume-docker tomcat-web:app21.3.6 测试之前的容器是否正常
已经运行的容器不受影响
1.3.7 重新创建容器卷Server docker run -d --name volume-docker -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /usr/local/testapp:/apps/tomcat/webapps/testapp -p8800:8080 tomcat-web:app1docker run -d --name web4 -p8804:8080 --volumes-from volume-docker tomcat-web:app2在当前环境下即使把提供卷的容器Server删除已经运行的容器Client依然可以使用挂载的卷因为容器是通过挂载访问数据的但是无法创建新的卷容器客户端但是再把容器卷容器Server创建后即可正常创建卷容器Client此方式可以用于线上共享数据目录等环境因为即使数据卷容器被删除了其他已经运行的容器依然可以挂载使用。数据卷容器可以作为共享的方式为其他容器提供文件共享类似于NFS共享可以在生产中启动一个实例挂载本地的目录然后其他的容器分别挂载此容器的目录即可保证各容器之间的数据一致性。 日志 [rootgbase8c_private testapp]# docker run -d --name volume-docker -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /usr/local/testapp:/apps/tomcat/webapps/testapp -p8800:8080 tomcat-web:app1de700ac7ae15f1efb07e672750997f91a469b8b2e33cc166cf4ad38328e4a815[rootgbase8c_private testapp]# docker run -d --name web1 -p8801:8080 --volumes-from volume-docker tomcat-web:app11490e4a6697d5978614ac6b8557ef39ace767270da5014043a81ee7cc44775c2[rootgbase8c_private testapp]# docker run -d --name web2 -p8802:8080 --volumes-from volume-docker tomcat-web:app2e925dd3ccc2c45e03940ee5fbc22c4f6cd5be27371bcb20cc005442ea132ce4e[rootgbase8c_private testapp]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe925dd3ccc2c tomcat-web:app2 /apps/tomcat/bin/ru… 6 seconds ago Up 5 seconds 8009/tcp, 0.0.0.0:8802-8080/tcp web21490e4a6697d tomcat-web:app1 /apps/tomcat/bin/ru… 11 seconds ago Up 10 seconds 8009/tcp, 0.0.0.0:8801-8080/tcp web1de700ac7ae15 tomcat-web:app1 /apps/tomcat/bin/ru… 15 seconds ago Up 14 seconds 8009/tcp, 0.0.0.0:8800-8080/tcp volume-docker[rootgbase8c_private ~]# docker exec 1490e4a6697d bash[rootgbase8c_private ~]# docker exec -it 1490e4a6697d bash[root1490e4a6697d /]# echo #test /apps/tomcat/webapps/testapp/index.html [root1490e4a6697d /]# echo #test /apps/tomcat/bin/catalina.sh bash: /apps/tomcat/bin/catalina.sh: Read-only file system[root1490e4a6697d /]# exit[rootgbase8c_private ~]# docker stop volume-docker volume-docker[rootgbase8c_private ~]# docker run -d --name web3 -p8803:8080 --volumes-from volume-docker tomcat-web:app25f0cb9bb4888fde6252d09c63d1eda34b9194a2fa68da04648b17334be96a207[rootgbase8c_private ~]# docker rm -fv volume-dockervolume-docker[rootgbase8c_private ~]# docker run -d --name web4 -p8804:8080 --volumes-from volume-docker tomcat-web:app2docker: Error response from daemon: No such container: volume-docker.See docker run --help.[rootgbase8c_private ~]# docker run -d --name volume-docker -v /usr/local/testapp/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /usr/local/testapp:/apps/tomcat/webapps/testapp -p8800:8080 tomcat-web:app153c04a1406b994f96cd073465eee084e75153c45b65d9df73d4f2b9035282664[rootgbase8c_private ~]# docker run -d --name web4 -p8804:8080 --volumes-from volume-docker tomcat-web:app2cbe7367b77e3bc80b128e115fe7266601f0d819280594849fc17965034588edb六、网络部分
参考【Docker】Docker学习⑥ - 网络部分
七、Docker仓库之单机Dokcer Registry
参考【Docker】Docker学习⑦ - Docker仓库之单机Dokcer Registry
八、Docker仓库之分布式Harbor
参考【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
九、单机编排之Docker Compose 参考【Docker】Docker学习⑨ - 单机编排之Docker Compose