一、镜像的特性
容器创建时需要指定镜像,每个镜像都由唯一的标示Image ID,和容器的Container ID一样,默认128位,可以使用前16为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签( latest )
二、镜像的分层
docker 的镜像通过联合文件系统(union filesystem)将各层文件系统叠加在一起;
①、基础镜像层
②、镜像层
③、容器层
三、linux文件系统的组成
linux文件系统由两部分组成:bootfs和rootfs两部分组成
①、bootfs:包含bootloader(引导加载程序)和kernel(内核)
②、rootfs:root文件系统包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件(不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等)
四、Docker镜像原理
Docker镜像是利用统一文件系统(union sysytem)技术把做个文件系统叠加而成,最底端是bootfs,并共享的是宿主机的bootfs,第二层是root文件系统rootfs,称为base image,然后再往上可以叠加其他的镜像文件。一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
五、镜像的制作
1、dockerfile定义
要获得镜像,可以从Docker仓库中进行下载,如果想自己开发一个镜像,那就要使用Dockerfile。
dockerfile定义:
Dockerfifile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfifile文件并根据Dockerfifile文件的描述来构建镜像。
2、overlay结构
merged视图层 | 对应 | docker-client端所给用户展示的可视层 |
worker 工作层 | 对应 | docker-server端实际运行容器的运行时环境 |
upper 上层目录 | 对应 | 容器层 |
lower下层 | 对应 | images镜像层 |
rootfs基础镜像 | 对应 | base image |
3、关键字:
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
RUN | 执行命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD | 要运行的程序 | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
ADD | 添加文件 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,如果是压缩文件会自动给解压缩 |
ENV | 环境变量 | 指定build时候的环境变量 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
4、构建镜像命令
docker build -t nginx:test . -------》 docker build -t 镜像名:标签 .
-t :tag指打标签
-f :指定dockerfile目录
.︰指构建镜像时使用的环境(当前)目录,构建镜像时使用的上下文环境
5、CMD与ENTRYPOINT命令的区别
exec模式:例如["tail","-f","/var/log/message" ] 直接是指令开头
shell模式:例如["sh","-c","top"] 以环境开头,以开头的环境执行后面的指令
例如:
如果entrypoint 使用了shell模式,CMD指令会被忽略
如果entrypoint使用了exec模式。CMD指定的内容将会被追加为entryrpoint指定的命令参数。
区别:和docker run 命令后面的命令行参数关系
①、CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
②、ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)
6、制作源码包方式的nginx镜像
1、下载一个创建nginx镜像的基础镜像
docker pull centos:7
2、创建工作目录
### /data_dockerfile 为根下的一个目录,自行创建
[root@zwb_docker ~]# cd /data_dockerfile/
### 创建nginx_dockerfile文件
[root@zwb_docker data_dockerfile]# vim nginx_dokerfile
## 基于的基础镜像
FROM centos:7
## 用户信息(选填项)
MAINTAINER this is myfirst
## 添加环境包
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
## 传入压缩文件
ADD nginx-1.15.9.tar.gz /user/local/src
volume ["/usr/local/nginx/html"]
##指定当前的工作目录
WORKDIR /user/local/src/nginx-1.15.9
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 "daemon off">>/usr/local/nginx/nginx[.conf
CMD nginx