侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker-容器数据卷

再见理想
2022-05-25 / 0 评论 / 0 点赞 / 348 阅读 / 837 字

一,什么是数据卷

在 Docker中,要想实现数据的持久化,即数据不随着Container的结束而结束,需要将数据从宿主机挂载到容器中。
已绑定的主机目录(数据卷)和容器目录下的数据会双向同步。
所有 docker 容器内的卷,没有只读目录的情况下,默认存放在以下目录:

/var/lib/docker/volumes/卷名/_data

二,数据卷基础命令

创建数据卷

# 命令
docker volume create [数据卷]

查看数据卷详情

# 命令
docker volume inspect  [数据卷名称]

# 使用示例
[root@iZwz94h5335bugr370qrb1Z ~]# docker volume inspect mysql-conf
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql-conf/_data",
        "Name": "mysql-conf",
        "Options": {},
        "Scope": "local"
    }
]

查看所有数据卷

# 命令
docker volume ls

删除未被任何容器使用的数据卷

# 命令
docker volume prune

删除一个或多个数据卷

# 命令
docker volume rm [数据卷]
  -f   强制删除

三,挂载数据卷

通过 -v 命令挂载数据卷。

方式一:匿名挂载

挂载命令 -v 只写了容器内路径,没有写主机数据卷的路径或指定名称,默认是随机的一串字符。

# 命令
-v 容器内路径

# 使用示例
docker run -p 3307:3306 -d 
-v /etc/mysql/conf.d 
-v /var/lib/mysql 
--name mysql3307 
-e MYSQL_ROOT_PASSWORD=admin 
mysql_lzh:1.0

方式二:具名挂载

挂载命令 -v 中,指定主机数据卷名称。

# 命令
-v 卷名:容器内路径

# 使用示例
docker run -p 3307:3306 -d 
-v mysql-conf:/etc/mysql/conf.d 
-v mysql-data:/var/lib/mysql 
--name mysql3307 
-e MYSQL_ROOT_PASSWORD=admin 
mysql_lzh:1.0

通过 docker volume ls 查看数据卷列表:
image.png
可以看到,匿名挂载会在 /var/lib/docker/volumes/ 目录下生成的 volume name 是很长的字符串,而具名挂载则会指定 volume name。

方式三:指定路径挂载

# 命令
-v /主机目录:容器内目录

# 使用示例
# 启动 mysql 并进行目录挂载
docker run 
-p 3306:3306 
-d 
--name mysql3306 
-v /java/mysql/conf:/etc/mysql/conf.d 
-v /java/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=admin 
mysql:5.7

启动起来后可以通过 docker inspect 容器 查看是否绑定成功。成功绑定的主机目录和容器目录的数据会进行同步。
image.png

扩展:
-v 最后拼上 :ro 或 :rw 进行权限配置。
ro:只读,容器内无法进行操作,需在宿主机操作;
rw:可读写。

docker run 
-p 3306:3306 
-d 
--name mysql3306 
-v /java/mysql/conf:/etc/mysql/conf.d:rw
-v /java/mysql/data:/var/lib/mysql:rw
-e MYSQL_ROOT_PASSWORD=admin 
mysql:5.7

思考:如何确定容器内哪个目录需要挂载到主机数据卷?
Java 工程如何挂载日志文件?

四,数据卷容器

两个或多个容器间的数据共享,可用作容器的备份。

# 命令
--volumes-from

# 使用示例
# 创建容器mysql3307
docker run 
-p 3307:3306 -d 
-v mysql-volume:/java
--name mysql3307 
-e MYSQL_ROOT_PASSWORD=admin 
mysql_lzh:1.0

# 创建容器mysql3308,挂载 mysql3307 的数据卷
# mysql3308和mysql3307容器共享的/java目录下的数据会相互同步
docker run 
-p 3308:3306 -d 
--volumes-from mysql3307 
--name mysql3308 
-e MYSQL_ROOT_PASSWORD=admin 
mysql_lzh:1.0
0

评论区