数据卷(Data Volumes)&dockerfile

目录

一、Docker运行MySQL容器

二、宿主机与容器之间的文件拷贝 

① 从宿主机拷贝文件到容器

② 从容器中拷贝文件到宿主机 

三、数据卷 

① 将宿主机的目录与容器的目录进行挂载,实现数据共享

四、数据卷容器 

① docker inspect  容器名 查看容器的详细信息

五、Dockerfile简介

六、Dockerfile制作增强版CentOS

① 自定义centos,具备vim及ifconfig作用(体会学习Dockerfile的意义) 

② 向mycentosDockerfile 编辑内容

③ 构建镜像

④ 通过镜像运行一个容器进行测试

七、Dockerfile制作自定义tomcat 

① 自定义tomcat8 (熟悉几乎所有的Docker命令)

② 向mytomcatDockerfile编辑内容

③ 构建镜像

 ④ 通过镜像运行2个容器进行测试


数据卷(Data Volumes)&dockerfile_第1张图片

这里快照拍好,打开我们的连接工具。 

一、Docker运行MySQL容器

在我们的虚拟机中,因为我们是还原到了最初下载的版本,所以我们目前是连接不到MySQL数据库的,如下图所示:

数据卷(Data Volumes)&dockerfile_第2张图片

 注意:这里我们执行以下代码MySQL就安装好了

 引言:利用MySQL镜像安装MySQL服务

docker run -p 3307:3306 --name mysql1   -di -v /home/javaxl/data/mysql/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/javaxl/data/mysql/data/:/var/lib/mysql -v /home/javaxl/data/mysql/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

数据卷(Data Volumes)&dockerfile_第3张图片

数据卷(Data Volumes)&dockerfile_第4张图片

数据卷(Data Volumes)&dockerfile_第5张图片

 注意:同时访问两个MySQL可能存在问题,但你要把之前的安装的MySQL给停掉,这样就不会出现冲突问题了

数据卷(Data Volumes)&dockerfile_第6张图片  

二、宿主机与容器之间的文件拷贝 

数据卷(Data Volumes)&dockerfile_第7张图片

① 从宿主机拷贝文件到容器

docker cp /javajwj/software/mydocker/apache-tomcat-8.5.20.tar.gz a51d94f75620:/usr/local/tomcat/webapps

 数据卷(Data Volumes)&dockerfile_第8张图片

数据卷(Data Volumes)&dockerfile_第9张图片 但这个方式它只能上传到宿主机。我们目前是把服务器里面的一些文件放到容器内部。

如果想把容器内部的文件放到宿主机上那该怎么办?因为我们跑的是一个tomcat容器,然后它日志只会放在容器内部而不会在宿主机上面,所以我们要把日志从容器中copy到宿主机上,在通过这个工具给下载下来。也会涉及到日志的反向操作

② 从容器中拷贝文件到宿主机 

docker cp a51d94f75620:/usr/local/tomcat/webapps/111.log /javajwj/software/mydocker

数据卷(Data Volumes)&dockerfile_第10张图片

 存在问题的:这样是非常麻烦的,因为容器里面的日志,你每运行一段时间,它会生成
一段,然后你copy出来的是你当前里面的内容,它这个日志是实时更新的,
也就是说拿出来的东西,不是实时更新,你要反复的去操作这个命令,是很麻烦的

三、数据卷 

