Docker容器、数据卷和数据挂载
目录
Docker数据卷
Docker数据挂载
举例
修改容器文件内容
步骤一
进入容器。进入我们创建的的nginx容器的命令为:
docker exec -it mn bash
命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
步骤二
进入nginx的HTML所在目录 /usr/share/nginx/html
cd /usr/share/nginx/html
步骤三
修改index.html的内容
sed -i 's#Welcome to nginx#厚积薄发#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
效果
总结
- 查看容器状态:
- docker ps
- 添加-a参数查看所有状态的容器
- 删除容器:
- docker rm
- 不能删除运行中的容器,除非添加 -f 参数
- 进入容器:
- 命令是docker exec -it [容器名] [要执行的命令]
- exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的
Docker数据卷
容器与数据耦合的问题
数据卷
数据卷(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
Docker数据挂载
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录
举例
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
代码解读:
- docker run :就是创建并运行容器
- — name mn :给容器起个名字叫mn
- -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
- -p 8080:80 :把宿主机的8080端口映射到容器内的80端口
- nginx :镜像名称
案例
创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用 -v 参数挂载数据卷
1.创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
2.进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
总结
- 数据卷挂载方式:
- -v volumeName: /targetContainerPath
- 如果容器运行时volume不存在,会自动被创建出来
创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
- 提示:目录挂载与数据卷挂载的语法是类似的:
- -v [宿主机目录]:[容器内目录]
- -v [宿主机文件]:[容器内文件]
- 实现思路如下:
- 通过load命令加载为镜像
- 创建目录/tmp/mysql/data
- 创建目录/tmp/mysql/conf,将hmy.cnf文件上传到/tmp/mysql/conf
- 去DockerHub查阅资料,创建并运行MySQL容器,要求:
- 挂载/tmp/mysql/data到mysql容器内数据存储目录
- 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
- 设置MySQL密码
数据卷挂载的方式对比
总结
- docker run的命令中通过 -v 参数挂载文件或目录到容器中:
- -v volume名称:容器内目录
- -v 宿主机文件:容器内文件
- -v 宿主机目录:容器内目录
- 数据卷挂载与目录直接挂载的
- 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看