Docker数据卷及Dockerfile

版权声明:文章转发需标明文章出处地址及作者 https://blog.csdn.net/weixin_44267608/article/details/89500614

容器数据卷

将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久的
容器之间希望有可能共享数据

docker产生的数据,如果不通过docke commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然就没有了。为了能保存数据在docker中,所以使用容器数据卷。

容器数据卷类似于redis里面的rdb和aof文件

能干嘛?容器的持久化、容器间继承+共享数据

特点:

  • 数据卷可在容器直接按共享或重用数据
  • 卷重的更改可以直接生效
  • 数据卷中的更改不回包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止。

容器内添加

直接命令添加

docker run -it -v /宿主机绝对路径目录:容器内目录 镜像名字 # v 为volume 在两者之间建立连接

docker inspect 容器ID
#查看数据卷是否挂载成功

容器和宿主机之间数据共享 #分别进入查看

容器停止退出后,主机修改后数据是否同步
命令(带权限)
docker run -it -v/宿主机绝对路径目录:/容器内目录:ro镜像名 # ro only read
如果写权限不够的话,添加–privileged=true

DockerFile添加

根目录下新建mydocker文件夹并进入
可在DockerFile中使用volume指令来给镜像添加一个或多个数据卷
file构建 #编写脚本
build后生成镜像
run容器
主机对应默认地址 #docker inspect 容器ID查看

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
–volumes-from

范例过程如下:
新建一个容器,并且建立
docker run -it -v /root/datavolume:/root/datavolume01 --name cq1 centos
在容器cq1中进入共享目录
cd /root/datavolume01
touch test.txt
ctrl P+Q
之后再次创建新的
docker run -it --name cq2 --volumes-from cq1 centos
在容器cq2中进入共享目录,发现还有共享文件

dockerfile

是什么?

dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本

如何构建?

手动编写一个dockerfile文件,必须符合file的规范
有了文件之后,直接docker build命令执行,获得一个自定义的镜像
run

内容基础知识

  • 每条保留字指令都必须为大写字母 指令安装从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像,并对镜像进行提交

从应有软件的角度来看,dockerfile、docker镜像、docker容器分别代表软件的不同阶段

  • dockerfile是软件的原材料
  • docker镜像是软件的交付品
  • docker容器可以认为是软件的运行态

dockerfile面向开发,docker镜像称为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。

dockerfile体系结构

  • FROM 基础镜像,当前新镜像是基于那个镜像的
  • MAINTAINER 镜像作者
  • RUN 容器构建时需要运行的命令
  • EXPOSE 当前容器对外暴露出的端口
  • WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • ENV 用来构建镜像过程中设置环境变量
  • ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和加压tar压缩包
  • COPY
    拷贝文件和目录到镜像中,将从构建上下文目录中<原路径>的文件/目录复制到新的一次镜像内的<目标路径>位置
    • copy src dest
    • copy | "src,“dest”
  • VOLUME 容器数据卷,用于数据保存和持久化工作
  • CMD
    • 指定一个容器启动时要运行的命令
    • dockerfile中可以有多个cmd指令,但只有最后一个生效,cmd会被docker run之后的参数替换。
  • ENTRYPOINT
    • 指定一个容器启动时要运行的命令
    • 它的目的和CMD一样,都是在指定容器启动程序及参数
    • 而它不会被之后的命令覆盖,而是追加组合,让镜像像命令一样使用
    • 应用运行前的准备工作
  • ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

对于部分理解

COPY

#copy a.txt /usr/local/xxx.txt 将当前目录下文件a.txt拷贝到镜像中/usr/local/目录下,并命名为xxx.txt

使用命令还可以加上–chown=: 选项来改变文件的所属用户及用户组
COPY --chown=root:root files* /mydir/

ADD

它与COPY的格式性质基本一致,在COPY的基础上增加了一些功能。

比如 <源路径> 可以是一个 URL ,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600 ,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。

使用遵循一个原则,所有文件复制均用COPY指令,仅在需要自动解压缩的场合使用ADD

CMD 容器启动时要运行的命令

使用格式分两种
shell格式 :CMD<命令>
exec格式 :CMD [“可执行文件”,“参数”]

在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON数组,因此一定要使用双引号 " ,而不要使用单引号。

在前台执行和后台执行的问题?

Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用upstart/systemd 去启动后台服务,容器内没有后台服务的概念。一些初学者将 CMD 写为:

CMD service nginx start

然后发现容器执行后就立即退出了。甚至在容器内去使用 systemctl 命令结果却发现根本执行不了。这就是因为没有搞明白前台、后台的概念,没有区分容器和虚拟机的差异,依旧在以传统虚拟机的角度去理解容器。

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。而使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [“sh”, “-c”, “service nginx start”] ,因此主进程实际上是 sh 。那么当service nginx start 命令结束后, sh 也就结束了, sh 作为主进程退出了,自然就会令容器退出。正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:
CMD [“nginx”, g, daemon off;"]

ONBUILD 为他人做嫁衣裳

什么情况下使用?
做项目时,如果项目数量多,文件的副本就越多,版本控制就越困难。在其中一个项目开发过程中发现dockerfile存在问题,开发人员修复了这个文件,但是其它项目不会被自动修复。

这时做一个基础镜像,然后各个项目使用这个基础镜像,如果基础镜像更新,各个项目不用同步dockerfile的变化,重新构建后就继承了基础镜像的更新。

案例
在这里插入图片描述

FROM centos
ENV mypath /tmp
WORKDIR $mypath

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD /bin/bash

运行
cd /mydocker/Dockerfile
docker build -f /mydocker/Dockerfile -t mycentos:1 .
#最后一个点代表在当前路径下执行,名字为mycentos,tag为1

运行镜像,会发现所创建镜像已经有了我们想要的功能
docker run -it 镜像ID

查看镜像历史
docker history 镜像ID

[root@chen3 ~]# docker history 5e7e1549620e
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5e7e1549620e        5 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
d558621c6530        5 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B                  
8060ae361cee        5 minutes ago       /bin/sh -c yum -y install net-tools             23.6MB              
bd644596f057        5 minutes ago       /bin/sh -c yum -y install vim                   139MB               
970e7b5f036d        7 minutes ago       /bin/sh -c #(nop) WORKDIR /root                 0B                  
9f38484d220f        5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           5 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:074f2c974463ab38c…   202MB  

猜你喜欢

转载自blog.csdn.net/weixin_44267608/article/details/89500614