Docker学习2.0 容器数据卷以及DockerFile的使用

  1. docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像id/镜像名
    在这里插入图片描述
    容器里有了这个文件夹
    在这里插入图片描述
    宿主机也有了这个文件夹
    在这里插入图片描述
    这时候你给宿主机或者容器添加文件修改文件,二者都会同步更新。
    就算容器关闭之后,重启,容器内的容器卷也会同步宿主机的内容。
  2. docker inspect 容器id/容器名
    会发现宿主机的卷文件夹和容器的卷文件夹绑定了
    在这里插入图片描述
    这里的Mode没有值,默认是可读可写

在这里插入图片描述
3. 我们用第一个命令创建容器卷双方都具有读写权限,可是如何设置容器只有读的权限呢 只要在容器卷路径上加上:ro 意思是readonly
4. docker run -it -v 宿主机路径:容器路径:ro 镜像id/镜像名

在这里插入图片描述
运行这条命令之后 我们再docker inspect 容器id
发现Mode 的值 为ro 只读
在这里插入图片描述
大家可以在容器里面创建一个文件,或者修改一个文件,会发现失败。
在这里插入图片描述
在这里插入图片描述
5. 编写Dockefile
其中VOLUMES [] 表明容器有多个卷对应主机的卷文件夹,默认会给主机创建两个卷文件夹与你Dockerfile写的对应
在这里插入图片描述
6. 使用DockerFile构建镜像并运行
docker build -f 文件路径 -t 镜像名 .
在这里插入图片描述
7. 我们docker inspect 容器id
会发现每个容器卷文件夹有一个与之对应的主机文件夹
在这里插入图片描述
8. 容器数据卷 让一个容器继承另一个容器的数据卷,实现数据的共享与传递。

  • 首先运行一个容器 命名dc01
  • 在这里插入图片描述
  • 然后再运行一个容器 让他容器卷继承于dc01
  • docker run -it --name dc02 --volumes-from dc01 yzf/centos
  • 我们继续创建dc3容器继承dc1
  • docker run -it --name dc03 --volumes-from dc01 yzf/centos
  • 在这里插入图片描述
  • 这时候我们删除父容器dc01
  • docker rm -f dc01 在这里插入图片描述
  • 再进入其他两个容器dc01 dc02 会发现父容器的文件依旧在数据卷中,这时候即使你删除dc02,dc03数据卷依旧存在,不会受到影响,即使你再创建一个dc04继承dc03的容器卷,然后删除dc03,dc04的数据卷依旧是完整的,只要容器数据卷的数据在使用,那么数据还是存在的。
  1. 接下来介绍一下Dockefile
  • dockerfile 就是用来构建镜像的文件,其中包含一系列的命令即脚本。
  • 我们看下centos的管饭dockerfile
    在这里插入图片描述
  • FROM 相当于此镜像的依赖,比如tomcat的dcokerfile from jdk,这里scratch是基础镜像,LABEL 相当于说明,CMD 是命令,还有个MAINTAINER 是一些作者和邮箱信息。
  1. DockerFile保留字指令
  • RUN 容器构建时需要运行的命令
  • EXPOSE 容器对外暴露的端口号
  • WORKDIR 容器创建之后,终端进去的目录,一个落脚点,默认/根目录
  • ENV 设置环境变量 可以用$变量名 引用环境变量值
  • ADD 将宿主机文件拷贝到镜像,并且可以自动处理url和解压缩tar包
  • COPY 拷贝src目录下的文件/目录到镜像内的目录
  • 语法 COPY src dest或者COPY ["src","dest"]
  • CMD 指定容器启动时要运行的命令 dockerfile中可以有多个cmd命令,但是只有最后一个生效,cmd会被docker run之后的参数替换
  • 例如 docker run -d -p:8888:8080 tomcat ls -l 并不会启动tomcat 原因是tomcat默认dockerfile有一个 cmd 执行catalina.sh 但是 被ls -l覆盖所有不会启动了
    在这里插入图片描述
  • ENTRYPOINT 与cmd作用一致,但是不会被替换,会追加。
  • ONBUILD 类似于触发器,父镜像在被其他镜像继承时,父镜像的onbuild会触发。
  • VOLUME 容器数据卷,用于保存持久化容器产生的数据。
  1. DockerFile指令练习
  • 编写文件
FROM centos
MAINTAINER yzf<99678@sohu.com>

ENV mypath /usr/local
WORKDIR $mypath

RUN yum -y install vim
RUN yum -y install net-tools
  • 构建
docker build -f /mydocker/DockerFile01 -t mycentos:1.3 .

显示如下 构建完成
在这里插入图片描述

  • 查看镜像
docker images mycentos

在这里插入图片描述

  • 运行
    在这里插入图片描述在这里插入图片描述
    ifconfig 和 vim 都可以使用,并且 workdir也生效 容器启动后,进入了/usr/local
  1. docker history 镜像id/镜像名 列出镜像的变更历史
    在这里插入图片描述
    因为我们的mycentos是从centos基础镜像构建而来,所以每一行指令都会生成一个镜像并且提交,然后后面的指令执行后又会包含之前的镜像生成新的镜像,所以说镜像是一层一层的。
  2. 接下来说明一下CMD和ENTRYPOINT的区别
  • 编写dockerfile(CMD)
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
  • build
 docker build -f /mydocker/DockerFile02 -t myip .
  • 运行
docker run myip
  • 编写dockerfile(ENTRYPOINT)
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
  • build
 docker build -f /mydocker/DockerFile03 -t myip2 .
  • 运行
docker run myip2

结果 使用了ENTRYPOINT 追加参数运行之后并不会覆盖命令 而是追加,CMD会直接覆盖。
在这里插入图片描述
13. ONBUILD的使用

  • 首先我们创建一个Dockerfile
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father onbuild..."
  • 然后构建
docker build -f /mydocker/DockerFile04 -t myip_father .
  • 再创建一个Dockerfile 让它继承自我们创建的镜像名
FROM myip_father
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
  • 构建的时候会发现 触发了父镜像 然后打印那句话
docker build -f /mydocker/DockerFile05 -t myip_son .

在这里插入图片描述

发布了84 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yidou120/article/details/103752326
今日推荐