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内部。并且因为没有编辑器,修改文件也很麻烦。

这就是因为容器与数据(容器内文件)耦合带来的后果。

Docker学习笔记3 -- 数据卷

要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。

2.1.1. 什么是数据卷

数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。

Docker学习笔记3 -- 数据卷

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

这样,我们操作宿主机的/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学习笔记3 -- 数据卷
③ 查看数据卷详细信息卷

docker volume inspect html

结果:
Docker学习笔记3 -- 数据卷

可以看到,我们创建的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里边改内容就行了。

上一篇:java – Spring MongoTemplate – 将聚合结果映射到集合(例如List和Map)


下一篇:GFS 分布式文件系统