/*
如果我们只是单单在容器里写东西,那我们将容器关闭或是退出时,很可能内容就已经不存在了。 -- 特别是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