Docker镜像原理
·Docker镜像是由特殊的文件系统叠加而成
·最底端是bootfs,并使用宿主机的bootfs
·第二层是root文件系统rootfs,称为base image
·然后再往上可以叠加其他的镜像文件
·统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了 一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
·一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
·当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
1.base image:基础镜像
2.image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)
3.container:容器层(读写)
4.docker-server 端
5.呈现给docker-client (视图)
镜像分层模型
dockerfile 编写
dockerfile操作指令
序号 | 指令 | 含义 |
1 | FROM 镜像 | 指定新镜像所基于的镜像,第 条指必须为from指令,每创建一个镜像就需要一条from指令 |
2 | MAINTAINER 名字 | 说明新镜像的维护人信息 |
3 | RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中;docker内每执行一条命令都是run开头 |
4 | CMD["要运行的程序","参数1","参数2"] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行 |
5 | EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
6 | ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的run使用 |
7 | ADD 源文件、目录 目标文件/目录 | 具体识别压缩格式并且自动解压,将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者一个URL |
8 | COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
9 | VOLUME ["目录"] | 在容器中创建一个挂载点 |
10 | USER 用户名/UID | 指定运行容器时的用户 |
11 | WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
12 | ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
13 | HEALTHCHECK | 健康检查 |
ADD和copy区别
①Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的
②copy只能用于复制(节省资源)
③ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)
④COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
⑤满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩
CMD和ENTRYPOINT区别
如果ENTRYPOINT使用了shell模式,CMD指令会被忽略。
如果 ENTRYPOINT使用了 exec模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。
如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。
尝试编写dockerfile文件 部署nginx
mkdir nginx
cd nginx/
vim Dockerfile
FROM centos:7 #基于基础镜像
MAINTAINER nginx #用户信息
RUN yum -y update #安装依赖关系
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx #创建用户
ADD nginx-1.12.0.tar.gz /usr/local/src #将源文件复制到目标文件,源文件要与
Dockerfile位于相同目录中,或者是
一个URL
VOLUME ["/usr/local/nginx/html"] #在容器中创建一个挂载点
WORKDIR /usr/local/src #指定工作目录
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80 #暴露端口
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx
docker运行nginx为什么要使用 daemon off
docker运行nginx为什么要使用 daemon off
dockerfile优化
优化四种方式
基于docker镜像分层的原理
每一条RUN指令都会生成一层新的镜像层
每一层镜像缓存会继承到下一层中,直接影响到镜像的大小
优化方案
减少RUN指令的使用 RUN(RUN yum -y update RUN yum install -y gcc gcc-c++ 整合为yum install -y gcc gce-ct+ && yum -y update)
将执行后的缓存/不用的输出丢入黑洞(减少缓存)
yum install -y gcc gcc-c++ && yum -y update > /dev/null
多阶段构建
使用更小体积的linux发行版本