广州免费推广网站建设,禁止搜索引擎抓取wordpress的目录,网站建设贰金手指下拉壹玖,域名注册成功后怎么使用网站一、Docker镜像的创建
创建镜像有三种方法#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。
1.1 基于现有镜像创建 #xff08;1#xff09;首先启动一个镜像#xff0c;在容器里做修改docker run -it centos:7 /bin/bash …一、Docker镜像的创建
创建镜像有三种方法分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。
1.1 基于现有镜像创建 1首先启动一个镜像在容器里做修改docker run -it centos:7 /bin/bash #启动容器yum install -y epel-release #安装epel源yum install -y nginx #安装nginxyum install net-tools #安装tools工具nginx #启动服务netstat -natp |grep 80 #查看端口是否开启docker ps -a #查看容器ID2然后将修改后的容器提交为新的镜像需要使用该容器的ID号创建新镜像docker commit -m new nginx -a yuji c7f4bc905c29 nginx:centos#常用选项:-m 指定说明信息;-a 指定作者信息;-p 生成过程中停止容器的运行。c7f4bc905c29 原容器ID。nginx:centos 生成新的镜像名称。docker images #查看生成的新镜像docker run -itd nginx:centos bash #使用新的镜像创建容器docker ps -a #查看容器状态docker exec -it ae8e40e434fe bash #进入容器nginx #启动nginx服务netstat -natp |grep 80 #查看80端口是否开启1.2 基于本地模板创建
通过导入操作系统模板文件可以生成镜像模板可以从OPENVZ 开源项目下载下载地址为openvz.org/ Download/template/precreated #模板里面就是使用docker export 命令导出的容器文件#下载模板wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz#导入为镜像两种方法cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test #方法一docker import debian-7.0-x86-minimal.tar.gz -- debian:test #方法二#查看镜像docker images#使用导入的镜像创建容器docker run -itd debian:test bashdocker ps -a1.3 基于Dockerfile 创建
1.3.1 联合文件系统(UnionFS )
UnionFS(联合文件系统) Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、overlayFS 及Devicemapper 都是一种UnionFS 。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。
特性 一次同时加载多个文件系统但从外面看起来只能看到一一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录。
我们下载的时候看到的一层层的就是联合文件系统。 1.3.2 镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成这种层级的文件系统就是UnionFS。
bootfs主要包含bootloader和kernelbootloader主 要是引导加载kernelLinux刚启 动时会加载bootfs文件系统。
在Docker镜像的最底层是bootfs这一层 与我们典型的Linux/Unix系统是一样的 包含boot加载器和内核。当boot加载完成之 后整个内核就都在内存中了此时内存的使用权已由bootfs转交给内核此时系统也会卸载bootfs。
rootfs在bootfs之 上。包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版比如Ubuntu, Centos等。
bootfs就是内核引导器引导加载内核和内核。rootfs是n多个基础镜像提供基础操作环境和应用镜像叠加在一起的只读层。运行的容器实例会在rootfs之上添加一个可读可写层。 1.3.3 为什么Docker里的centos的大小才200M
因为对于精简的OSrootfs可以很小 只需要包含最基本的命令、工具和程序库就可以了因为底层直接用宿主机的kernel自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版bootfs基本是一 致的 rootfs会 有差别因此不同的发行版可以公用bootfs。
大部分镜像是通用的但如果专门基于某个版本创建的镜像在其他版本的操作系统中运行可能会有问题。
1.3.4 Dockerfile
Docker镜像是一个特殊的文件系统除了提供容器运行时所需的程序、库、资源、配置等文件外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据其内容在构建之后也不会被改变
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改 安装、构建、操作的命令都写入一个脚本 用这个脚本来构建、定制镜像那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
我们需要定制首己额外的需求时只需在Docketlle上添加或者修改指令重新生成image 即可省去了敲命令的麻烦。就是描述该层应当如何构建。有了Dockerfile当我们需要定制自己额外的需求时只需在Dockerfile上添加或者修改指令重新生成image即可省去了敲命令的麻烦。
除了手动生成Docker镜像之外可以使用bockerfile自动生成镜像。Dockerfile 是由多条的指令组成的文件其中每条指令对应Linux中的一条命令Docker程序将读取Dockerfile中的指令生成指定镜像。
Dockerfile结构大致分为四个部分基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一 条指令 每条指令可携带多个参数支持使用以“#“号开头的注释。
1.3.5 Docker镜像结构的分层
镜像不是一个单一的文件而是有多层构成。容器其实是在镜像的最上面加了一层读写层在运行容器里做的任何文件改动都会写到这个读写层。如果删除了容器也就删除了其最上面的读写层文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
1Dockerfile中的每个指令都会创建一个新的镜像层
2镜像层将被缓存和复用
3当Dockerfile的指令修改了复制的文件变化了或者构建镜像时指定的变量不同了对应的镜像层缓存就会失效
4某一层的镜像缓存失效它之后的镜像层缓存都会失效
5镜像层是不可变的如果在某一层中添加一个文件然后在下一层中删除它则镜像中依然会包含该文件只是这个文件在Docker 容器中不可见了。 bootfs bootfs加载器内核容器都是共享内核的所以都有相同的bootfs。
rootfs只读层 rootfs可以有多层对外表现看起来就是一个整体。
使用镜像运行一个容器实例时就会在rootfs只读层上挂载一层可读可写层。 二、Dockerfile 操作命令的指令
Dockerfile简介
Dockerfile其实就是我们用来构建Docker镜像的源码当然这不是所谓的编程源码而是一些命令的组合只要理解它的逻辑和语法格式就可以编写Dockerfile了。
简单点说Dockerfile的作用它可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样网络上的镜像很难满足实际的需求。
Dockerfile常见命令
命令作用FROM image_name:tag声明基础镜像MAINTAINER user_name声明镜像的作者ENV key value设置环境变量 (可以写多条)RUN command编译镜像时运行的脚本(可以写多条)CMD设置容器的启动命令ENTRYPOINT设置容器的入口程序ADD source_dir/file dest_dir/file将宿主机的文件复制到镜像内如果是一个压缩文件将会在复制后自动解压。支持URL路径下载源文件但下载方式不能自动解压。COPY source_dir/file dest_dir/file和ADD相似将宿主机的文件复制到镜像内但是如果有压缩文件并不能解压。不支持URL路径下载。WORKDIR path_dir设置工作目录ARG设置编译镜像时加入的参数VOLUMN设置容器的挂载卷
2.1 FROM 镜像
指定新镜像所基于的基础镜像第一条指令必须为FROM指令每创建一-个镜像就需要一条FROM指令。
2.2 MAINTAINER 名字
说明新镜像的维护人信息
2.3 RUN 命令
在所基于的镜像上执行命令并提交到新的镜像中.
尽量减少run命令的条数。
当命令较长时可以使用 \ 来换行多条命令可以使用 ; 或 合并成一条命令减少镜像的层数。
2.4 ENTRYPOINT
ENTRYPOINT [要运行的程序参数1参数2]
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令 docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。 两种格式exec格式数值格式ENTRYPOINT [“命令”“选项”“参数”]shell格式ENTRYPOINT 命令 选项 参数
前面四个命令就可以创建成一个粗略的镜像。
2.5 CMD
CMD [要运行的程序参数1参数2]
启动容器时默认执行的命令或者脚本Dockerfile只能有一条CMD命令。如果指定多条命令只执行最后一 条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT那么CMD就会被覆盖。
CMD 可以为ENTRYPOINT 指令提供默认参数。 两种格式exec形式CMD [“要运行的程序”“参数1”, “参数2”]shell形式: CMD 命令 参数1 参数2
ENTRYPOINT和CMD共存的情形 ENTRYPOIN指定命令CMD传参
容器运行时的优先级
docker run --entrypoint Dockerfile ENTRYPOINT docker run命令 Dockerfile CMD
ENTRYPOINT和CMD的区别
ENTRYPOINT设定容器启动时第一个运行的命令CMD是启动容器时默认执行的命令如果指定多条CMD命令只执行最后一 条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT那么CMD就会被覆盖并且会将CMD中的命令作为参数传给ENTRYPOINT。
CMD可以为ENTRYPOINT进行传参。
2.6 EXPOSE 端口号
指定新镜像加载到Docker 时要开启的端口。
用于暴露端口否则即使做了端口映射外部也找不到。
2.7 ENV
ENV 环境变量 变量值
设置一个环境变量的值会被后面的RUN使用。
2.8 ADD
ADD 源文件/目录 目标文件/目录
将源文件复制到镜像的指定路径中源文件要与 Dockerfile 位于相同目录中或者是一个URL。URL路径在线路径
注意事项
1、 如果源路径是个文件且目标路径是以 / 结尾 则docker会把目标路径当作一个目录会把源文件拷贝到该目录下。 如果目标路径不存在则会自动创建目标路径。
2、 如果源路径是个文件且目标路径是不以/结尾则docker会把目标路径当作一个文件。 如果目标路径不存在会以目标路径为名创建一个文件内容同源文件。 如果目标文件是个存在的文件会用源文件覆盖它当然只是内容覆盖文件名还是目标文件名。 如果目标文件实际是个存在的目录则会源文件拷贝到该目录下。注意 这种情况下最好显示的以/结尾以避免混淆。
3、 如果源路径是个目录且目标路径不存在则docker会自动以目标路径创建一个目录把源路径目录下的文件拷贝进来。 如果目标路径是个已经存在的目录则docker 会把源路径目录下的文件拷贝到该目录下。
4、 如果源文件是个归档文件则docker会自动帮解压。解压后复制源目录到镜像中的目录 URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝都不会自动解压。 不支持下载和解压一起使用下载就不会解压。即只解压本地压缩包不会解压下载的压缩包
ADD 的优点 在执行 源文件 为 tar 压缩文件的话压缩格式为 gzip、bzip2 以及 xz 的情况下会自动复制并解压到 目标路径。ADD 的缺点 在不解压的前提下无法复制 tar 压缩文件。会令镜像构建缓存失效从而可能会令镜像构建变得比较缓慢。具体是否使用可以根据是否需要自动解压来决定。
2.9 COPY
COPY 源文件/目录 目标文件/目录
只复制本地主机上的文件/目录复制到目标地点源文件/目录要与Dockerfile在相同的目录中。 ADD和COPY比较
1、共同点
ADD和COPY都可以复制本地文件到镜像中。
2、区别
ADD如果是一个压缩文件ADD会在复制后自动解压。且支持URL路径下载源文件但URL下载和解压特性不能一起使用任何压缩文件通过URL拷贝都不会自动解压。
COPY如果是压缩文件COPY并不能解压。且COPY只能复制本地文件不支持URL路径拷贝。
2.10 VOLUME [目录]
在容器中创建一个挂载点即创建数据卷。
2.11 USER 用户名/UID
指定运行容器时的用户。用于切换用户
2.12 WORKDIR 路径
为后续的RUN、CMD、ENTRYPOINT 指定工作目录。用于切换容器中的目录
CMD 可以为ENTRYPOINT 指令提供默认参数。 workdir /opt #切换镜像层run cd /opt #会添加镜像层
2.13 ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令该指令对利用该Dockerfile构建镜像比如为A镜像不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像 比如为B镜像时这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了在构建B镜像的过程中首先会执行ONBUILD指令指定的指令然后才会执行其它指令。
即加私货这个命令不是给我用的是给其他镜像用的
2.14 ARG
设置编译镜像时加入的参数。
ARG指令可以引用在docker build构建镜像时指定的参数即达到引用参数的效果。
使用ENV指令定义的环境变量始终会覆盖同名的ARG指令。 ARG CONT_IMG_VER #Dockfile中指定变量名 ENV CONT_IMG_VERv1.0.0 RUN echo $CONT_IMG_VER #AEG和ENV定义的变量名不要重复不然最后echo的是ENV定义的值docker build --build-arg CONT_IMG_VERv2.0 . #构建镜像时传入变量值#因为ARG和ENV定义的变量名重复了ENV指令定义的环境变量始终会覆盖同名的ARG指令所以最后输出的是ENV定义的值。2.15 创建镜像
编写完成Dockerfile之后可以通过 docker build 命令来创建镜像。
基本的格式为 docker build [选项] 路径该命令将读取指定路径下包括子目录的Dockerfile并将该路径下所有内容发送给Docker服务端由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外可以通过.dockerignore文件每一行添加一条匹配模式来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息可以通过-t选项
在编写Dockerfile 时有严格的格式需要遵循
第一行必须使用FROM指令指明所基于的镜像名称之后使用MAINTAINER 指令说明维护该镜像的用户信息然后是镜像操作相关指令如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令都会给基础镜像添加新的一层。多条命令可以使用 ; 或 合并成一条命令减少镜像的层数最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作。 三、Dockerfile案例实战
3.1 构建Apache镜像 #1建立工作目录mkdir /opt/apachecd /opt/apache#2准备Dockerfile文件vim Dockerfile#基于的基础镜像FROM centos:7#维护镜像的用户信息MAINTAINER this is apache image zy#镜像操作指令安装apache软件RUN yum -y install httpd#开启80端口EXPOSE 80#复制网站首页文件ADD index.html /var/www/html/#指定启动容器时第一个运行的命令前台运行apache//方法一:#将执行脚本复制到镜像中ADD run.sh /run.shRUN chmod 755 /run.sh#启动容器时执行脚本CMD [/run.sh]//方法二:ENTRYPOINT [/usr/sbin/apachectl]CMD [-D, FOREGROUND] #FOREGROUND前台运行#默认情况下apache是在后台运行需要-D指定FOREGROUND表示前台运行否则执行完第一条命令会停止镜像#3准备执行脚本。使用方法一的情况下需要准备执行脚本使用方法二可跳过此步骤。vim run.sh#!/bin/bash#清理httpd的缓存rm -rf /run/httpd/*#指定为前台运行/usr/sbin/apachectl -D FOREGROUND#因为Docker容器仅在它的1号进程(PID为1)运行时会保持运行。如果1号进程退出了Docker容器也就退出了。#4准备网站页面echo this is apache web index.html#5生成镜像构建镜像docker build -t httpd:centos . #注意别忘了末尾有.#6使用新镜像运行容器docker run -d -p 1314:80 httpd:centos #指定映射端口1314#使用宿主机IP和1314端口测试网页访问http://192.168.126.27:1314/总结
1、如何把镜像体积给缩小
基础镜像尽量使用轻量级最小化的镜像。Dockerfile中尽量把RUN指令合并在一起减少镜像的层数因为每一个RUN指令就是一个镜像层。多级构建拿Dockerfile构建好的镜像再构建一次。FROM 镜像 AS 别名 COPY --FROM 别名构建镜像时最后添加清空系统或应用程序的缓存的命令
2、使用Dockerfile构建镜像分为几个步骤
Dockerfile结构大致分为四个部分基础镜像信息用from指定、维护者信息maintainer、镜像操作指令和容器启动时执行指令。
第一行必须使用FROM指令指明所基于的镜像名称之后使用MAINTAINER 指令说明维护该镜像的用户信息然后是镜像操作相关指令如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令都会给基础镜像添加新的一层。多条命令可以使用 ; 或 合并成一条命令减少镜像的层数最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作。