版权声明:fromZjy QQ1045152332 https://blog.csdn.net/qq_36762677/article/details/82181629
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储
层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者
绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发
生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷
后,容器可以随意删除、重新 run ,数据却不会丢失
镜像分层
[[[[接docker1内容]]]]]docker每一行都产生一个新层(RO:可读,RW:可写)
Volume 提供独立于容器之外的持久化存储
容器中的改动 缺省是不会保存的,Volume可以提供容器之间的共享数据
第一种持久化方式:
docker run -d --name nginx -v /usr/share/nginx/html nginx
容器运行之后检查 nginx为容器名
docker inspect nginx
mac下不能打开这个位置(linux下可以正常打开)
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
问题解决来源:stack overflow[mac下docker数据在哪里?]
第二种持久 数据卷
ps:
-p 把容器80端口映射为宿主8888端口
-v 把当前 $PWD/code 的目录 挂载到 容器内 /var/www/html
mkdir code
touch Dockerfile
docker build -t my-nginx .
docker run -d -p 8888:80 -v $PWD/code:/var/www/html my-nginx
mysql实例
docker run -p 3306:3306 --name mymysql-v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql-containername
在容器启动时 改变宿主机内文件内容 ,容器内容随之改变
第三种持久化方式
创建
unbuntu 为基础镜像,如果没有会从仓库下载,
mkdir data
docker create -v $PWD/data:/var/mydata --name data_container ubuntu
从另一个容器加载这个卷(ubuntu为基础镜像 -it)
docker run -it --volumes-from data_container ubuntu /bin/bash