docker理念:将应用和环境打包成一个镜像。
那数据保存在哪里呢?
如果数据都在容器中,那么我们容器删除,数据就会丢失。(比如在docker中安装了MySQL,如果容器删除了,数据就没了)
需求:数据可以持久化且MySQL数据可以存储在本地。
容器之间可以有一个数据共享的技术,将Docker容器中产生的数据,同步到本地,这就是卷技术。(其实就是目录的挂载,将我们容器内的目录,挂载到Linux上面)
总结:实现容器的持久化和同步操作,且容器间也是可以数据共享的。(多个容器绑定同一个目录,比如上图中的/home/mysql)
直接使用命令挂载 -v
-v, --volume list Bind mount a volume
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
➜ ~ docker run -it -v /home/ceshi:/home centos /bin/bash
#通过 docker inspect 容器id 查看
检查是否挂在成功:
此时在容器中存放的文件会自动同步到本机,在本机中存放的文件也会自动同步到容器中。
测试文件的同步:
若在主机中修改文件:
先停止容器
在容器中:
好处:我们以后修改只需要在本地修改即可,容器内会自动同步。
MySQL的数据存放在data目录下
运行容器时需要做数据挂载 (安装启动mysql,需要配置密码)
//-d 后台运行
//-p 端口映射
//-v 卷挂载
//-e 环境配置
//-- name 容器名字
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=1/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
打开Navicat进行测试连接:
Navicat----连接到服务器的3310端口----和容器内的3306端口映射
此时在本地创建数据库test,Linux服务器和docker中都映射了test数据库。所以之后的持久化是绑定到本地的。
假设我们将容器删除,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
删除后查看:
# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的卷的情况
docker volume ls
这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径。
# -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 查看一下这个卷
docker volume inspect juming-nginx
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data下。
#指定路径挂载 docker volume ls 是查看不到的
-v /宿主机路径:容器内路径
# 通过 -v 容器内路径:ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
dockerfile详见 DockerFile的构建和使用
简单理解:Dockerfile就是用来构建docker镜像的构建文件,是一段命令脚本。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令就是镜像的一层。
# 创建一个dockerfile文件,名字可以随便取,建议Dockerfile
cd /home/docker-test-volume
vim docerfile01
# 文件中的内容 指令(大写) 参数 ----(这里的每个命令,就是镜像的一层。)
FROM centos
VOLUME ["volume01","volume02"] #挂载
CMD echo "----end----"
CMD /bin/bash
#构建镜像
docker build -f /home/docker-test-volume/docerfile01 -t jess/centos .
#查看镜像
docker images
若需要在多个容器之间共享持续更新的数据,可使用数据卷容器。
数据卷容器也是容器,它专门提供数据卷以供其他容器挂载。
数据卷容器:使用特定容器维护数据卷
docker run it --name docker01 jess/centos #启动容器docker01
docker run it --name docker02 --volumes-from docker01 jess/centos #启动容器docker02,挂载docker01
#此时若在docker01里面创建一个文件,docker02也会相应的生成一个文件(同步),docker01就是数据卷容器
docker run it --name docker03 --volumes-from docker01 jess/centos #启动容器docker03,挂载docker01
#通过--volumes-from实现容器中的数据共享
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦持久化到了本地,本地的数据是不会删除的。