什么是容器数据卷?

数据?如果数据都在容器中,那么我们容器一删除,数据就会丢失。需求:数据可以持久化。
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。
总结一句话:容器的持久化和同步操作。

使用数据卷

  1. 使用命令挂载
    1. docker run -it -v [主机目录]:[容器目录] [镜像] [命令]
    2. #一个例子
    3. docker run -it -v /home/test:/volume centos:latest /bin/bash
    4. docker inspect [容器id] #可以看到容器信息

容器数据卷 - 图1

Mysql数据同步

  1. #注意mysql需要设置密码
  2. #-e 环境变量
  3. docker run -d -p 3310:3306 \
  4. -v /home/mysql/conf:/etc/mysql/conf.d \
  5. -v /home/mysql/data:/var/lib/mysql \
  6. -e MYSQL_ROOT_PASSWORD=123456 \
  7. --name=mysql-test \
  8. mysql:5.7
  9. #之前有一次密码设置没有成功,是要加引号吧
  10. -e MYSQL_ROOT_PASSWORD='Root123!@$'
  11. #navicat无法连接,哭了
  12. #尝试了网上给出的解决办法都不行
  13. docker exec -it mysql-test /bin/bash
  14. mysql -u root -p
  15. #输入密码123456
  16. select host,user,plugin,authentication_string from mysql.user;
  17. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  18. grant all privileges on *.* to 'root'@'%' ;
  19. flush privileges;
  20. #提示10060 UNKNOWN ERROR

就算容器删除,本地的数据也都还在,实现了数据的持久化存储。

具名和匿名挂载

即是否指定volume的名字

  1. #匿名挂载
  2. -v [容器内路径]
  3. docker run -d -P --name nginx-test-01 -v /etc/nginx nginx
  4. #查看volume
  5. docker volume ls
  6. (base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume ls
  7. DRIVER VOLUME NAME
  8. local 0e1a26d1b73da328799b29c7babb19997c6ca3ad7da2053bb83298c346135979
  9. local 0eb47cb4500fdc7e3045e9eb11898df4dba3c561d3e2722f3dd37e9b26edbdea
  10. ......
  11. #像这种volume name一串的就是匿名挂载
  12. #具名挂载
  13. #volume-name,前面没有斜杠,就不是指定宿主机路径,而是volume名字
  14. docker run -d -P --name nginx-test-02 -v volume-name:/etc/nginx nginx
  15. (base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume ls
  16. DRIVER VOLUME NAME
  17. ......
  18. local volume-name
  19. #可以看到这里新增加的一条的volume名字
  20. #用下面命令可以看到挂载的具体位置
  21. (base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume inspect volume-name
  22. [
  23. {
  24. "CreatedAt": "2021-05-15T20:00:10+08:00",
  25. "Driver": "local",
  26. "Labels": null,
  27. "Mountpoint": "/var/lib/docker/volumes/volume-name/_data",
  28. "Name": "volume-name",
  29. "Options": null,
  30. "Scope": "local"
  31. }
  32. ]
  33. (base) [root@izuf64eqyhnvmcv50ay73gz home]#

所有docker容器的卷,没有指定目录的情况下,都是在/var/lib/docker/volumes/…里

平时为什么/var/lib/docker/volumes里有那么多文件,我觉得就是因为镜像本身创建的时候指定了volume(参考下面Dockerfile的第一个例子),虽然我们run的时候没有把挂载显式写在命令里面,还是自动做了匿名挂载。使用docker inspect [容器id]命令,可以看到mounts里的信息。

  1. # 修改数据卷的读写权限
  2. # -v [卷名]:[容器内路径]:[权限]
  3. # ro read only
  4. # rw read write
  5. # 一旦在这里设置了权限,容器对我们挂载出来的文件的操作就有限制。
  6. docker run -d -P --name nginx-test3 -v nginx3-vol:/etc/nginx:ro nginx
  7. docker run -d -P --name nginx-test4 -v nginx4-vol:/etc/nginx:rw nginx
  8. # ro 只能从外部改变,只能从宿主机操作

初识Dockerfile

Dockerfile就是用来构建docker镜像的文件。命令脚本。
镜像的一层一层,就是脚本里的一个个命令。

  1. FROM centos
  2. VOLUME ["volume01","volume02"]
  3. CMD echo "---end---"
  4. CMD /bin/bash
  1. #注意最后有一个点
  2. docker build -t my-centos:v0.1 .
  3. #-f 指定Dockerfile位置,可以不叫“Dockerfile”
  4. docker build -f /home/docker-test-volume/Dockerfile -t my-centos:v0.1 .

数据卷容器

多个容器同步数据,数据卷的生命周期一直持续到没有容器使用为止。
可以实现配置信息的传递等

  1. docker run -itd --name docker01 test-0515:v0.1
  2. docker run -itd --name docker02 --volumes-from docker01 test-0515:v0.1
  3. #两个容器,/volume01和/volume02中的文件同步
  4. #如果把docker01这个容器删掉,docker02中的文件还在,所以相当于docker02通过指定--volumes-from挂载到了与docker01相同的主机目录