什么是容器数据卷
容器数据卷是可以使数据持久化的一个技术,是将容器内部的数据存储到服务器的文件里,并且可以操作服务器上的文件,使得容器里的数据发生变化的。
如果删除容器,数据也可以持久化,举例:MySQL的容器删除了,但是数据在本地
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。
1、启动CentOS并且指定-v 目录
docker run -it -v /home/ceshi:/home centos
docker inspect 8cb966e186e0 // 8cb966e186e0 是容器id
已经成功将容器内部的文件同步到外部系统中
之后系统的数据操作都会在这个文件里生成,例如
反向操作:停止容器后,再到服务器上新增test.java文件内容,启动容器,查看test.java文件内容,也是会同步的
Mysql数据同步
1、下载mysql容器
docker pull mysql:5.7
2、运行容器,做数据挂载
官方启动文档:docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag // 运行mysql时需要输入密码 -e 就是配置环境 MYSQL_ROOT_PASSWORD 就是配置初始密码
// 启动mysql并挂载
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
3、使用本地可视化navicat测试数据
-d // 后台运行
-p // 端口映射
-v // 挂载运行,挂载多个目录需要输入多个-v
--name // 给容器起个名字
具名挂载和匿名挂载
匿名挂载
docker run -d -P --name nginx03 -v /ect/nginx nginx
docker volume ls // 查看 volume 的具体情况
具名挂载
docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx nginx
docker volume inspect feirou-nginx // 查看挂载的细节
没有指定卷目录的情况下,都是指定在/var/lib/docker/volumes/_date 下
通过具名挂载可以很方便的找到我们的卷,大多数情况下载使用的是具名挂载
如何确定是匿名挂在还是具名挂载?
-v 容器内路径 // 匿名挂载
-v 卷名:容器内路径 // 具名挂载
-v /宿主机路径::容器内路径 // 指定路径挂载
ro和rw
只读和读写权限设置
docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx:rw nginx
ro:只能在宿主机下操作,容器内不能操作
rw:可读可写
挂载方式二
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---------------end----------------"
CMD /bin/bash
生成镜像
docker build -f dockerfile1 -t bayue/centos .
docker images
启动并查看挂载卷
docker run -it 容器id /bin/bash
在容器外查看容器的Mounts具体信息
docker inspect 容器id
数据卷容器
启动刚刚自己创建的centos命名为docker01并在volumes01下创建文件docker01
docker run -it --name 给centos重命名为docker01 容器ID/或者容器名称:版本号
启动并关联docker01
docker run -it --name docker02 --volumes-from docker01 容器ID/或者容器名称:版本号
通过 --volumes-from 来进行实现关联
如果将docker01停掉或者删除,docker02一样可以访问到共享卷(在volumes下创建得)docker01
多个MySQL实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
DockerFile
dockerfile是用来构建docker镜像的文件,是命令参数脚本。
构建步骤:
1、编写一个 dockerfile 文件
2、通过命令 docker build 构建成为一个镜像
3、通过 docker run 命令,运行镜像
4、通过 docker push 发布镜像(DockerHub、阿里云镜像仓库)
DockerFile 构建过程
基础知识:
1、每个关键字(指令)都是大写字母
2、执行顺序,从上到下执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交(这就和之前自己创建的centos,同步volumes01,02是一个意思)
DockerFile 指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露的端口
RUN # 运行
CMD/ENTRYPOINT # 指定这个容器启动的时候要运行的命令,CMD只有最后一个会生效,可被代替/ENTRYPOINT可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD 的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
测试:构建自己的centos
home目录下创建文件dockerfilrtest再创建文本mydockerfile
vi编辑mydockerfile
FROM centos
MAINTAINER bayue<282517807@qq.com>
ENV MYPATH /usr/local
WORKDIR #MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
使用docker build -f 编译
docker build -f mydockerfile -t mycentos:0.1 .
在编译过程中会有警告,属于正常情况
原理,dockerfile从本地的经先开始查找,如果没有则去下载,然后叠罗汉,搭载成一个镜像.
对比一下
创建之前没有ifconfig命令
创建后
查看镜像生成过程
docker history 容器id
CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
编写文件vim dockerfile-cmd=test
FROM centos
CMD ["ls","-a"]
保存后编译
docker build -f dockerfile-cmd=test -t cmdtest .
ls -a 命令生效了
测试追加命令 -l
docker run db8eb1e6a12f -l
发现报错了
需要将完整的命令写上
docker run db8eb1e6a12f ls -al
测试ENTORYINT
1、编写文件 dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
2、编译文件
build -f dockerfile-cmd-entrypoint -t entrypoint-cmd-entryoint entryoint-test .
3、启动entrypoint-test并追加 -l命令
可以追加到命令后
实战测试
准备两个文件liunx版本的jdk和tomcat,需要知道版本号
1、编一个DockerFile
vim Dockerfile
# 文件内容
FROM centos
MAINTAINER <282517807@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u291-linux-aarch64.tar.gz /usr/local/
ADD apache-tomcat-8.0.30-deployer.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOE/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.30
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.0.30/bin/startup.sh && tail -F /url/local/apache-tomcat-8.0.30/bin/logs/catalina.out
2、编译文件
docker build -t diytomcat .
因为文件名就叫Dockerfile,这是官方定义的,所以Docker会自己找到这个文件进行编译,不需要再写-f
3、启动刚刚编译的dockerfile,并加入挂载目录
docker run -d -p 8088:8088 --name bayuetomcat2 -v /home/bayue/tomcat/test:/usr/local/apache-tomcat-8.0.30/webapps/test -v /home/bayue/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.30/logs diytomcat
4、测试访问
5、修改webapps文件内容
补充Docker安装ES
上连接