数据卷(Data Volumes)

   数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器,

   它可以提供很多有用的特性:

   1.数据卷 可以在容器之间共享和重用

   2.对数据卷的修改会立马生效

   3.对数据卷的更新,不会影响镜像

   4.数据卷 默认会一直存在,即使容器被删除

 数据卷相关操作

   1.创建数据卷

     docker volume create my-vol

   

     此时,数据卷默认会放到/var/lib/docker/volumes路径下,会发现所新建的数据卷位置,查看命令如下:

     ## 参数可以为数字“1”,字母L:大小写均可,但效果不一样

     ls -1 /var/lib/docker/volumes

   2.查看所有的数据卷

     docker volume ls

   3.查看指定数据卷的详细信息(显示一个JSON格式的数据)

     docker volume inspect my-vol

   

   4.删除一个volume

     docker volume rm my-vol

    

     注1:数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,

          并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,

          所以要及时删除

   ## 挂载数据卷,最好是通过run而非create/start创建启动容器

   ## create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以

   5.启动一个挂载数据卷的容器

     ## demo1

     docker run -d \

       -it \

       --name tomcat01 \

       --mount source=my-vol,target=/webapp \

       centos:7

   

 注意:此行命令执行后的效果是,宿主机路径/var/lib/docker/volumes/my-vol/_data与tomcat01容器路径/webapp完成映射

     ## demo2

     docker run -d \

       -it \

       --name tomcat02 \

       --mount type=bind,source=/javaxl/data,target=/root/webapp02 \

       centos:7    

     注1:linux命令结尾加斜杠有什么用

          加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车

     注2:source=my-vol,target=/webapp

          my-vol为要挂载的数据卷,如果数据卷不存在,docker会自动创建

          /webapp为容器上目录,如果目录不存在, Docke会自动创建

     注3:mount选项高级用法

          --mount选项的type参数支持三种类型的数据卷

          --mount标志:由多个名值对组成,逗号分隔,每个键值由 = 元组组成

          1.type=volume普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下;

            --mount type=volume,source=my-vol,target=/webapp

            注:这是type的默认值

          2.bind:绑定数据卷,映射到主机指定路径下;

            --mount type=bind,source=/webapp,destination=/webapp2

          3.tmpfs :临时数据卷,只存在于内存中

            docker run -d \

              -it \

              --name tmptest \

              --mount type=tmpfs,destination=/app \

              nginx:latest

① 将宿主机的目录与容器的目录进行挂载,实现数据共享

docker run -di --name c2 -v /home/jwj/data/:/home/xiaojiang/data/ centos:7

数据卷(Data Volumes)&dockerfile_第11张图片

数据卷(Data Volumes)&dockerfile_第12张图片

 我在宿主机上面建了一个CentOS7服务,再在CentOS7里面装一个虚拟的CentOS7的服务器。

数据卷(Data Volumes)&dockerfile_第13张图片

结论:不管宿主机、容器在指定目录创建文件夹还是文件,都会被共享。

四、数据卷容器 

数据卷容器它的底层原理还是依靠宿主机。 

数据卷容器

   如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

   数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载

   数据卷容器相关操作

   1.新建数据卷容器

     docker run -di --name db_data -v /db_data centos:7

 注:-v 后面接的共享数据真实存放路径

   2.用容器db1、db2测试数据卷容器是否可用

     docker run -di --name db1 --volumes-from db_data centos:7

     docker exec -it db1 bash

     cd db_data

 docker run -di --name db2 --volumes-from db_data centos:7

     docker exec -it db2 bash

     cd db_data

     

 随便创建一个aaa.txt文件就可以查看效果了

docker run -di -v /home/jwj/data/c4 --name c4 centos:7
docker run -di --volumes-from c4 --name c6 centos:7

数据卷(Data Volumes)&dockerfile_第14张图片

数据卷(Data Volumes)&dockerfile_第15张图片

这个就实现了容器与容器之间做一个数据共享。

其中c4为数据卷容器,c6为普通容器,其中c4就起到一个桥接作用,我们可以通过docker inspect查看容器的详细情况  

数据卷(Data Volumes)&dockerfile_第16张图片

会发现c4、c6目录挂载情况是一样的

结论:不管c4、c6在指定目录创建文件夹还是文件,都会会被共享;  

数据卷(Data Volumes)&dockerfile_第17张图片

① docker inspect  容器名 查看容器的详细信息

当有一天你自己都不知道哪个目录跟那个目录进行挂载,就可以通过上面的命令进行查看,可以查看这个容器的所有的信息。

