美文网首页
挂载卷,dockerfile

挂载卷,dockerfile

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-10-15 19:59 被阅读0次

镜像分层
每次commit或使用dockerfile都是在原有的image基础上添加新的配置。
多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

添加文件:在容器中创建文件时,新文件被添加到容器层中。
读取文件:在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化
的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修
改,所以镜像可以被多个容器共享。

docker在/var/lib/docker/overlay2中创建容器名-init的目录,当用户创建容器时,docker-engin在/var/lib/docker/overlay2中创建容器同名的目录,在新创建的目录中记录docker的变化的文件

持久化存储

1.把宿主机文件系统里的目录映射到容器内的目录。容器内在该目录里创建的所有文件,都存储到宿主机的对应目录中,在关闭容器后,宿主机的目录依然存在,再次启动容器时还能读取到之前创建的文件,因此实现了容器的文件持久化。当然同时要明白,如果是对镜像自带文件进行了修改,由于镜像是只读的,该修改操作无法在关闭容器时保存下来,除非在修改了文件后构建一个新的镜像。
2.把多台宿主机的磁盘目录通过网络联合为共享存储,然后把共享存储中的特定目录映射给特定的容器,这样容器在重启时,还是能读取到关闭前创建的文件。生产环境中常用NFS作为共享存储方案。

挂载的两种方法:

1.挂载时创建卷
docker run -d -p 8000:80 --name uts1 -v /data:/usr/share/nginx/html nginx

在/data中
echo "test.thml" > index.html
2.先创建卷后挂载
docker volume create --name volm1   #创建卷
docker volume ls  #查看卷名
docker volume inspect nginx  #查看卷路径
docker run -d -p 9000:80 --name uts2 -v volm1:/usr/share/nginx/html
nginx

实现共享卷挂载

docker run -d -p 8080:80 --name uts3 --volumes-from uts2 nginx
原理为使用指定的容器的挂载方法,而不是让容器挂载到本容器

dockerfile

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取 Dockerfile 中的指令自动生成映像。

Dockerfile 的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

常用指令
FROM:指定基础镜像,必须为第一个命令

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>

MAINTAINER: 维护者信息

MAINTAINER mr_eden <mr_eden@163.com>

RUN:构建镜像时执行的命令

RUN yum update    
RUN ["/etc/execfile", "arg1", "arg1"]
RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。使用--no-cache不使用缓存

ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源

ADD test /absoluteDir/

CMD:构建容器后调用,也就是在容器启动时才进行调用。

CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)

ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

  ENTRYPOINT ["top", "-b"]
  CMD ["-c"]
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

LABEL:用于为镜像添加元数据

LABEL <key>=<value> <key>=<value> <key>=<value>

ENV:设置环境变量

ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能
设置一个变量
 
ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如
果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行

EXPOSE:指定于外界交互的端口

EXPOSE 11211/tcp 11211/udp
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

VOLUME:用于指定持久化目录

VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以在容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它

WORKDIR:工作目录,类似于cd命令

  WORKDIR /a  (这时工作目录为/a) 
WORKDIR b (这时工作目录为/a/b)
  WORKDIR c (这时工作目录为/a/b/c)

USER:指定运行容器时的用户名或 UID

USER www

ARG:用于指定传递给构建运行时的变量

  ARG site
  ARG build_user=www

ONBUILD:用于设置镜像触发器

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

使用dockerfile建立nginx镜像

创建dockerfile时,应位于目录末端
vim Dockerfile

FROM centos7:v1
MAINTAINER rourou
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx-1.16.1.tar.gz /usr/local/
RUN yum -y install epel-release.noarch
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

docker build -t nginx:v1  .

使用dockerfile建立httpd镜像

vim run.sh
#!/bin/bash
/usr/sbin/sshd &
/usr/local/apache2/bin/httpd -D FOREGROUND

vim Dockerfile
FROM centos7:v1
MAINTAINER rourou
RUN yum -y install wget
WORKDIR /usr/local/src
RUN wget http://apache.fayea.com/httpd/httpd-2.4.41.tar.gz
RUN tar -zxvf httpd-2.4.41.tar.gz
WORKDIR httpd-2.4.41
RUN yum -y install epel-release.noarch && yum makecache fast
RUN yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel
RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so
RUN make && make install
RUN sed -i 's/#ServerName www.rourou.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf
RUN /usr/local/apache2/bin/httpd
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh
EXPOSE 80
CMD ["/usr/local/sbin/run.sh"]

docker build -t apache_dockerfile:centos .

相关文章

  • Docker | 使用dockerfile生成镜像,清理dock

    用dockerfile生成镜像并挂载数据卷 编写dockerfile文件 创建dockerfile01 文件 do...

  • 挂载卷,dockerfile

    镜像分层每次commit或使用dockerfile都是在原有的image基础上添加新的配置。多个镜像都从相同的 b...

  • Dockerfile使用入门

    使用Dockerfile生成镜像,并挂载数据卷 编写Dockerfile 注意:命令单词全部大写 查看docker...

  • GO 通过编写DockerFile启动应用

    GO 通过编写DockerFile启动应用 写法一 Dockerfile 内不添加项目源代码,而是挂载数据卷的方式...

  • Docker 基础环境搭建

    基础镜像Dockerfile 容器运行示例: tomcat dubbo 本地挂载卷目录结构 查看某个容器的IP地址...

  • docker Dockerfile 安装nginx 挂载目录

    查看挂载目录 如果是虚拟机,需要打开IP转发 Dockerfile springboot

  • Docker基础(3) 数据卷

    创建数据卷 挂载Host目录作为数据卷 挂载Host的文件作为数据卷 数据卷容器 数据卷的备份和恢复 Docker...

  • docker卷挂载特点

    容器的卷挂载分为不同的挂载方式,有匿名挂载、具名挂载及绑定挂载 其中匿名挂载与具名挂载相比,使用匿名挂载在容器运行...

  • Docker 随记

    关于volume:Dockerfile中的Volume 模式是挂载到匿名目录,与docker run -v 主机目...

  • docker安装mysql

    挂载当前目录为数据卷

网友评论

      本文标题:挂载卷,dockerfile

      本文链接:https://www.haomeiwen.com/subject/hmaqmctx.html