Dockerfile可以创建自定义镜像。包括配置文件,挂载点,对外暴露的端口,设置环境变量。
Docker创建镜像的方式
1、 基于已有镜像创建:根据官方提供的镜像源,创建镜像。然后拉起容器。是一个白板智能提供基础的功能,扩展性的功能需要在容器内自定义。
2、 基于模板创建:根据官方提供的模板
docker import ubuntu-14.04-x86-minimal.tar.gz -- ubuntu:14
#导入本地docker镜像
3、 dockerfile
基于Dockerfile
dockerfile:联合文件系统(UnionFS),是docker镜像的基础。
镜像通过分层来进行集成。
dockerfile的特性:一次同时加载多个文件系统,但是从外部来看就是一个文件系统
docker镜像实际上就是由一层一层的文件系统组成。
这种层级的文件系统就是UnionFS。每一层都是layers,每一层都包含文件系统的一部分。这些层次叠加在一起,最终形成就是rootfs
1、 bootfs:宿主机地引导文件系统,启动操作系统的文件,启动容器需要的最基本的文件。包含宿主机的bootloader和kernel。
2、 rootfs:镜像的操作系统。会给镜像自动创建一个操作系统。
3、 RUN、ADD:创建容器时的命令
4、 形成container容器
容器基于镜像实例,运行起来之后,容器变成可读可写层。
在dockerfile当中每创建一个指定都是一个镜像层
镜像层会被缓存和复用。一旦有一层镜像失败那么所有的镜像层都会失败。镜像也不会创建。
镜像层是不可变的,你在某一层当中添加一个新的命令。但是在下一层删除了指令。镜像中基于这个命令创建的文件还是会存在。但是在容器中看不见。
dockerfile的核心,用户个性化定制docker的镜像。
dockerfile的结构
1、 基础镜像
2、 维护者信息
3、 镜像的操作指令
4、 容器启动时执行的命令
nginx:定义好了容器执行的命令
/bin/bash:覆盖了容器内的标准输出
dockerfile的语法
在dockerfile中所有的语法命令都是大写
FROM:指定基础镜像信息,指定容器的操作系统
MAINTAINER:指定维护者信息(可有可无)
RUN:在基础镜像上执行的命令。每个run就是一层,分层越多,镜像越大。
ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)(和CMD任选其一)
CMD:指定容器运行时的默认命令(docker run /bin/bash后面加了其他命令那么cmd的命令将会被覆盖)(和ENTRYPOINT任选其一)
EXPOSE:暴露端口(指定容器的运行端口)
ENV:设置容器的环境变量,环境变量可以被RUN命令使用(声明容器运行需要的环境变量)
ADD:复制、解压。解压不支持.zip和.rar。只支持.tar.gz tar.bz2 支持url地址解压和复制(解压)
COPY:复制文件。不能解压。只能复制本地文件。文件需要和dockerfile在一个目录。(官方推荐复制使用COPY)
VOLUME:创建一个容器内的挂载点。既可以为宿主机挂载,也可以实现容器与容器之间挂载。
USER:设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR:为后续指令设置的工作目录(指定ENTRYPOINT和CMD命令的工作目录)
ONBUILD:这个镜像可以被其他镜像引用。需要这个命令
ARG:传参。用于创建容器时,传递参数。ENV用于容器运行时设置环境变量。
Dockerfile创建镜像
所有的Dockerfile都叫Dockerfile
FROM centos:7
MAINTAINER "this is my docker <zyg>"
ENTRYPOINT ["echo","hello"]
CMD ["world"]
docker build -t centos7:test .
#.:使用当前dockerfile文件
ENTRYPOINT和CMD的区别
1、 cmd可以把参数传递给ENTRYPOINT
2、 多个ENTRYPOINT和多个CMD只会运行最后一个(一个dockerfile当中只会有一个ENTRYPOINT和一个CMD)
3、 ENTRYPOINT的指令不会被覆盖,CMD的指令如果在docker run后面加上输出,会被覆盖。
4、 ENTRYPOINT和CMD的指令在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,处理容器的声明周期,容器退出,容器也将终止运行。
RUN命令的优化
主要是减少镜像的层数,把多个RUN命令写在一块。
1、 &&符号:
RUN yum -y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令
2、 ;符号:了解即可
RUN yum -y install nginx ; make -j 4 ; make install
3、 ||符号:逻辑或。了解即可
RUN yum -y install nginx || make -j 4 || make install
如果前一个命令执行失败才会执行后面的操作
4、 \符号:可以理解为换行
RUN yum -y install nginx \
make -j 4 \
make install
提高可读性
COPY和ADD的区别
COPY和ADD都可以把本地文件复制到镜像中,但是官方推荐如果是复制使用COPY
区别:
ADD可以解压。如果是一个压缩文件,ADD在复制之后会自动解压(tar.gz tar.gz2)支持URL路径下载源文件。支持下载,但是不能解压了。通过URL拷贝的文件无法自动解压。
COPY只能复制,不能解压,而且只能是本地文件,不支持URL路径
基于centos7构建apach的Dcokerfile(编译安装)
mkdir apache
cd /opt/apache
#创建基础镜像
FROM centos:7
MAINTAINER "this is my apache <zyg>"
RUN yum -y install 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 .
docker run -itd --name http1 -p 1314:80 apache:centos
#根据创建好的镜像创建一个容器名为http1
通过指定的端口在外部浏览器测试一下
20.0.0.41:1314
基于镜像进行二次构建
vim Dockerfile
#创建基础镜像
FROM centos:7 AS first
MAINTAINER "this is my apache <zyg>"
RUN yum -y install 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
#二层构建:了解即可
FROM centos:7
COPY --from=first /usr/local/httpd /usr/local/httpd
RUN yum -y install make pcre pcre-devel expat-devel perl
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
docker build -t apache1:centos .
基于centos7构建nginx的Dcokerfile(编译安装)
#创建基础镜像
FROM centos:7
MAINTAINER "this is my nginx <zyg>"
ADD nginx-1.22.0.tar.gz /opt
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &&\
useradd -M -s /sbin/nologin nginx &&\
cd /opt/nginx-1.22.0 &&\
./configure --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcre \--with-stream \--with-stream_ssl_module \--with-stream_realip_module &&\
make -j 4 && make install &&\
ln -s /usr/local/nginx/sbin/nginx /usr/sbin
RUN mkdir -p /usr/local/nginx/run
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]