docker inspect c2 

数据卷(Data Volumes)&dockerfile_第18张图片

五、Dockerfile简介

dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,

   另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙

dockerfile基本结构

   Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行,一般而言, Dockerfile 主体内容分为四部分:

   基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。

   部分                             命令

   基础镜像信息                     FROM

   维护者信息                       MAINTAINER

   镜像操作指令                     RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等

   容器启动时执行指令               CMD、ENTRYPOINT

六、Dockerfile制作增强版CentOS

CentOS7:通过它运行的容器,是没有vim命令,我希望我自己制作一个镜像mycentos:7,然后我自己制作的镜像运行一个容器,而这个容器,是存在vim命令

① 自定义centos,具备vim及ifconfig作用(体会学习Dockerfile的意义) 

cd /javajwj/software
mkdir mydocker
vi mycentosDockerfile

② 向mycentosDockerfile 编辑内容

FROM centos:7
MAINTAINER javajwj "[email protected]"
RUN yum -y install vim
RUN yum install net-tools.x86_64 -y
CMD /bin/bash

数据卷(Data Volumes)&dockerfile_第19张图片

③ 构建镜像

docker build -f mycentosDockerfile -t javajwj/centos:v1.0 .

数据卷(Data Volumes)&dockerfile_第20张图片

数据卷(Data Volumes)&dockerfile_第21张图片

④ 通过镜像运行一个容器进行测试

docker run -it --name mc1 javajwj/centos:v1.0 /bin/bash

数据卷(Data Volumes)&dockerfile_第22张图片

七、Dockerfile制作自定义tomcat 

数据卷(Data Volumes)&dockerfile_第23张图片

 这个tomcat是能够跑的,容器能起起来,外部能访问的.

① 自定义tomcat8 (熟悉几乎所有的Docker命令)

cd /javajwj/software
mkdir mydocker
vi mytomcatDockerfile

② 向mytomcatDockerfile编辑内容

FROM centos:7
MAINTAINER javajwj "[email protected]"

ENV workerDir /home/javajwj/dockerfile/3
WORKDIR $workerDir

ADD jdk-8u151-linux-x64.tar.gz $workerDir
COPY apache-tomcat-8.5.20.tar.gz $workerDir
RUN tar -xvf apache-tomcat-8.5.20.tar.gz apache-tomcat-8.5.20

ENV JAVA_HOME $workerDir/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV TOMCAT_HOME $workerDir/apache-tomcat-8.5.20
ENV PATH $JAVA_HOME/bin:$TOMCAT_HOME/bin:$TOMCAT_HOME/lib:$PATH

EXPOSE 8080
ENTRYPOINT ["/home/javajwj/dockerfile/3/apache-tomcat-8.5.20/bin/catalina.sh","run"]

数据卷(Data Volumes)&dockerfile_第24张图片

注意:在这之前要把压缩包复制到software里面去,如下图所示:

 数据卷(Data Volumes)&dockerfile_第25张图片

数据卷(Data Volumes)&dockerfile_第26张图片

 在这种情况下才能去构建镜像。

③ 构建镜像

docker build -f mytomcatDockerfile -t javajwj/tomcat8:v1.0 .

 ④ 通过镜像运行2个容器进行测试

 创建了一个容器叫mt1

docker run -di --name mt1 -P javajwj/tomcat8:v1.0
docker run -di --name mt2 -P javajwj/tomcat8:v1.0

你不用去做端口映射的原因是:自己映射的端口,随机代表不可控不行。

数据卷(Data Volumes)&dockerfile_第27张图片

数据卷(Data Volumes)&dockerfile_第28张图片

 浏览器输入:

http://192.168.29.128:49153/
http://192.168.29.128:49154/

都可以访问到tomcat。

数据卷(Data Volumes)&dockerfile_第29张图片

数据卷(Data Volumes)&dockerfile_第30张图片

你可能感兴趣的:(docker,mysql,tomcat,容器)