Docker学习笔记3 -- 数据卷
1. Docker 进入容器
某些时候需要进入容器进行操作,使用 docker exec 命令
docker exec -it 容器ID(Names)bash
-i -t 参数 docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。当 -i -t 参数一起使用时,则可以看到我们熟悉的Linux命令提示符。
示例:
进入容器,对默认的tomcat进行页面修改,然后再访问查看效果。
- 注意默认容器内linux包是最小安装。只拥有最基本的命令,比如执行ll就会说找不到命令。
- exit,不会导致容器的停止
docker exec -it tomcat1 bash //进入容器名称叫tomcat1
cd webapps // 进入到webapps文件夹下
mkdir ROOT // 新建目录
echo 'hello docker'>>index.jsp //对容器内的index.jsp进行字符串追加
2. 数据卷(容器数据管理)
在之前的tomcat案例中,修改ROOT里边的html页面时,需要进入tomcat内部。并且因为没有编辑器,修改文件也很麻烦。
这就是因为容器与数据(容器内文件)耦合带来的后果。
要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。
2.1.1. 什么是数据卷
数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/local/tomcat/webapps/ROOT目录了
为什么需要数据卷?
- 不能在宿主机上很方便地访问容器中的文件。
- 无法在多个容器之间共享数据。
- 当容器删除时,容器中产生的数据将丢失。
使用数据卷的最佳场景
- 在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载同一个数据卷,从而共享数据卷中的数据。
- 当宿主机不能保证一定存在某个目录或一些固定路径的文件时,使用数据卷可以规避这种限制带来的问题。
- 当你想把容器中的数据存储在宿主机之外的地方时,比如远程主机上或云存储上。
- 当你需要把容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。
2.1.2. 数据卷操作命令
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
2.1.3. 创建和查看数据卷
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
① 创建数据卷
docker volume create html
② 查看所有数据
docker volume ls
结果:
③ 查看数据卷详细信息卷
docker volume inspect html
结果:
可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data
目录。
小结:
数据卷的作用:
- 将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
- docker volume create:创建数据卷
- docker volume ls:查看所有数据卷
- docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置
- docker volume rm:删除指定数据卷
- docker volume prune:删除所有未使用的数据卷
2.1.4. 挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:8080
tomcat \
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中,这是采用数据卷方式,真正的目录在/var/lib/docker/volumes/html/_data
还可以采用路径的方式:
docker run -d -p 8080:8080 --name tomcat-8080 -v /opt/html:/usr/local/tomcat/webapps tomcat
也就是说,在opt目录下创建数据卷html,然后指定路挂载。
2.1.5. 案例-给tomcat挂载数据卷
需求:创建一个tomcat容器,修改容器内的ROOT目录内的index.html内容
分析:上个案例中,我们进入tomcat容器内部,已经知道tomcat的html目录所在位置/usr/local/tomcat/webapps/ROOT/index.html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用 -v 参数挂载数据卷
步骤:
① 创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -v html:/usr/local/tomcat/webapps/ROOT -p 8080:8080 -d tomcat
② 进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
如果使用路径的方式挂载,就直接进入到/opt/html里边改内容就行了。