版权声明:fromZjy QQ1045152332 https://blog.csdn.net/qq_36762677/article/details/88429114
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。
查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作。
所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失
镜像分层
[[[[接docker1内容]]]]]docker每一行都产生一个新层(RO:可读,RW:可写)
Volume 提供独立于容器之外的持久化存储
容器中的改动 缺省是不会保存的,Volume可以提供容器之间的共享数据
第一种持久化方式 -v:
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
问题解决来源 https://stackoverflow.com/questions/38532483/where-is-var-lib-docker-on-mac-os-x
第二种持久 数据卷
ps:
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-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