docker数据管理
/* 如果我们只是单单在容器里写东西,那我们将容器关闭或是退出时,很可能内容就已经不存在了。 -- 特别是MySQL之类的数据。 为了对数据进行很好的管理, 我们可以将宿主机的目录挂载到容器里, 就相当于 == 我们直接在此目录里写数据。 */
/* 1.挂载本地的目录到容器里*/
[root@localhost ~]# mkdir /data/ //将宿主机的/data/与容器的/data1/相挂载在centos容器里 [root@localhost ~]# docker run -itd -v /data/:/data1/ centos bash 086aa99f34aa0b39f71bedab8dca92b48be35a3f99e680f09fd37968d2f87c5c //实验:在宿主机里创建新文档,写入新内容 [root@localhost ~]# touch /data/1.txt [root@localhost ~]# echo "111hjsdhs" > /data/1.txt //进入容器 [root@localhost ~]# docker exec -it 086 bash [root@086aa99f34aa /]# ls /data1/ //拥有与宿主机里内容相同的文档 1.txt [root@086aa99f34aa /]# cat /data1/1.txt 111hjsdhs //实验2: 再在宿主机里创建新文档 [root@086aa99f34aa /]# touch /data1/2.txt [root@086aa99f34aa /]# exit //回到宿主机,新文档更新 [root@localhost ~]# ls /data/ 1.txt 2.txt //关闭容器,数据依然存在 [root@localhost ~]# docker stop 086 086 [root@localhost ~]# ls /data/ 1.txt 2.txt //删除容器,数据依然存在 [root@localhost ~]# docker rm 086 086 [root@localhost ~]# ls /data/ 1.txt 2.txt
/* 2.挂载数据卷 */ [root@localhost ~]# docker run -itd -v /data/:/data1/ centos bash 30c1fec5df6a2cbcfa4de6a7c5c074ed00bd42d4b9b3ad28ab9808acfd3d0d9b [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30c1fec5df6a centos "bash" 5 seconds ago Up 4 seconds stoic_bartik /* 通过容器name进入容器 容器name可以利用 -m来自定义 ,如果不自定义则随机定义 */ [root@localhost ~]# docker run -itd --volumes-from stoic_bartik centos bash ad8cca1e071122b33677255e82709e2c7fa51f3062a8333f61e9e384c3e1a4a7 //就会新生成一个有联系的容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ad8cca1e0711 centos "bash" 8 seconds ago Up 7 seconds romantic_morse 30c1fec5df6a centos "bash" About a minute ago Up About a minute stoic_bartik //进入利用 “容器name" 创建的容器 [root@localhost ~]# docker exec -it ad8 bash [root@ad8cca1e0711 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/docker-253:0-785932-ad8cca1e071122b33677255e82709e2c7fa51f3062a8333f61e9e384c3e1a4a7 9.8G 231M 9.0G 3% / tmpfs 495M 0 495M 0% /dev shm 64M 0 64M 0% /dev/shm /dev/mapper/VolGroup-lv_root 18G 2.6G 14G 16% /data1 [root@ad8cca1e0711 /]# ls /data1/ 1.txt 2.txt //在容器里新创建文档 [root@ad8cca1e0711 /]# touch /data1/3.txt [root@ad8cca1e0711 /]# ls -l /data1/ total 4 -rw-r--r--. 1 root root 10 Aug 30 09:04 1.txt -rw-r--r--. 1 root root 0 Aug 30 09:04 2.txt -rw-r--r--. 1 root root 0 Aug 30 09:31 3.txt [root@ad8cca1e0711 /]# exit //宿主机也更新了新文档 [root@localhost ~]# ls /data/ 1.txt 2.txt 3.txt [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ad8cca1e0711 centos "bash" 3 minutes ago Up 3 minutes romantic_morse 30c1fec5df6a centos "bash" 4 minutes ago Up 4 minutes stoic_bartik //进入另外一个相同的容器 [root@localhost ~]# docker exec -it 30c bash [root@30c1fec5df6a /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/docker-253:0-785932-30c1fec5df6a2cbcfa4de6a7c5c074ed00bd42d4b9b3ad28ab9808acfd3d0d9b 9.8G 231M 9.0G 3% / tmpfs 495M 0 495M 0% /dev shm 64M 0 64M 0% /dev/shm /dev/mapper/VolGroup-lv_root 18G 2.6G 14G 16% /data1 //同样也更新的文档 [root@30c1fec5df6a /]# ls /data1/ 1.txt 2.txt 3.txt [root@30c1fec5df6a /]#
/* 3.定义数据卷容器 */ /* 作用 : 只为多个容器之间共享数据 -- 类似于Linux里的NFS 搭建专门的数据卷容器,然后把此数据卷容器挂载到其他的容器里 */ //1. 使用了“frankie” 作为command,产生了错误,但是执行成功 [root@localhost ~]# docker run -itd -v /data/ --name centos_test centos frankie 1f232f72aa9345a6ce1bbb729e8885de11ba18825051a41f86ed5c08dbf66a7b Error response from daemon: Cannot start container 1f232f72aa9345a6ce1bbb729e8885de11ba18825051a41f86ed5c08dbf66a7b: [8] System error: exec: "frankie": executable file not found in $PATH [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f232f72aa93 centos "frankie" About a minute ago centos_test //2.依然使用“bash”作为command [root@localhost ~]# docker run -itd -v /data/ --name centos_test centos bash 76eaea452f3f0155777560bb5ec61ccbc36d57a282226419d5390d2335c42598 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76eaea452f3f centos "bash" 5 seconds ago Up 4 seconds centos_test ====================================== //进入容器 // /data/目录下什么东西都没有 [root@localhost ~]# docker exec -it centos_test bash [root@76eaea452f3f /]# ls /data/ [root@76eaea452f3f /]# exit //而在宿主机的/data/目录下还存在文件 [root@localhost ~]# ls /data/ 1.txt 2.txt 3.txt /* 结论: -v + 目录 --name + 自定义的镜像名 此方式 -v 选项相当于 == 为容器里创建了一个新的目录,以方便共享数据 */
//继续实验 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ac7891f5926b centos "bash" 6 minutes ago Up 6 minutes angry_mcclintock [root@localhost ~]# docker exec -it ac7 bash [root@ac7891f5926b /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/docker-253:0-785932-ac7891f5926b03efefe34936c052d3297b10422e5a37c94dcbda6bb7ae23d497 9.8G 231M 9.0G 3% / tmpfs 495M 0 495M 0% /dev shm 64M 0 64M 0% /dev/shm /dev/mapper/VolGroup-lv_root 18G 2.6G 14G 16% /data //在数据卷的容器里进行创建文档 [root@ac7891f5926b /]# ls /data/ [root@ac7891f5926b /]# mkdir /data/test [root@ac7891f5926b /]# mkdir /data/test/frankie [root@ac7891f5926b /]# touch frankie.txt [root@ac7891f5926b /]# exit //进入初始的容器里,新文档更新 [root@localhost ~]# docker exec -it centos_test bash [root@76eaea452f3f /]# ls /data/ test [root@76eaea452f3f /]# ls /data/test/ frankie /* 可以利用最初始的容器进行创建镜像 这些镜像就可以共享到数据卷容器的数据。 -- 可以利用脚本进行批量创建 */ [root@localhost ~]# docker run -itd --volumes-from centos_test --name=web2 centos bash e9f404f7b61d5093e9b57e10551561179a21c6d36c4d3673f12b34ab2d44582a [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e9f404f7b61d centos "bash" 7 seconds ago Up 5 seconds web2 [root@localhost ~]# docker run -itd --volumes-from centos_test --name=web3 centos bash 7e015daeb32d15462725f47ab9d344e5b88ae7e1efcd7e385cc8ae6a1444c6e1