容器与数据耦合的问题
- 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
- 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
- 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
操作数据卷
基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
创建一个数据卷,并查看数据卷在宿主机的目录位置
创建数据卷
docker volume create html
查看所有数据卷
docker volume ls
查看数据卷详细信息卷
docker volume inspect html
挂载点
数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
- docker volume create 创建数据卷
- docker volume ls 查看所有数据卷
- docker volume inspect 查看指定数据卷的详细信息
- docker volume rm 删除指定数据卷
- docker volume prune 移除所有未使用的数据卷
挂载数据卷
创建容器时,可以通过 -v 参数来挂载一个数据卷到容器内某个目录
docker run \ # docker run :就是创建并运行容器 --name mn \ # --name mn :给容器起个名字叫mn -v html:/root/html \ # -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中 -p 8080:80 # -p 8080:80 :把宿主机的8080端口映射到容器内的80端口 nginx # nginx :镜像名称
创建一个nginx容器,修改容器内的html目录内的index.html内容
创建容器时,挂载数据卷(如果宿主机文件系统中不存在volume数据卷,会自动被创建)
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
查看html数据卷的位置
docker volume inspect html
进入该目录,修改文件
# 进入该目录 cd /var/lib/docker/volumes/html/_data # 修改文件 vi index.html
创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
在将本地mysql.tar文件上传到虚拟机,通过load命令加载为镜像
创建目录/tmp/mysql/data
mkdir -p /tmp/mysql/dat #多级目录创建
创建目录/tmp/mysql/conf
mkdir -p /tmp/mysql/conf #多级目录创建
hmy.cnf文件上传到/tmp/mysql/conf
去DockerHub查阅资料,创建并运行MySQL容器,要求:
挂载/tmp/mysql/data到mysql容器内数据存储目录
挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
docker run \ --name mysql \ -e MYSQL_ROOT_PASSWORD=root \ -p 3306:3306 \ -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ -v /tmp/mysql/data:/var/lib/mysql \ -d \ mysql:5.7.25
所需资料:mysql.tar(
链接:https://pan.baidu.com/s/1YUqKAcfmsOFx_DwGHD__AQ
提取码:p9rh
)、
hmy.cnf(
链接:https://pan.baidu.com/s/1XYLtsyMSfNyNO8tU9dPTXg
提取码:jgsp
)