目录
① docker inspect 容器名 查看容器的详细信息
① 自定义centos,具备vim及ifconfig作用(体会学习Dockerfile的意义)
① 自定义tomcat8 (熟悉几乎所有的Docker命令)
这里快照拍好,打开我们的连接工具。
在我们的虚拟机中,因为我们是还原到了最初下载的版本,所以我们目前是连接不到MySQL数据库的,如下图所示:
注意:这里我们执行以下代码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
注意:同时访问两个MySQL可能存在问题,但你要把之前的安装的MySQL给停掉,这样就不会出现冲突问题了
docker cp /javajwj/software/mydocker/apache-tomcat-8.5.20.tar.gz a51d94f75620:/usr/local/tomcat/webapps
但这个方式它只能上传到宿主机。我们目前是把服务器里面的一些文件放到容器内部。
如果想把容器内部的文件放到宿主机上那该怎么办?因为我们跑的是一个tomcat容器,然后它日志只会放在容器内部而不会在宿主机上面,所以我们要把日志从容器中copy到宿主机上,在通过这个工具给下载下来。也会涉及到日志的反向操作。
docker cp a51d94f75620:/usr/local/tomcat/webapps/111.log /javajwj/software/mydocker
存在问题的:这样是非常麻烦的,因为容器里面的日志,你每运行一段时间,它会生成
一段,然后你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
我在宿主机上面建了一个CentOS7服务,再在CentOS7里面装一个虚拟的CentOS7的服务器。
结论:不管宿主机、容器在指定目录创建文件夹还是文件,都会被共享。
数据卷容器它的底层原理还是依靠宿主机。
数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载
数据卷容器相关操作
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
这个就实现了容器与容器之间做一个数据共享。
其中c4为数据卷容器,c6为普通容器,其中c4就起到一个桥接作用,我们可以通过docker inspect查看容器的详细情况
会发现c4、c6目录挂载情况是一样的
结论:不管c4、c6在指定目录创建文件夹还是文件,都会会被共享;
当有一天你自己都不知道哪个目录跟那个目录进行挂载,就可以通过上面的命令进行查看,可以查看这个容器的所有的信息。
docker inspect c2
dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,
另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙
dockerfile基本结构
Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行,一般而言, Dockerfile 主体内容分为四部分:
基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。
部分 命令
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT
CentOS7:通过它运行的容器,是没有vim命令,我希望我自己制作一个镜像mycentos:7,然后我自己制作的镜像运行一个容器,而这个容器,是存在vim命令
- cd /javajwj/software
- mkdir mydocker
- vi mycentosDockerfile
- FROM centos:7
- MAINTAINER javajwj "javajwj@qq.com"
- RUN yum -y install vim
- RUN yum install net-tools.x86_64 -y
- CMD /bin/bash
docker build -f mycentosDockerfile -t javajwj/centos:v1.0 .
docker run -it --name mc1 javajwj/centos:v1.0 /bin/bash
这个tomcat是能够跑的,容器能起起来,外部能访问的.
- cd /javajwj/software
- mkdir mydocker
- vi mytomcatDockerfile
- FROM centos:7
- MAINTAINER javajwj "javajwj@qq.com"
-
- 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"]
注意:在这之前要把压缩包复制到software里面去,如下图所示:
在这种情况下才能去构建镜像。
docker build -f mytomcatDockerfile -t javajwj/tomcat8:v1.0 .
创建了一个容器叫mt1
- docker run -di --name mt1 -P javajwj/tomcat8:v1.0
- docker run -di --name mt2 -P javajwj/tomcat8:v1.0
你不用去做端口映射的原因是:自己映射的端口,随机代表不可控不行。
浏览器输入:
- http://192.168.29.128:49153/
- http://192.168.29.128:49154/
都可以访问到tomcat。