Docker的创建镜像的方式:
- 基于已有镜像进行创建。
根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性的功能还是需要自己定义(进入容器进行操作)
基于模板进行创建:
下载下来的模板导入到本地 run起来。
Dockerfile
联合文件系统(UnionFS),docker镜像的基础,镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面来看,就是一个文件系统。
Docker镜像实际上就是一层一层的文件系统组成,这种层级的文件系统就是UnionFS。每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs。
Bootfs:宿主机提供的内核和引导程序。
Roosfs:就是容器的操作系统,在dockerfile中,我们可以自己指定。
Rootfs是多个基础镜像和应用镜像结合起来的只读层,镜像实际上就是一个只读文件。
容器基于镜像实例,运行起来之后,容器变成可读可写层。
在dockerfile 当中创建一个指定都是一个镜像层。
镜像层会被缓存和复用。
1-4将直接完成,继续运行5-6
一旦有一层镜像失败,那么所有的镜像层都会失败,镜像也不会创建。
镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见。
Dockerfile的核心:用户个性化定制docker的镜像。
Dockerfile的结构:
- 基础镜像信息
- 维护者信息
- 镜像的操作指令
- 容器启动时执行的命令。
Dockerfile的语法:
FROM:指定基础镜像信息,指定容器的操作系统。
MAINTAINER:指定维护者信息(可有可无,可以不写)。
RUN:在基础的镜像上执行的命令,每个run就是一层,分层越多,镜像也大。
ENTRYPOINT:设置容器运行时是默认命令(容器内部运行的主程序)
CMD:指定容器运行时间的默认命令(docker run /bin/bash 后面加了其他的命令,cmd的指将会被覆盖。)
EXPOSE:暴漏端口(指定容器的运行端口)
ENV:设置变量环境,环境变量可以被PUA命令使用(声明容器运行需要的环境斌环境)
ADD:复制,解压。解压不支持.zip和.tar tar.gz tar.bz2 支持url地址解压和复制(解压)
COPY:复制文件,不能解压,而且只能复制蹦迪文件,文件要和dockerfile在一个节目(官方推荐复制利用copy)
VOLUME:创建一个容器内的挂载点,即可以为宿主机挂载,也可以提供容器挂载。
USER:设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR:为后续指令设置的工作目录
ONBUILD :这个镜像可以被其他镜像引用,需要这个命令。
ARG:传参,用于创建容器时,传递参数。ENV用于容器运行时设置环境变量。
CMD和ENTRYPOINT的区别:
都是可以作为容器启动时的默认命令。
区别:
- cmd可以吧参数传给ENTRYPOINT
- 多个ENTRYPOINT和多个cmd只会运行最后一个(一个dockerfile当中只会有一个ENTRYPOINT和cmd)
- ENTRYPOINT的指令不会被覆盖,cmd的指令如果在docker run 的后面加上输出,会被覆盖。
- ENTRYPOINT和cmd的指令在容器启动时执行,都会成为容器的主进程。主进程负责接受信号,处理容器的生命周期,主进程退出,容器也将终止运行。
Run 命令的优化:
主要是减少镜像的层数: 把多个run命令写在一块。
&&符号:
RUN yum -y install nginx && make -j 4 && make install
注意一点前一个命令执行成功才会执行下一个。
; 符号:
RUN yum -y install nginx ; make -j 4 ;make install
不管前一个命令是否成功,后面的命令都会执行。
|| :
RUN yum -y install nginx || make -j 4
如果前面一个命令执行失败,才会执行下一个命令。
反斜杠 \ :换行
RUM yum -y install nginx \
&& make -j 4 \
&& make install
可读性高。
Copy和add区别:
Copy和add都可以吧本地文件复制到镜像中,但是官方推荐如果是复制,使用copy
区别:
Add可以解压,如果是一个压缩文件,add在复制之后会自动解压。(tar.gz 和 tar.bz2)可以支持URL下载源文件,只能支持下载,但是不会解压。通过URL拷贝的文件无法自动解压。
Copy只能复制,不能解压。而且只能是本地文件,不支持URL路径。