一、容器数据卷
容器的持久化和同步操作
将容器内的数据同步至主机中,故而即便容器的数据库被删除,也不会出现数据丢失的现象
可以理解为一种同步机制,将容器内部的数据同步到容器外的指定位置,亦可以在容器间进行同步操作
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
例如在主机home目录下的test文件用来接收容器内的home目录下的内容
docker run -it -v /home/test:/home centos /bin/bash查看容器内的详细内容docker inspect [id]'Source'为主机地址,'Destination'为容器内的地址
当在容器内的home目录下创建一个文件,主机内对应的位置也会出现该文件
注:即便容器关闭,在主机对应的地址修改数据,依旧会被同步
同步操作,双向绑定
优点:以后需要修改时只需在服务器修改即可,不必进入容器中
二、实战:安装MySQL
拉取mysql
docker search mysql
docker pull mysql:5.7
官方测试的设置密码
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
运行 映射端口 挂载mysql中conf的内容 挂载数据 设置密码 设置别名
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
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置(配置了密码)
--name 容器名字
运行起来后,可以在本地尝试连接该数据库,注意端口和ip 注:容器即便是被删掉,同步至本地的数据依旧还存在。这便是容器数据库持久化功能 匿名挂载:在使用 -v 时,只写了容器内的路径,没有写主机的路径
例:docker run -d --name nginx01 -v /etc/nginx nginx
docker valume ls
具名挂载
如何区别 匿名、具名、指定路径挂载
容器的读写
三、初识dockerfile
dockerfile就是用来构建docker镜像的构建文件,命令脚本
通过脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令也是一层一层的
创建一个文件里面写脚本
vim dockerfile01
# 脚本指令
FROM centos
VOLUME ["volume01","volume02"] 挂载卷(-v的全称),容器内的路径为引号内的内容
CMD echo "===end===" 完成后输出
CMD /bin/bash 默认走bash控制台
手动创建一个镜像(songxh/centos),生成镜像会自动挂载(因为脚本)
docker build -f dockerfile01 -t songxh/centos .
进入该镜像,发现脚本中声明的数据卷目录便在该镜像中
进入卷目录,创建一个文件
在容器外查看容器详细信息, Source对应的便是容器外挂载的目录(匿名挂载)
docker inspect 3186757120c7
可以发现,在容器外挂载的目录下也会同步的出现一个文件
四、多个mysql实现数据同步
创建父容器,并创建子容器绑定到父容器上
docker run -it --name docker01 f7c768c60e10
docker run -it --name docker02 --volumes-from docker01 f7c768c60e10 绑定docker01
docker run -it --name docker03 --volumes-from docker01 f7c768c60e10
此时在docker01中创建一个文件,会发现在docker02中也对出现对应的文件
可以发现,只要以该种方式在同一个镜像下创建的多个容器,它们的数据是同步的
注:即便是父容器被删除,子容器中的数据依旧存在。只要还有一个容器在使用该数据,数据就不会被丢失
实现多个数据库间的数据同步
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止;一旦数据持久化至本地,本地的数据是不会被删除了
五、构建docker镜像
初步了解指令
大致步骤
dockerfile创建过程
dockerfile的指令
FROM 基础镜像,一切从这里构建
MAINTAINER 镜像是谁写的(姓名+邮箱)
RUN docker镜像构建时需要运行的命令
ADD 添加内容,例 加tomcat、jdk等
WORKDIR 镜像的工作目录,例:/bin/bash
VOLUME 挂载卷的目录
EXPOSE 暴露端口配置,类似 -p
CMD 指定容器启动时要运行的命令,只有最后一个会生效,且可被替代
ENTRYPOINT 指定容器启动时要运行的命令,可以直接追加命令
ONBUILD 当构建一个被继承 dockerfile 这个时候就会运行该指令。触发指令
COPY 类似add,将文件拷贝到镜像中
ENV 构建时设置环境变量
实战:构建一个centos
编写dockerfile文件
当进入该镜像后,便会直接在MYPATH工作路径下
通过文件构建一个镜像
docker build -f mydockerfilecentos -t mycentos:0.1 .
构建一个名叫 mycentos:0.1 的镜像
出现success即完成
测试运行
docker run -it ccb329f3ca19
这是官方的centos镜像可以对比
实战:构建一个tomcat镜像
准备镜像文件 tomcat压缩包、jdk压缩包
编写dockerfile文件,官方命名:Dockerfile,build时会自动寻找这个文件,就不需要-f来指定了
注:22年后,需要将FROM centos 改为 FROM centos:7;jdk版本应该和压缩包对应,图中就有错误,正确的应该是 jdk1.8.0_171
构建镜像
docker build -t diytomcat .
注:因为‘Dockerfile’是很官方的名字,所有不需要 -f
运行该镜像创建一个容器,并进行挂载
docker run -d -p 9090:8080 --name songxhtomcat -v /home/songxh/tomcat/test:/usr/local/apache-tomcat-7.0.57/webapps/test -v /home/songxh/tomcat/tomcatlogs/:/usr/local/apache-tomcat-7.0.57/logs diytomcat
在容器外查看是否成功(出现html代码即可)
curl localhost:9090
因为挂载,此时写项目就可以在容器外的test文件下写
创建WEB-INF,配置web.xml
失败了,跳过。。。