卷技术,容器内部数据映射到宿主机上
一、直接使用命令来挂载
docker run -it -v /home/test:/home centos /bin/bash# 在主机上查看 docker运行容器的id
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4acd8cae254 centos "/bin/bash" 3 minutes ago Up 3 minutes zen_khorana# docker inspect id 查看详细信息
[root@localhost home]# docker inspect b4acd8cae254#卷挂载的信息
"Mounts": [{"Type": "bind","Source": "/home/test", # 挂载到宿主机的位置"Destination": "/home", # 容器内映射的位置"Mode": "","RW": true,"Propagation": "rprivate"}],touch [name] #创建文件 容器内的数据映射到外部,容器销毁,宿主机数据一直存在
二、 挂载mysql
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --name mysql01# -d 后台运行
# -p 端口映射
# -v 卷挂载 宿主机位置:容器内位置
# -e 环境配置
# --name 容器起名字# mysql需要配置密码
#官方文档 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
测试能否链接上 SQLyog
三、具名挂载、匿名挂载
# 不指定主机名 匿名挂载
docker run -d -P --name nginx1 -v etc/nginx nginx# 查看所有valume情况
[root@localhost home]# docker volume ls# -v 只指定容器内地址不指定容器外地址,就是匿名挂载#具名挂载
docker run -d -P --name nginx1 -v nginx123:etc/nginx nginx
#通过 -v 卷名:容器内路径
#查看卷位置 docker volume inspect [卷名][{"CreatedAt": "2020-08-16T17:59:07+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/e8eccd16213b4e53b86aa0bc752d857cbafa72b825ca308902dd5a050650f140/_data","Name": "e8eccd16213b4e53b86aa0bc752d857cbafa72b825ca308902dd5a050650f140","Options": null,"Scope": "local"}
]# 如何确定是具名挂载、匿名挂载还是指定路径挂载-v 容器内路径 #匿名挂载-v 卷名:容器内路径 #具名挂载-v /宿主机路径:容器内路径 #指定路径挂载拓展docker run -d -P --name nginx1 -v etc/nginx:ro nginx # readonly 只读,容器无写入权限docker run -d -P --name nginx1 -v etc/nginx:rw nginx # readwrite
初识dockerfile
方式二 通过写dockerfile脚本生成镜像 镜像是一层一层的,脚本是一个一个的命令,每个命令都是一层!
[root@localhost home]# mkdir docker-test-volume
[root@localhost home]# cd /docker-test-volume
[root@localhost docker-test-volume]#
[root@localhost docker-test-volume]# vi dockerfile1# 编写 dockerfile1
# 指令(大写) 参数
FROM centos
VOlUME ["volume01","volume02"] # 挂载数据卷CMD echo "---end-------"
CMD /bin/bash# 一个命令就是一层
# docker build 打包一个镜像
[root@localhost docker-test-volume]# docker build -f dockerfile1 -t pengfan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos---> 831691599b88
Step 2/4 : VOlUME ["volume01","volume02"]---> Running in 37c39d353766
Removing intermediate container 37c39d353766---> 351c24fa9941
Step 3/4 : CMD echo "---end-------"---> Running in a5b0ac086790
Removing intermediate container a5b0ac086790---> 1bbd39e24a13
Step 4/4 : CMD /bin/bash---> Running in d3824b5a82b9
Removing intermediate container d3824b5a82b9---> 5e8cb90b06da
Successfully built 5e8cb90b06da
Successfully tagged pengfan/centos:1.0
[root@localhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pengfan/centos 1.0 5e8cb90b06da 13 seconds ago 215MB
mysql 5.7 718a6da099d8 11 days ago 448MB
nginx latest 8cf1bfb43ff5 3 weeks ago 132MB
centos latest 831691599b88 2 months ago 215MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
[root@localhost docker-test-volume]#
数据卷容器 多个mysql数据同步
# docker run [id/name]
[root@localhost docker-test-volume]# docker run -d --name pengfan01 5e8cb90b06da /bin/bash
9a16192911e5d14a6781cfa544670a4482ed3904bb8032c5af046690efafca0a
[root@localhost docker-test-volume]# # 新创建的pengfan02继承pengfan01的卷内容。 pengfan01的卷改变 pengfan02的卷也改变
[root@localhost docker-test-volume]# docker run -d --name pengfan02 --volumes-from pengfan01 5e8cb90b06da /bin/bash
8e81553ba701ab5c8f32d0d6c16635d7d0488fba6f8ed77ec32e2118c00d9239
多个mysql实现数据共享
# 启动mysql01容器并创建卷挂载
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 /bin/bash# 启动mysql02备份mysql01
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7 /bin/bash
结论
容器之间的信息传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦转化到了本地,这个时候,本地的数据是不会删除的!