一、基礎概念
? ? ? ? 1.docker數據卷是一個可供容器使用的特殊目錄,它繞過了容器的文件系統,直接將數據存在宿主機上。
? ? ? ? 2.docker數據卷的作用:
? ? ? ? ? ? ? ? 數據持久化:即使容器被刪除或重建數據卷中的數據仍然存在
? ? ? ? ? ? ? ? 數據共享:多個容器可以同時掛載同一個數據卷實現數據的共享和交互
? ? ? ? ? ? ? ? 獨立于容器生命周期:數據卷的生命周期獨立于容器,不受容器的啟動、停止和刪除的影響。
? ? ? ? 3.使用數據卷的原因:
? ? ? ? ? ? ? ? docker分層文件系統:
? ? ? ? ? ? ? ? ? ? ? ? 性能差并且生命周期和容器相同
? ? ? ? ? ? ? ? docker提供兩種卷:
? ? ? ? ? ? ? ? ? ? ? ? bind mount
? ? ? ? ? ? ? ? ? ? ? ? docker managed volume
? ? ? ? 4.bind mount數據卷:
? ? ? ? ? ? ? ? 將主機的目錄文件或文件mount到容器里
? ? ? ? ? ? ? ? 使用-v選項指定路徑,如果-v指定的路徑不存在掛載時會自動創建
? ? ? ? ? ? ? ? 示例:
[root@docker ~]# docker run -it --rm \
-v /tmp/data1:/data1 \
-v /tmp/data1:/data2:ro \
-v /etc/passwd:/data/passwd:ro busybox
/ # tail -n 3 /data/passwd
lee:x:1000:1000:lee:/home/lee:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:1001:1001::/home/nginx:/sbin/nologin
/ # touch /data1/leefile1
/ # touch /data2/leefile1
touch: /data2/leefile1: Read-only file system
? ? ? ? 5.docker managed數據卷:
? ? ? ? ? ? ? ? bind mount必須指定host文件系統路徑限制了移植性
? ? ? ? ? ? ? ? docker managed volume不需要指定mount源,docker自動為容器創建數據卷目錄
? ? ? ? ? ? ? ? 默認創建的數據卷目錄都在/var/lib/docker/volumes中
? ? ? ? ? ? ? ? 如果掛載時指向容器內已有的目錄,原有數據會被復制到volume中
? ? ? ? ? ? ? ? 示例:
[root@docker volumes]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD='lee'
mysql:5.7
[root@docker volumes]# ls -l /var/lib/docker/volumes
總用量 0
drwx-----x 3 root root 19 8月 20 16:34
ad74662b8d6bb6fdcc6e82925ae9942b94bac5f9da4bd52b0a14ac451ae9ef75
[root@docker volumes]# touch
ad74662b8d6bb6fdcc6e82925ae9942b94bac5f9da4bd52b0a14ac451ae9ef75/_data/leefile
[root@docker volumes]# docker exec -it mysql bash
bash-4.2# cd /var/lib/mysql
bash-4.2# ls
auto.cnf client-cert.pem ib_logfile0 ibtmp1 mysql.sock
public_key.pem sys
ca-key.pem client-key.pem ib_logfile1 leefile performance_schema server-
cert.pem
ca.pem ib_buffer_pool ibdata1 mysql private_key.pem server-
key.pem
bash-4.2# pwd
? ? ? ? ? ? ? ? docker volume prune:清理未使用的docker數據卷
? ? ? ? 建立數據卷:
? ? ? ? ? ? ? ? docker volume? create test,這條命令執行會在默認的數據卷目錄下(/var/lib/docker/volumes/)創建test目錄,并在該目錄下創建_data目錄
? ? ? ? 查看數據卷:
? ? ? ? ? ? ? ? docker volume ls,執行這條命令會查看到上述創建的數據卷
? ? ? ? 使用建立的數據卷:
? ? ? ? ? ? ? ? docker run -d --name web1 -p 80:80 -v test:/usr/share/nginx/html nginx
? ? ? ? 6.數據卷容器:
? ? ? ? ? ? ? ? 是docker中一種特殊的容器,主要方便的在多個容器之間共享數據卷。
? ? ? ? ? ? ? ? 建立數據卷容器:
[root@docker ~]# docker run -d --name datavol \
-v /tmp/data1:/data1:rw \
-v /tmp/data2:/data2:ro \
-v /etc/resolv.conf:/etc/hosts busybox
? ? ? ? ? ? ? ? 使用數據卷容器:
? ? ? ? ? ? ? ? ? ? ? ? docker run -it --name test --rm --volumes-from datavol? busybox
? ? ? ? 7.bind mount數據卷和docker managed數據卷對比:
? ? ? ? ? ? ? ? 相同點:兩者都是host文件系統中的某個路徑
? ? ? ? ? ? ? ? 不同點:
? ? ? ? 8.備份與遷移數據卷:
? ? ? ? ? ? ? ? 建立容器并指定使用卷要備份的容器:
? ? ? ? ? ? ? ? docker run --volumes-from? datavol? -v `pwd`:/backup? busybox? tar zcf /backup/data1.tar.gz? /data1? ? ? ? 將當前目錄掛載到本地容器中用于和容器交互保存要備份的容器,備份數據到本地
? ? ? ? ? ? ? ? 數據恢復:
docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -
c "tar zxf /backup/data1.tar.gz;/bin/sh"