我们都知道,容器中是有数据的,如果我们将容器删除,数据就会丢失,就好比我们的MySQL服务容器,我们把容器删了,数据就没了,删库跑路都不用 rm -rf /* 命令的,所以,我们需要一种可以把容器中的文件同步到本地中,这样,即使删除了容器,数据依旧存在,这便就是卷技术,总的来说,就是容器的持久化和同步操作,容器之间也可以数据共享.
使用方法:
docker run -it v 主机目录:容器目录 [-v 主机目录:容器目录 -v 主机目录:容器目录 .....]
比如:
docker run -it -v G:\docker:/home centos /bin/bash
docker inspect 容器id
好处:
我们以后,比如说docker中的一个配置文件,我们需要频繁修改,那么我们可以使用容器卷技术,在主机修改,同步到容器中.
启动mysql容器,挂载两个目录:
docker run -d -p 3306:3306 -v G:\docker\mysql\conf:/etc/mysql/conf -v G:\docker\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run 启动容器
-d 后台启动
-p 映射端口
-v 数据卷挂载 可挂载多个目录
-e 环境配置
--name 定义名字
我们可以看到挂载到本地的mysql的data目录已经同步了数据;
创建一个数据库:
docker run -d -p 主机端口:容器端口 --name="name" -v 卷名:容器路径
如果你使用的是windows版本的docker,具名挂载之后,是找不到路径的(至少我没找到,有知道的小伙伴可以评论留言告诉我),但是linux版本的docker可以.所有docker的容器卷,在没有指定路径的情况下,存放在:
/var/lib/docker/volumes/卷名
其数据存放在_data目录下:
/var/lib/docker/volumes/卷名/_data
查看挂载地址:
docker volume inspect 卷名
我们通过具名挂载可以方便的找到我们的卷,这也是常用的挂载方法.
#不写主机路径
docker run -d -p 主机端口:容器端口 --name="name" -v 容器路径
我们来使用命令查看挂载情况:
docker volume [OPTIONS]
OPTIONS说明:
create 创建卷
inspect 显示一个或多个卷的详细信息
ls 查看卷列表
prune 删除所有未使用的本地卷
rm 删除一个或多个卷
#示例:
docker volume ls
区别:
命令 | 挂载方式 |
---|---|
-v 容器内路径 | 匿名挂载 |
-v 卷名:容器路径 | 具名挂载 |
-v /主机路径:容器路径 | 指定路径挂载 |
扩展:
#ro readonly 只读 文件只能通过主机修改内容
docker run -d -p 8080:80 -v nginxvolume:/etc/nginx:ro nginx
#rw readwrite 读写 默认值
docker run -d -p 8080:80 -v nginxvolume:/etc/nginx:rw nginx
DockerFile是用来构建docker镜像的脚本文件,通过这个脚本可以生成镜像,镜像是一层一层的,脚本是个个的命令,每个命令都是一层.
#镜像来源于哪个镜像
FROM centos
#挂载,只写容器内地址,匿名挂载
VOLUME ["volume01","volume02"]
#完毕之后输出end
CMD echo "----end----"
#进入bin/bash
CMD /bin/bash
启动镜像,查看目录结构,我们会发现两个挂载的目录,我们可以查看主机目录.
发现已经挂载成功,这样方式使用比较多,因为我们大多是都要构建自己的镜像.
如果我们想两个或者多个mysql同步数据,就需要用到数据卷容器技术,下面我们来测试一下,通过我们刚才制作的镜像,来启动三个容器.
#用此命令来实现容器文件共享
--volumes-from 父容器
我们接着创建第三个容器,让第三个容器与第二个容器实现数据共享:
接着修改父容器文件内容,查看两个子容器内容是否发生改变:
第二个容器:
我们可以看到,所有的容器都实现了数据共享.
假如我们把父容器删除了之后,两个子容器之间的数据会丢失吗?
验证:
查看子容器数据是否丢失:
结果:
是不会丢失数据的.
那如果父容器把文件删除之后,子容器的文件会被删除吗?
创建一个新文件:
删除文件
结果发现,子容器文件也随之消失了.
结论:
事件 | 结果 |
---|---|
删除父容器 | 子容器数据不会消失 |
删除父容器文件 | 子容器文件会随之消失 |
同理我们能够知道,子容器删除文件,父容器的文件也会随之消失.
两个mysql或者多个mysql实现数据同步:
docker run -d -p 3306:3306 -v G:\docker\mysql\conf:/etc/mysql/conf -v G:\docker\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3306:3306 -v G:\docker\mysql\conf:/etc/mysql/conf -v G:\docker\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 --name mysql02 mysql:5.7
数据卷容器的生命周期是直持续到没有容器使用为止。
如果你持久化到了本地,本地的数据是不会删除的.
DockerFile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
构建步骤:
1.编写一个DockerFile文件
2.使用docker build命令来执行脚本,构建镜像
3.使用docker run命令来运行我们构建的镜像
4.docker push 发布镜像,可以发送到docker hub 和阿里云镜像仓库里面
我们可以看到一串脚本,其中所有关键字都必须大写,比如刚开始的FROM,执行顺序和java一样,从上往下执行,可以用#注释,每一步操作都会生成一个镜像层.比如我们在基础镜像上安装了jdk,便会生成一个新的镜像层,安装玩tomcat,也会生成一个新的镜像层,容器进程的写入操作只在可写容器层中进行.
FROM #基础镜像,一切从这里开始,并且必须是第一条指令,如果不以任何镜像为基础,那么写法为:FROM scratch。
MAINTAINER #指定该镜像的作者,可以写成作者+邮箱的形式
RUN #运行指定的命令
ADD #添加文件
WORKDIR #设置工作目录
VOLUME #实现挂载功能
EXPOSE #暴露端口
CMD #容器启动时执行的命令,会被覆盖,且,如果有多个cmd命令,只会执行最后一个
ENTRYPOINT #启动时的默认命令,可追加命令
ONBUILD #命令只对当前镜像的子镜像生效,触发指令
COPY #将文件拷贝到镜像中
ENV #设置环境变量
首先,我们需要准备一个tomcat压缩包,tomcat是采用java语言编写的,所以,我们也需要一个java的压缩包.
如果你命名为Dockerfile构建时就不必-f指定文件,docker会自动寻找名字为Dockerfile的文件.
#指定该镜像从哪个镜像衍生而来
FROM centos
#作者信息
MAINTAINER onion<1805222511@qq.com>
#从主机拷贝test.txt文件到镜像中的local中的test.txt
COPY test.txt /usr/local/test.txt
#添加文件,会自动帮我们解压
ADD jdk-8u231-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.55.tar.gz /usr/local/
#运行指定的命令 安装vim工具
RUN yum -y install vim
#配置环境变量
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH
#设置java_home环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_231
#设置classpath环境变量,多个可用:隔开
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#配置tomcathome环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55
#配置tomcatbash环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.55
#配置系统环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_BASH/bin
#暴露端口
EXPOSE 8080
#容器启动时执行的命令,多个命令可以用&&符号连接
CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/bin/logs/catalina.out
如何查看安装包解压之后的文件名:
docker build -t tomcattest:1.0 .
docker build #构建镜像
-t #设置镜像的名字及标签
每一步操作都是一层镜像:
docker run -d --name tomcat01 -p 8080:8080 -v /home/tomcat/webapps:/usr/local/apache-tomcat-8.5.55/webapps -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.5.55/logs tomcattest:1.0
docker history 镜像