1. 将容器中的目录挂载到Linux本地
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:
docker run -it -v 主机目录:容器目录
#安装redis镜像,挂载redis中/home目录到 Linux中的/home/redis下
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it --name=redis -p6379:6379 -v /home/redis:/home redis
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]#docker inspect 容器id
挂载成功
2.匿名挂载和具名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
# 查看所有volume的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
# 具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-08-12T18:15:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
3.mysql目录挂载
# 获取镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7
# 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意)
# 官方测试, docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
# 启动我们的
-d # 后台运行
-p # 端口隐射
-v # 卷挂载
-e # 环境配置
--name # 容器的名字
# -v /home/mysql/conf:/etc/mysql/conf.d:ro或rw权限(默认rw)
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
9552bf4eb2b69a2ccd344b5ba5965da4d97b19f2e1a78626ac1f2f8d276fc2ba
# 启动成功之后,我们在本地使用navicat链接测试一下
# navicat链接到服务器的3306 --- 3306 和 容器的3306映射,这个时候我们就可以连接上mysql喽!
# 在本地测试创建一个数据库,查看下我们的路径是否ok!
3.数据卷容器 多个mysql数据同步
ps 只作为一个数据卷容器的案例 实际是不合理的。
docker run -d -p 3306:3306 -v conf:/etc/mysql/conf.d -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWARD=12345 --name mysql02 --volumes-from mysql01 mysql:5.7
启动以后会发现mysql02连接不上,查看下日志会发现
mysql不支持共享InnoDB data
2021-08-17T06:28:53.285640074Z 2021-08-17T06:28:53.285416Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2021-08-17T06:28:53.285693803Z 2021-08-17T06:28:53.285463Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2021-08-17T06:28:54.286211252Z 2021-08-17T06:28:54.285979Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2021-08-17T06:28:54.286270106Z 2021-08-17T06:28:54.286027Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2021-08-17T06:28:55.286852659Z 2021-08-17T06:28:55.286623Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2021-08-17T06:28:55.286910685Z 2021-08-17T06:28:55.286670Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.