当前位置: 首页 > news >正文

网站正在建设中的英文设计师喜欢的购物网站

网站正在建设中的英文,设计师喜欢的购物网站,即时设计网站,做佩戴护身符的厂家网站Volume Volume是容器数据卷。我们经常创建删除一些容器#xff0c;但有时候需要保留容器中的一些数据#xff0c;这时候就用到了Volume。它也是容器之间数据共享的技术#xff0c;可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人… Volume Volume是容器数据卷。我们经常创建删除一些容器但有时候需要保留容器中的一些数据这时候就用到了Volume。它也是容器之间数据共享的技术可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人电脑上。 挂载命令-v 第一种挂载volume的方式是通过命令-v来挂载。 指定路径挂载 类似于-p 主机端口:容器内端口-v也是-v 主机目录:容器内目录。这种方式是指定路径挂载。 在主机建一个/mainHome目录我有一个centos镜像用它跑起一个容器来将容器的/home目录映射到主机/mainHome目录。 rootKitDevVps:~# mkdir mainHome rootKitDevVps:~# pwd /root rootKitDevVps:~# docker run -it -v /root/mainHome:/home centos /bin/bash [rootb486ed5aa77f /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var [rootb486ed5aa77f /]# cd /home/ [rootb486ed5aa77f home]# ls [rootb486ed5aa77f home]# touch test.txt [rootb486ed5aa77f home]# ls test.txt [rootb486ed5aa77f home]# exit exit rootKitDevVps:~# ls /root/mainHome/ test.txt可以看到映射之后我进入容器内在它的/home下创建了一个test.txt退出容器回到主机的/root/mainHome下发现也已经有了一个test.txt文件。 目前我们了解了修改容器内文件可以让容器外面挂载到的目录出现变化。我们尝试在容器外编辑这个test.txt文件然后进容器内查看。虽然我们基本已经清楚这是多此一举但还是尝试一下。 rootKitDevVps:~# cd /root/mainHome/ rootKitDevVps:~/mainHome# vim test.txt rootKitDevVps:~/mainHome# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b486ed5aa77f centos /bin/bash 5 minutes ago Exited (0) 4 minutes ago boring_cerf 242fdc2bba7d centos -it /bin/bash 6 minutes ago Created optimistic_dubinsky 1cdd55fd90c5 nginx /docker-entrypoint.… 11 hours ago Up 7 hours 0.0.0.0:80-80/tcp nginx1 7d2fd4e741ba hello-world /hello 13 hours ago Exited (0) 13 hours ago elastic_goldstine rootKitDevVps:~/mainHome# docker start b486ed5aa77f b486ed5aa77f rootKitDevVps:~/mainHome# docker exec -it b486ed5aa77f /bin/bash [rootb486ed5aa77f /]# cat /home/test.txt Hello Volume!可以看到容器内的test.txt的内容也随之发生了变化。而且我们之前exit时实际上容器就已经stop了我们是在容器停止之后修改了本机的test.txt文件重新运行起容器发现容器内的test.txt文件也发生了变化。可以说是非常灵活。 注意如果运行容器时没有使用-d没有让其后台运行在容器内时可以使用ctrlpq来退出容器此时容器依旧会在运行使用exit退出我预计它不会运行但容器也会继续运行。这一块跟我前面结果有出入让我摸不到头脑。后面我又有一次没有-dexit后容器stop了ctrlpq没有stop。-d后exit容器也没有stop。现在的结论就是 没有-d使用exit容器会stop没有-d使用ctrlpq容器不会stop没有-d使用exit退出容器stop再使用docker start 容器名启动容器依旧会在后台运行没有-d使用ctrlpq退出容器不会stop有-d使用exit容器不会stop有-d使用ctrlpq容器不会stop有-d使用exit退出容器stop再使用docker start 容器名启动容器依旧会在后台运行使用ctrlpq有-d使用ctrlpq退出容器不会stop 可以使用docker inspect 容器id来查看容器详细信息其中会包括卷挂载的目录等。 如果我想用docker搞一个nginx又不想一遍一遍地进入容器修改配置文件因为我可能随时删除容器。此时就可以用这种方式。每次运行新容器只需要把主机存放配置文件的目录挂载到容器存放配置文件的目录即可。因为即使删掉容器主机的目录和里面的内容不会丢失。 注意可以同时挂载多个目录格式-v 主机目录1:容器内目录1 -v 主机目录2:容器内目录2 -v... 如果只写-v 容器内目录是匿名挂载的格式会自动在主机生成目录。 docker volume ls是查看所有本机的卷的指令可以用docker volume --help来查看更多用法。 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local sqlvolume不知道为什么竟然不显示之前我挂载的mainHome可能是那个只是目录的映射不是卷用docker volume create创建出来的才是卷。 尝试一下匿名挂载和具名挂载 具名挂载 具名挂载的命令-v 卷名:容器内路径。卷名前面如果加上个“/”就会变成指定路径挂载。注意区分。 具名挂载 rootKitDevVps:~# docker run -d -P --name centos01 -v centos01:/home centos 775b213506eb2bc06228ac25d2f8e36f5abfccaba80658accc072a7fd7af6879 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local centos01 local sqlvolumedocker run -d -P --name centos01 -v centos01:/home centos这行命令中-d是后台运行-P大写P是随机指定端口-v centos01:/home的centos01是卷名不是主机目录这里很容易跟主机目录混淆要留心。冒号后面是容器内目录。我在指令中加了-d让它后台运行但docker自动把这个镜像关闭了原因似乎是docker理解这个容器没用了就自动关掉了。下次尝试不加-d。 删掉容器看看volume还在不在 rootKitDevVps:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 775b213506eb centos /bin/bash 37 seconds ago Exited (0) 35 seconds ago centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 21 hours ago Up 18 hours 0.0.0.0:80-80/tcp nginx1 7d2fd4e741ba hello-world /hello 24 hours ago Exited (0) 24 hours ago elastic_goldstine rootKitDevVps:~# docker rm centos01 centos01 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local centos01 local sqlvolume发现删掉之后数据卷还在这符合我们的需求。 匿名挂载 匿名挂载 rootKitDevVps:~# docker run -P --name centos01 -v /home centos rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cdd55fd90c5 nginx /docker-entrypoint.… 21 hours ago Up 18 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bca038e5ea33 centos /bin/bash 45 seconds ago Exited (0) 43 seconds ago centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 21 hours ago Up 18 hours 0.0.0.0:80-80/tcp nginx1 7d2fd4e741ba hello-world /hello 24 hours ago Exited (0) 24 hours ago elastic_goldstine rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local 847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9 local centos01 local sqlvolume可以看到匿名挂载的volume name是随机的码。但有一个其他的问题是我明明没有加-d让它后台运行为什么还是自动关掉了。查看日志发现日志也为空。实在不知道该如何解决自动stop容器的问题。 ro和rw 看以下命令 docker run -it -v /root/mainHome:/home:ro centos /bin/bash docker run -it -v /root/mainHome:/home:rw centos /bin/bash如果在容器内路径后面加上:ro或:rw是对权限的配置约束的是容器内的权限。ro只能从外部改变不能从容器内部改变。默认就是rw容器内对卷目录下的文件也可读可写。 卷的其他操作以及卷的路径 这个问题先一放看一下docker volume命令怎么用 rootKitDevVps:~# docker volume -h Flag shorthand -h has been deprecated, please use --helpUsage: docker volume COMMANDManage volumesCommands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove all unused local volumesrm Remove one or more volumesRun docker volume COMMAND --help for more information on a command.可以知道创建、删除等操作。主要看一下inspect rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local 847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9 local centos01 rootKitDevVps:~# docker volume inspect 847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9 [{CreatedAt: 2020-07-04T01:53:46Z,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9/_data,Name: 847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9,Options: null,Scope: local} ]现在查看的是匿名卷可以看到路径在Mountpoint那一栏。docker所有的卷如果没有指定详细路径都会放在/var/lib/docker/volumes/这个目录下而所有的数据都在/_data下。我们看一下里面有什么 rootKitDevVps:~# ls /var/lib/docker/volumes/847c90a1bdcdcfa65d8fd316ddf53816e223b185125d519152c4a2260323b7e9/_data/ rootKitDevVps:~# 看来暂时还什么都没有因为我挂载的是home目录而且这个镜像也已经被我删了暂时没法进它的home进行操作。我重新搞一个。为什么这次我可以运行起这个容器而不自动退出可以看如何解决容器创建出来自动停止的问题 rootKitDevVps:~# docker run -P -d -it --name centos01 -v centos01Volume:/home centos e087f8443ee1f62dd68950e3f61fa039852b2dfee18a117019951b236a430548 rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e087f8443ee1 centos /bin/bash 4 seconds ago Up 2 seconds centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 23 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# docker exec -it e087f8443ee1 /bin/bash [roote087f8443ee1 /]# touch /home/test.txt [roote087f8443ee1 /]# ls /home/ test.txt [roote087f8443ee1 /]# exit exit rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e087f8443ee1 centos /bin/bash 3 minutes ago Up 3 minutes centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 23 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# ls /var/lib/docker/volumes/centos01Volume/_data/ test.txt可以看到/var/lib/docker/volumes/centos01Volume/_data/路径下有映射的容器内/home/目录下的文件。同时注意我在运行这个容器时使用了-d和-it后面我exit出容器后容器依然是在运行的。后面我自己创建的镜像run出来的容器没有使用-d使用exit或ctrlpq退出容器后依旧也在后台运行这让我怀疑-d除了返回id外到底有什么用。后来通过实践得知加了-d后run出容器来并不直接进入容器而是回到了本机。不加-d则会直接进入容器。 再看一下主机的/var/lib/docker下有什么 rootKitDevVps:~# ls /var/lib/docker/ builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes其中containers是docker的容器image是docker的镜像network是docker的网络plugins是插件volumes就是卷。 如何解决容器创建出来自动停止的问题重要 我尝试运行镜像的时候与镜像交互 docker run -d -P -it --name centos01 centos d59e9785a1212280342817d9e5c49ca126d2eda5af8cf1ef8da194570ecf49ce rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d59e9785a121 centos /bin/bash 5 seconds ago Up 3 seconds centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 22 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d59e9785a121 centos /bin/bash 8 seconds ago Up 7 seconds centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 22 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1同时使用-d和-it发现容器没有自杀正常启动了。 尝试不使用-d只使用-it rootKitDevVps:~# docker run -P -it --name centos01 centos [root53df37df4c1e /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var发现直接进入了镜像的命令行。输入exit退出 [root53df37df4c1e /]# exit exit rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cdd55fd90c5 nginx /docker-entrypoint.… 22 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1发现镜像也自动stop了。如果运行容器时同时使用-d和-it即使exit退出容器容器依然会在运行。 还有的容器自动停止是其他原因可以使用docker logs 容器id查看日志。比如sqlserver的容器自动stop的原因可能是服务器的内存不满足它配置的需求 rootKitDevVps:~# docker run --name mssql01 -e ACCEPT_EULAY -e SA_PASSWORD****** -e MSSQL_PIDExpress -p 1433:1433 -v sqlvolume:/var/opt/mssql -d -it mcr.microsoft.com/mssql/server 7664784740e200dcb20d02d3f93369023f9ff3438b9aa80ccfc138df3a1f46ee rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cdd55fd90c5 nginx /docker-entrypoint.… 22 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7664784740e2 mcr.microsoft.com/mssql/server /opt/mssql/bin/perm… 8 seconds ago Exited (1) 7 seconds ago mssql01 53df37df4c1e centos /bin/bash 4 minutes ago Exited (130) About a minute ago centos01 1cdd55fd90c5 nginx /docker-entrypoint.… 22 hours ago Up 19 hours 0.0.0.0:80-80/tcp nginx1 7d2fd4e741ba hello-world /hello 25 hours ago Exited (0) 25 hours ago elastic_goldstine rootKitDevVps:~# docker logs 7664784740e2 SQL Server 2019 will run as non-root by default. This container is running as user mssql. To learn more visit https://go.microsoft.com/fwlink/?linkid2099216. sqlservr: This program requires a machine with at least 2000 megabytes of memory. /opt/mssql/bin/sqlservr: This program requires a machine with at least 2000 megabytes of memory.日志中写了它至少需要2000M内存我的服务器就是2000M内存看来还不够。可能要4000M内存的服务器才能玩它。 Dockerfile挂载卷的方式 可以使用DockerFile来挂载卷。DockerFile也是重要的Docker知识点我一直没搞懂下次尝试搞懂它这次先用它挂载卷。 Dockerfile看起来就像是构建docker镜像的配置文件利用它可以生成镜像。试一下。 先开一个目录用来写Dockerfile和存放生成的镜像 rootKitDevVps:~# cd /home/ rootKitDevVps:/home# mkdir dockerfile-volume-test rootKitDevVps:/home# ls dockerfile-volume-test rootKitDevVps:/home# cd dockerfile-volume-test/ rootKitDevVps:/home/dockerfile-volume-test# 这个目录是/home/dockerfile-volume-test。在里面写一个dockerfile1然后在里面写一些脚本。通过这些脚本可以生成一个docker镜像。脚本是一个个的命令每个命令都是一层 # 以centos镜像为基础 FROM centos # 挂载卷在镜像生成的时候就把卷挂载出来可以挂载多个目录目录都会在容器中生成在本机上是以匿名挂载的方式在默认的位置。当然要run出容器来才会挂载只build镜像当然不会挂载 VOLUME [volume1,volume2]# 写一个命令行输出一条语句证明脚本运行到了这里镜像构建成功 CMD echo build succeed# 构建完之后我们进入容器时希望走bash CMD /bin/bashdockerfile写好了使用docker build命令构建镜像 rootKitDevVps:/home/dockerfile-volume-test# docker build -f dockerfile1 -t kit/centos . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos--- 831691599b88 Step 2/4 : VOLUME [volume1,volume2]--- Running in f634ab6900f1 Removing intermediate container f634ab6900f1--- 10d1359b311e Step 3/4 : CMD echo build succeed--- Running in e505fce33f96 Removing intermediate container e505fce33f96--- bad661d7a8e7 Step 4/4 : CMD /bin/bash--- Running in 59efa3a8897d Removing intermediate container 59efa3a8897d--- 9347f3c0dcd9 Successfully built 9347f3c0dcd9 Successfully tagged kit/centos:latest 看一下第一行的命令 -f 后加dockerfile的地址。 -t就是target就是生成的镜像的名字。注意开头不要有/会被识别成目录。最后可以用冒号:来指定tag可以写成1.01.1等不写的话默认就是latest。 最后的“.”是指生成在当前目录下也可以换成指定的目录。 再看一下build的过程第一步是拿到基础镜像第二步是挂载第三步写出了我们刚才写的CMD命令第四步进入了/bin/bash。 我再尝试构建一个镜像跟这个名字相同tag为1.0并且最后用绝对路径指定镜像生成的路径 rootKitDevVps:/home/dockerfile-volume-test# docker build -f dockerfile1 -t kit/centos:1.0 /home/dockerfile-volume-test/ Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos--- 831691599b88 Step 2/4 : VOLUME [volume1,volume2]--- Using cache--- 10d1359b311e Step 3/4 : CMD echo build succeed--- Using cache--- bad661d7a8e7 Step 4/4 : CMD /bin/bash--- Using cache--- 9347f3c0dcd9 Successfully built 9347f3c0dcd9 Successfully tagged kit/centos:1.0 rootKitDevVps:/home/dockerfile-volume-test# docker images REPOSITORY TAG IMAGE ID CREATED SIZE kit/centos 1.0 9347f3c0dcd9 4 minutes ago 215MB kit/centos latest 9347f3c0dcd9 4 minutes ago 215MB centos latest 831691599b88 2 weeks ago 215MB mcr.microsoft.com/mssql/server latest d2520a2df464 2 weeks ago 1.51GB nginx latest 2622e6cca7eb 3 weeks ago 132MB hello-world latest bf756fb1ae65 6 months ago 13.3kB可以看到两个镜像名字相同只有版本号不同连id也相同。用id删除镜像的话估计就全都删除了我尝试能不能用名字加tag只删除其中一个。先删latest rootKitDevVps:/home/dockerfile-volume-test# docker rmi kit/centos:latest Untagged: kit/centos:latest rootKitDevVps:/home/dockerfile-volume-test# docker images REPOSITORY TAG IMAGE ID CREATED SIZE kit/centos 1.0 9347f3c0dcd9 2 minutes ago 215MB centos latest 831691599b88 2 weeks ago 215MB mcr.microsoft.com/mssql/server latest d2520a2df464 2 weeks ago 1.51GB nginx latest 2622e6cca7eb 3 weeks ago 132MB hello-world latest bf756fb1ae65 6 months ago 13.3kB我试验了两次rmi后的容器名称加上:latest和不加均能删掉latest但不删掉1.0。看来对于id相同的容器可以使用rmi 容器名加tag的方式来删除。 rootKitDevVps:/home/dockerfile-volume-test# docker rmi kit/centos:1.0 Untagged: kit/centos:1.0 Deleted: sha256:9347f3c0dcd9dd7a6650e73a329ac77582565f5e640cb2b10c89bb90173dde4e Deleted: sha256:bad661d7a8e75bf3fad12348712826a57571e53d95c77acc4c1b6aa80032a3e6 Deleted: sha256:10d1359b311e2fe98e728368d44778aae5083f9e836f883a7c423b03fa0ad93b rootKitDevVps:/home/dockerfile-volume-test# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 831691599b88 2 weeks ago 215MB mcr.microsoft.com/mssql/server latest d2520a2df464 2 weeks ago 1.51GB nginx latest 2622e6cca7eb 3 weeks ago 132MB hello-world latest bf756fb1ae65 6 months ago 13.3kB删掉了。我重新构建出1.0来尝试run起来一个容器并且进入。 rootKitDevVps:/home/dockerfile-volume-test# docker run -it kit/centos:1.0 /bin/bash [root6becde880c2b /]# [root6becde880c2b /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var volume1 volume2可以看到不但成功进入了我们的容器ls了一下发现容器内根目录有volume1 volume2两个目录我们在run出这个容器的时候名没有添加-v也就是说这两个目录是我们通过在dockerfile中写命令生成容器时来自动挂载的。 实际上不输入/bin/bash也可以进入容器我猜测是前面dockerfile的CMD /bin/bash起了作用。 我们进入volume1创建一个文件test.txt然后另开一个终端看一下主机中有没有以匿名挂载的方式挂载到默认路径顺便看看其中有没有test.txt [root6becde880c2b /]# touch volume1/test.txt [root6becde880c2b /]# ls volume1 test.txt另外开一个终端 rootKitDevVps:~# ls /var/lib/docker/volumes/ 8f76e936d3b3b0f119ca3424578a0dc2f23b19060017fdc2b84d4e2eede1f1e4 acd4c09b3f77f070e9a900cc33e3326f30122ce97383ed188335d805ade381b6 metadata.db rootKitDevVps:~# ls /var/lib/docker/volumes/8f76e936d3b3b0f119ca3424578a0dc2f23b19060017fdc2b84d4e2eede1f1e4/_data/ rootKitDevVps:~# ls /var/lib/docker/volumes/acd4c09b3f77f070e9a900cc33e3326f30122ce97383ed188335d805ade381b6/_data/ test.txt可以看到默认路径下有两个匿名的挂载目录其中acd开头的目录下的_data中存在一个我们创建的test.txt显然它就是容器内的volume1。 除了记住这个默认路径还可以通过docker imspect 容器id的方式查看容器的详细信息来找到挂载路径 rootKitDevVps:~# docker inspect 6becde880c2b...Mounts: [{Type: volume,Name: 8f76e936d3b3b0f119ca3424578a0dc2f23b19060017fdc2b84d4e2eede1f1e4,Source: /var/lib/docker/volumes/8f76e936d3b3b0f119ca3424578a0dc2f23b19060017fdc2b84d4e2eede1f1e4/_data,Destination: volume2,Driver: local,Mode: ,RW: true,Propagation: },{Type: volume,Name: acd4c09b3f77f070e9a900cc33e3326f30122ce97383ed188335d805ade381b6,Source: /var/lib/docker/volumes/acd4c09b3f77f070e9a900cc33e3326f30122ce97383ed188335d805ade381b6/_data,Destination: volume1,Driver: local,Mode: ,RW: true,Propagation: }],...我们构建镜像常常是自己使用或者公司内部使用可能常常需要用这种方式自动挂载而不使用-v。 数据卷容器容器之间数据卷共享 还可以通过容器之间数据卷共享的方式在多个容器之间共享数据比如有多个mssql就能共享数据库中的数据。 首先需要一个父容器还需要一个子容器去挂载它实现数据同步。使用--volumes-from命令。 先删除主机上所有的卷 rootKitDevVps:~# docker volume rm $(docker volume ls -q) 8f76e936d3b3b0f119ca3424578a0dc2f23b19060017fdc2b84d4e2eede1f1e4 0692a62975fed8394be202bac773ff8fe9a53f4a406d34b8eb8f8fba2827d393 acd4c09b3f77f070e9a900cc33e3326f30122ce97383ed188335d805ade381b6 bfe36976df800a733703b69fcf6b7bea95e68fc554588756c241705ea83a29a2 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME尝试创建三个容器实现数据共享使用我们自己build的镜像来做。先运行起一个容器取名docker01作为父容器顺便进入容器内部 rootKitDevVps:~# docker run -it --name docker01 kit/centos:1.0 [rootdcd5c3b67f9b /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var volume1 volume2发现依旧生成了volume1 volume2。使用ctrlpq或exit退出容器但后面我创建docker02时使用exec退出它容器就自动停止运行了。然后再创建它的子容器docker02在run命令中加上--volumes-from docker01仿佛是继承了docker01的volumes rootKitDevVps:~# docker run -it --name docker02 --volumes-from docker01 kit/centos:1.0 [root0b900529dd5b /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var volume1 volume2发现02中依旧有volume1 volume2。可以使用ctrlpq退出容器容器依旧还在后台运行。此时查看主机的数据卷发现还是只有docker01的那两个数据卷 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local 62208e194cb6d971e0e1610f603ac8ae90a2df8d3b5b8c198fd1523a62baf537 local d7fc935ed1bf694e9efbf88cf20722d704201a1fd86d87ea0a6e17840301f830为了验证两个容器数据是否互通另开一个终端使用docker attach进入01修改volume1然后进入02查看是否变化。使用docker attach比docker exec似乎更简单 rootKitDevVps:~# docker attach docker01 [rootdcd5c3b67f9b /]# ls bin dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var volume1 volume2 [rootdcd5c3b67f9b /]# touch volume1/test.txt [rootdcd5c3b67f9b /]# ls volume1 test.txt再看docker02 rootKitDevVps:~# docker attach docker02 [root0b900529dd5b /]# ls volume1 test.txt果然也存在了这个文件。再在02中touch一个看看01有没有改变 [root0b900529dd5b /]# touch volume1/test2.txt [root0b900529dd5b /]# ls volume1 test.txt test2.txt去01中看 [rootdcd5c3b67f9b /]# ls volume1 test.txt test2.txt果然也存在了。 下面再尝试以下创建docker03 --volumes-from 01再创建docker04 --volumes-from 02看看可不可以 rootKitDevVps:~# docker run -d -it --name docker03 --volumes-from docker01 kit/centos:1.0 51ce86e015fd6b86651f28ecf66e924082fd86fd67ac15af5968ebe3706a09f4 rootKitDevVps:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51ce86e015fd kit/centos:1.0 /bin/sh -c /bin/bash 9 seconds ago Up 8 seconds docker03 0b900529dd5b kit/centos:1.0 /bin/sh -c /bin/bash 15 minutes ago Up 15 minutes docker02 dcd5c3b67f9b kit/centos:1.0 /bin/sh -c /bin/bash 26 minutes ago Up 26 minutes docker01 1cdd55fd90c5 nginx /docker-entrypoint.… 31 hours ago Up 27 hours 0.0.0.0:80-80/tcp nginx1 rootKitDevVps:~# docker attach docker03 [root51ce86e015fd /]# ls volume1 test.txt test2.txt03是挂载了01数据同步了。再创建04挂载02试试 rootKitDevVps:~# docker run -d -it --name docker04 --volumes-from docker02 kit/centos:1.0 018a33472a829fcc93c54a5259397800459c78d6af87db24a208a333cd5bc0b2 rootKitDevVps:~# docker attach docker04 [root018a33472a82 /]# ls volume1 test.txt test2.txt也是可以的。此时查看主机数据卷 rootKitDevVps:~# docker volume ls DRIVER VOLUME NAME local 62208e194cb6d971e0e1610f603ac8ae90a2df8d3b5b8c198fd1523a62baf537 local d7fc935ed1bf694e9efbf88cf20722d704201a1fd86d87ea0a6e17840301f830还是那两个。即使把docker01删掉其它容器的数据也不会丢失删别的也一样。只要有容器还在用这些数据就不会丢失。同时因为我们使用-v或者dockerfile等方式持久化到了本地所以就算容器全删掉主机上的卷也不会丢失卷内创建的文件也还在这是我实验过的。如果2断了1和3依旧是挂载着的可以看出似乎不是链式的。 上图是狂神的教程里的图指容器卷共享是互相拷贝的概念而不是共用同一块存储的概念。 在实际项目中可以用于多个redis或者mssql等实现数据共享。也可以做集群的时候进行配置文件共享。 有没有-d与exit和ctrlpq两种退出方式之间的关系难点 有-d指的是run出容器的时候添加了-d这个option。 没有-d使用exit容器会stop没有-d使用ctrlpq容器不会stop没有-d使用exit退出容器stop再使用docker start 容器名启动容器依旧会在后台运行没有-d使用ctrlpq退出容器不会stop有-d使用exit容器不会stop有-d使用ctrlpq容器不会stop有-d使用exit退出容器stop再使用docker start 容器名启动容器依旧会在后台运行有-d使用ctrlpq退出容器不会stop 以上结论并不全对因为我后来run一个ubuntu的时候出现了上面之外的情况总之我选择以后只使用ctrlpq来退出容器。
http://wiki.neutronadmin.com/news/308693/

