Dockerfile:创建镜像,创建自定义的镜像
包括配置文件,挂载点,对外暴露的端口,设置环境变量
根据官方号已提供的镜像源,创建镜像,然后拉起容器,是一个白板,只能提供基础的功能,扩展性的功能还是要自定义(进入容器操作)
模版网址https://download.openvz.org/template/precreated/
演示:乌班图
导入镜像
创建容器
联合文件系统(UnionFS),docker镜像的基础
镜像是通过分层来进行集成,特性,可以一次可以同时加载多个文件系统,但是从外面来看,也就是对用户来说,就是一个文件系统。
Docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是unionFS
每一层都是layer,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs
rootfs是什么呢:
看图:
Bootfs:宿主机提供的内核和引导程序
Roofs:就是容器的操作系统,在dockerfile中,我们可以自己指定
Rootfs是多个镜像和应用镜像结合起来的只读层,镜像实际上就是一个只读文件
容器基于镜像实例,运行起来之后,容器就变成可读可写层
在dockerfile当中,每创建一个指令,都是一个镜像层,镜像层会被缓存和复用
1-6
1-4失败
1-4将直接完成,继续运行5-6
一旦有一镜像失败,那么所有的镜像层都会失败,镜像也不会创建
镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个指令创建的文件依然存在,但是在容器中看不见
用户个性化定制docker的镜像
(都是大写)
FROM:指定基础镜像信息,指定容器的操作系统
MAINTANER:指定维护者信息(可有可无)
RUN:在基础的镜像上执行命令,每个RUN就是一层,分层越多,镜像越大
ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)
CMD:指定容器运行时的默认命令(docker run /bin/bash后面加了其他命令,cmd的指令将会被覆盖)
EXPOSE:暴露端口,(指定容器的运行端口)
ENV:设置容器的环境变量,环境变量可以被run命令使用(声明容器运行需要的环境变量)
ADD:复制,解压。解压是不支持.zip和.tar 只支持tar.gz 和tar.bz2,可以支持url地址解压和复制,主要作用就两字,解压
COPY:复制文件,不能解压,而且只能复制本地文件,文件要和dockerfile在一个目录里 (官方推荐复制用COPY)
VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载
USER:设置运行镜像时使用的用户或者UID(可以不加,可有可无)
WORKDIR:为后续指令设置的工作目录
ONBUILD:这个镜像可以被其他镜像引用,需要这个命令
ARG:和EVN一样,传参,用与创建容器时,传递参数,ENV可用于容器运行时的设置的环境变量
(思考题):
这两个都是可以作为容器启动时的默认命令
vim Dockerfile(Docker要大写)
docker build -t centos7:test .
docker run --name test3 centos7:test
主要是减少镜像的层数:把多个run命令写在一块
&&符号:
RUN yum -y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令
:符号:
RUN yun -y install nginx; make -j 4; make install
不管前面一个命令是否成功,后面的命令都会执行
||:
如果前面的命令执行失败,才会执行后面的操作
反斜杠\:换行
RUN yun -y install nginx\
&& make -j 4\
make install
可读性更高
COPY和add区别:
COPY和add都可以把本地文件复制到镜像中,但是官方推荐如果复制,使用COPY
区别:
Add可以解压压缩,如果是一个压缩文件,add在复制之后会自动解压(tar.gz和tar.bz2)可以支持URL下载源文件,支持下载,但是不能解压,通过URL拷贝的文件无法自动解压
COPY只能复制,不能解压,而且只能是本地文件,不支持URL路径
需求:基于centos7构建一个Apache的dockerfile(编译安装):
必须要与dockerfile在同一目录,否则解压报错
FROM centos:7
MAINTAINER this is my diy apache
RUN yum install -y gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29/ &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
docker build -t apache:centos .
构建dockerfile
层次
镜像已经创建好
创建容器,后面不用加/bin/bash 否则将会覆盖CMD
docker run -itd --name test3 http -p 1314:80 apache:centos
通过二次构建,可以大大减少镜像的空间(补充)
第一层
二层构建
重新构建一下
结果显示比原来小了200多MB