Docker 持久化
Volume
- Data Volume:由Docker管理,持久化数据的最好方式
- Bind Mount 由用户指定存储的数据具体在系统什么位置
container内部是read-only image + read-write layer
dockerfile里:Volume ["/app"]
# 将container里的/data目录下的存放到宿主机Mountpoint中
docker volume ls
docker volume inspect [ID]
# Mountpoint 存放着docker的存储数据
more [Mountpoint_location]
docker rm -f [containerID]
docker volume prune
# remove all local volumes not used by at least one container
docker run -d -v volume_data_name:/app my_container
# -v: 指定name:/container内部location
docker volume inspect volume_data_name
e.g. MYSQL多个container公用一个存储空间
docker pull mysql:5.7 docker run --name mysqlcontainer -e MYSQL_ROOT_PASSWORD=my-secret-pwd -d -v mysql-data:/var/lib/mysql mysql:5.7 docker volume ls docker volume inspect mysql-data docker exec -it mysqlcontainer sh mysql -u root -p my-secret-pwd create databse demo exit exit docker rm -f mysqlcontainer docker run --name mysqlcontainer -e MYSQL_ROOT_PASSWORD=my-secret-pwd -d -v mysql-data:/var/lib/mysql mysql:5.7 新建立的container会看到和已删除的container一样的数据库,因为volume路径一样
docker system prune -f
# -f : force
- 停止的容器:删除所有已经停止的容器。
- 未使用的镜像:删除所有未被任何容器使用的镜像。
- 未使用的网络:删除所有未被任何容器使用的网络。
- 未使用的挂载卷:删除所有没有被挂载的卷。
Bind Mount 挂载
docker run -d -v $(pwd):/app my-cron
# 使用-v 直接把本地目录bind存储空间
docker run -d -v /home/user/myapp:/app -v /home/user/config:/config my-cron
# bind多个目录
如果是用-v,可以不用在dockerfile里写Volume,那是不使用-v的时候的默认存储地方
多个机器之间容器共享数据 sshfs
112机器和108机器之间共享数据e.g.
both: docker plugin install --grant-all-permissions vieux/sshfs
on 112: 【只能使用password,是sshfs的bug】
docker volume create --driver vieux/sshfs \ -o sshcmd=root@192.168.2.108:/home/v \ -o password=123456 \ sshvolume
创建容器挂载volume:
docker run -it -v sshvolume:/app busybox sh cd /app echo "this is me " > test.txt
这样,实现112上的docker container写入108的目录