Docker 容器数据卷,DockerFile

目录

一. 数据卷的使用方式

二. mysql 同步数据

三. 匿名挂载和具名挂载

四. 初识DockerFile 

五. 数据卷容器

六. DockerFile 介绍

DockerFile 构建过程

DockerFile 指令


Docker 容器数据卷,DockFile 和 Docker网络是Docker的精髓;

什么是容器数据卷,将应用和环境打包成一个镜像,发布,启动之后就变成了一个容器;如果容器都在数据中那么删掉容器之后数据就没了,所以就有一个需求,需要数据可以持久化,比如mysql数据库,我们希望将mysql数据存储在本地,容器之间可以有一个数据共享的技术:Docker容器中产生的数据同步到本地,这就是卷技术,其实就是目录的挂载,将容器内的目录和Linux 主机的目录进行绑定(容器的持久化和同步操作,容器间的数据也是可以共享的

一. 数据卷的使用方式

1. 直接使用命令来挂载,-v参数

docker run -it -v 主机目录:容器内目录 # 类似于-p端口的映射

例:将centos 7的/home/test目录与容器内的/home做一下映射(也即将容器内的/home目录挂载到本机的/home/test目录),当挂载成功之后那么主机的/home/test与容器内的/home目录就会连接起来,容器内/home目录的文件会自动同步到外部,主机上/home/test目录的文件也会同步到容器中(可以理解为同一个地址):

使用docker inspect 容器id 命令判断是否挂载成功:

测试是否可以文件同步:

好处:挂载成功之后只需要在本地修改,容器内会自动同步 ;

二. mysql 同步数据

mysql 的数据一般需要挂载出来(mysql 的数据持久化问题),mysql 的数据放在了data目录,可以挂载多个目录,需要注意的一点是启动mysql的时候需要配置密码,下面的第二条命令将运行的mysql 容器的 /etc/mysql/conf.d目录挂载到主机的 /home/mysql/conf目录,并且允许挂载多个目录(使用-v 参数将挂载的目录分隔开即可),将运行的mysql 容器的 /var/lib/mysql目录挂载到主机的/home/mysql/data 目录,-d表示后台运行,-v 表示挂载,-e表示配置环境(这里表示配置的是root 用户的密码),--name表示给容器起一个名字:

docker pull mysql:5.7 # 1. 从仓库中下载镜像
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=admin --name mysql01 mysql:5.7 # -d表示后台运行, -v表示挂载, -p表示暴露端口(运行容器并在挂载目录) -e是环境配置, --name表示起的名字

官方的mysql测试例子,-e表示配置环境,-d表示后台运行,后面就是设置的密码,我们将-e以及后面的密码配置拷贝到运行mysql 容器的命令中即可:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

使用docker run 命令运行mysql 容器成功之后可以使用本地的数据库图形化管理工具连接到 Linux 上正在运行的mysql 数据库容器,我这里使用Navicat 进行连接,由于在执行run命令的时候使用-p 参数对Linux 系统的外部端口3310与容器的内部端口3306做了映射所以可以通过Linux 的ip 地址 + Linux上暴露的端口3310那么就可以正常连接了运行的mysql 容器(从本地访问到了Linux 容器内部):Navicat 通过主机名也即ip地址(之前配置了虚拟机的静态ip地址为192.168.65.5)+ 端口(虚拟机映射的3310端口) + 用户名(root)+ 之前在Linux 上运行mysql 配置的密码就可以连接上Linux 主机与映射的容器端口,也即连接到正在运行端口为3306的mysql 容器,本地可以连接上数据库说明是docker 部署mysql 是没有问题的,在本地操作数据库会同步到Linux 和mysql容器中,将容器删掉数据还在本地所以不会丢失(容器的数据持久化功能):

在本地修改数据库会同步到Linux 主机和容器上:

创建的spring 数据库在Linux 中属于一个目录,可以看到在Linux 的data 目录下新创建的spring 目目录:

三. 匿名挂载和具名挂载

匿名挂载:将容器内的目录挂载到宿主机的目录的时候没有指定宿主机的目录

docker run -d -P --name nginx01 -v /etc/nginx nginx # -d 表示后台运行, -P表示随机指定一个端口, --name 表示指定容器的名字, 这里只指定了容器内的路径没有指定容器外的路径所以属于匿名挂载
docker volume ls # 查看当前的所有卷的情况

使用docker volume 命令查看数据卷的情况:

我们可以启动使用具名挂载的nginx,通过-v 参数指定卷名:容器内路径:

docker run -d -P -v juming:/etc/nginx --name nginx02 nginx  # -d 表示后台启动, -P 表示随机映端口, juming 没有以/开头所以属于普通的配置(juming是一个卷的名字), --name 表示给容器起一个名字, 现在是具名挂载

查看卷的路径:

docker volume inspect 卷的名字 # 查看卷的路径

 

所有docker 容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volumes/xxxx/_data,通过具名挂载可以方便地找到一个卷,在大多数的情况下我们使用的都是具名挂载,我们可以进入这个目录查看一下:

总结:如何确定是匿名挂载还是具名挂载呢?一般有三种挂载方式:

  1. -v 容器内路径                        # 匿名挂载
  2. -v 卷名:容器内路径                # 具名挂载
  3. -v /宿主机路径:容器内路径    # 指定路径挂载

拓展:通过-v 容器内路径: ro,rw 修改读写权限,ro 表示只读,rw 表示只写:

docker run -d -P -v juming:/etc/nginx:ro --name nginx02 nginx # ro 表示只读
docker run -d -P -v juming:/etc/nginx:rw --name nginx03 nginx # rw 表示只写

只要是看到ro 说明这个路径只能够通过宿主机来改变,容器内部无法操作;

四. 初识DockerFile 

dockerfile 就是用来构建docker 镜像的构建文件,dockerfile 本质是一段命令脚本;自己制作一个镜像:我们可以在/home/ 目录下创建一个docker-test-volume 目录,以后将容器内的目录挂载到当前的/home/docker-test-volume 目录,使用vim 编辑器创建一个dockerfile1 文件,在这个文件里面写的就是一段脚本,通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每一个命令就是一层, ;第二种挂载的方式:dockerfile 生成一个镜像在创建镜像的时候挂载出来;    

dockerfile1 脚本文件(文件的内容):

FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "--------end------"
CMD /bin/bash      

docker build -f /home/docker-test-volume/dockerfile -t zhangyu/centos:1.0 . # -f 表示dockerfile的文件路径, -t表示生成的镜像的名字和版本(后面跟着的就是对应的镜像名字和版本)

通过自己制作的镜像启动容器:

上面的volume1和volume2是数据卷目录,因为我们在dockerfile 文件中只写了容器内的目录,所以属于匿名挂载,我们可以通过docker inspect 容器id查看对应的宿主机挂载的目录:

我们可以测试一下在容器内写文件在对应的宿主机的挂载目录的文件是否同步,可以在 

volume01目录下创建一个container.data文件,然后在上图中对应的宿主机的路径查看文件:

这种通过dockerfile 文件挂载的方式使用得更多一点,挂载的时候会方便一点;

五. 数据卷容器

需求:多个mysql 同步数据;数据卷容器:利用一个容器给另外一个容器共享数据;测试:通过上面自己写的镜像进行测试,启动3个容器,其中第一个docker01是父容器:

docker images # 查看所有的镜像
docker run -it --name docker01 df1d0f06a474 # -it 表示交互模式运行, --name 表示给容器起一个名字, df1d0f06a474 为自己制作的centos镜像id, 也可以写成zhangyu/centos:1.0
# Ctrl + P + Q 退出当前的容器, 然后依次启动docker02和docker03
docker ps # 查看当前正在运行的容器, 可以发现docker01正在运行
docker run -it --name docker02 --volumes-from docker01 df1d0f06a474 # 使用--volume-from 表示docker02 挂载到docker01上, docker01是父容器

在docker01的volume01目录创建docker01文件查看docker02容器的volume01目录下的文件是否同步(类似于java 的继承关系):

启动docker03,在docker03也挂载到docker01上,在docker03的volume01目录下创建docker03文件查看文件是否同步:

docker run -it --name docker03 --volumes-from docker01 df1d0f06a474

当删除掉docker01容器之后发现还可以docker02和docker03的数据还存在,docker02和docker03的文件还是共享的;

多个mysql 共享数据:

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7 # 这里只保留容器内的路径,
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=admin --name mysql02 --volumes-from mysql01 mysql:5.7 

小结:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是使用-v参数将数据持久化到了本地这个时候本地的数据是不会删除的(容器数据卷的精髓);

六. DockerFile 介绍

dockfile 是用来构建docker 镜像的文件,本质上是命令参数脚本,构建步骤如下:

  1. 编写一个dockerfile 文件
  2. 使用docker build 命令构建成为一个镜像
  3. 使用docker run 命令运行一个镜像
  4. docker push 发布镜像,可以发布到两个位置:① docker hub; ② 阿里云仓库;

在docker hub上可以查看一下官方是如何做的:以centos 为例,我们点击对应的链接可以发现会跳转到对应的github 链接,进入github 页面之后可以发现其实是一个官方写的dockerfile ;很多官方的镜像都是基础包,很多功能都没有,我们需要搭建自己的镜像,:

DockerFile 构建过程

很多指令,我们可以在百度搜索:dockfile 命令,可以搜索对应的图片;dockerfile 的基础知识:

  1. 每一个保留的关键字(指令)都必须是大写字母;
  2. 从上到下执行;
  3. # 表示注释;
  4. 每一个指令都会提交创建一个新的镜像层,并提交;

DockerFile 是面向开发的,我们以后要发布项目,做镜像,就需要编写DockerFile文件,docker 镜像逐渐成为企业交付的标准;DockerFile: 构建文件,定义了一切的步骤,源代码; DockerImages: 通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar/war包;Docker 容器就是镜像运行起来提供服务的;

DockerFile 指令

1. FROM:基础镜像,一切从这里开始构建;

2. MAINTAINER:镜像是谁写的;

3. RUN:镜像构建的时候需要运行的命令;

4. ADD:添加内容;

5. WORKDIR:镜像的工作目录;

6. VOLUME:容器卷,表示挂载的目录

7. EXPOSE:声明端口,命令中如果需要暴露端口需要使用-p 参数;

8. CMD:指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可以被替代;

9. ENTRYPOINT:指定这个容器启动的时候需要运行的命令,可以追加命令,CMD和ENTRYPOINT 命令一个是替换一个是追加,容易搞混;

10. ONBUILD:当构建一个被继承的DockerFile 这个时候运行ONBUILD,触发指令;

11. COPY:类似于ADD命令,将文件拷贝到镜像中;

12.  ENV:设置环境变量;

当我们知道了这些指令之后就可以自己写一个镜像;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值