相关文章:

  • 网站建设 实训意见和建议dreamviewer做网站
  • 网站建设策划表varnish 4.0 wordpress
  • 信息系统的网站开发答辩问题ps海报素材网站
  • 做网站多久福州网站
  • 哪些专业能建网站wordpress静态生成
  • dw做网站设计我想克隆个网站 怎么做
  • 做二维码签到的网站山西网站建设服务公司
  • 重庆招聘网站有哪些电子商务概念
  • 网站没有设置关键词企业网站打不开了
  • 上海网站seo排名优化建筑设计文字说明
  • 企业名录是什么重庆百度快照优化排名
  • 个人网站有哪些站北京网站建设公司司
  • wordpress老站开启多站点品牌网站建设4a小蝌蚪
  • 寻花问柳一家专门做男人的网站嘉兴小程序开发公司
  • 上海网站建设报价书wordpress tag 404
  • 北京网站建设报价表店面设计费用
  • 网站建设客户需求分析长沙学校网站建设
  • 柳州做网站的公司有哪些电脑软件推广联盟
  • 广东微信网站制作公司软件开发项目流程
  • 都哪些网站可以做gif网站公司怎么做运营
  • 北京论坛网站建设有了域名搭建网站详细步骤
  • 广东融都建设有限公司 公司网站nodejs适合网站开发
  • 360平台怎么做网站优化电脑软件开发是什么专业
  • 百度新闻源网站公司网站app怎么做
  • 做影视网站什么cms好用wordpress 安装主题 主机名
  • 网站建设试卷摄影东营新闻最新消息
  • phpcms 手机网站模板杭州建设网点地址查询
  • 网站手机版跳转 seo微信公众号的微网站怎么做
  • 黑龙江省建设厅网站站长鞍山网站制作谁家好
  • 虚拟主机WordPress建站企业网站推广阶段