个人理解,数据卷是一个游离在docker之外的东西,他能持久化保存web项目上传的文件、图片、甚至是页面等;同时,因为访问的是docker容器之外的文件,所以也可以做到及时更新、文件共享、不影响原镜像、不会被docker删除等一系列“优点”;
数据卷的概念让我对docker有了一丝“怀疑”,但我有说不出问题点在哪…
挂载执行命令(docker -v)
下面是一个目录结构的截图,不涉及docker知识 ↓
如图,我在根目录下创建了“docker-v”文件夹(中间没有空格),在文件夹中创建ROOT子文件夹,ROOT中只有一个index.html,内容是“Hello Docker -v ! ”;
现在,在启动镜像生成容器的时候,将项目指到容器中,所以,执行过程是在run命令下的
docker run --name tomcat -p 8080:8080 -d -v /docker-v/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
docker run --name tomcat1 -p 8081:8080 -d -v /docker-v/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
这就启动了两个容器,-v后面的参数,左边是宿主机目录(linux目录),右边是容器目录,中间用冒号分割,不加空格;
含义是启动了一个名字为tomcat的镜像,两个容器将本身容器中的ROOT目录替换为了linux中的ROOT文件夹;
如果报错没有权限,如图所示
在执行run命令的时候加上 --privileged=true
参数,即
docker run -d -p 8081:8080 -v /docker-v/ROOT:/usr/local/tomcat/webapps/ROOT --privileged=true mydocker
以上是数据卷的内容,那将数据持久化其实就是将mysql或其他数据库以数据卷的形式部署,以达到数据持久化的目的。
下面我将以mysql为例再次说明挂载功能
安装MySQL
docker pull mysql 5.7.22
运行容器化的MySQL
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.22
注意:
MySQL搭好之后,有一个比较坑的限制,就是执行sql的时候不能超过1M,这个时候要更改MySQL的配置文件,/etc/mysql/mysql.conf.d/mysqld.cnf,追加一行“max_allowed_packet= 128M”
我们拷贝出mysql的配置文件到宿主机,然后就可以把宿主机当数据卷来公用数据库
docker cp mysql:/etc/mysql .
注意后面一个点意味着当前文件夹,移动内容到上级目录
mv *.* ..
这个时候我们可以用数据卷来“创建”数据库
查看日志
docker logs mydocker
监控日志变化(类似 tail -f catalina.out)
docker logs -f mydocker