文件名必须为Dockerfile
--Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像
基础镜像、维护者信息、操作指令、容器CMD
注:cmd 和entrypoint 告诉镜像启动时做什么
dockerfile指令
FROM:
FROM {base镜像}
必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
MAINTAINER:
可选的,用来标识image作者的地方
RUN
RUN都是启动一个容器、执行命令、然后提交存储层文件变更。
第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。
而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。
而如果需要将两条命令或者多条命令联合起来执行需要加上&&。
如:cd /usr/local/src && wget xxxxxxx
CMD:
CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
EXPOSE
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
entrypoint:
entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
当定义了entrypoint以后,CMD只能够作为参数进行传递
ADD & COPY:
把host上的文件或者目录复制到image中(能够进行自动解压压缩包)
ENV:
用来设置环境变量,后续的RUN可以使用它所创建的环境变量
WORKDIR:
用来指定当前工作目录(或者称为当前目录)
USER:
运行RUN指令的用户
VOLUME:
用来创建一个在image之外的mount point
1、最简单的dockerfile
cd /root/dockerfile/cmd 自定义的目录 存放dockerfile文件
vi Dockerfile
2、创建镜像
该容器启动后里面会停掉,因为cmd(echo hello cmd! )命令执行结束
nginx镜像制作实战
编译/安装nginx
mkdir一个目录,在此目录内下载nginx源码包
wget http://nginx.org/download/nginx-1.13.2.tar.gz
并创建一个Dockerfile文件,文件内制作一系列nginx的编译安装流程,内容如文件:
# base image
FROM centos
# MAINTAINER
MAINTAINER peter
# put nginx-1.13.2.tar.gz
ADD nginx-1.13.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.13.2
WORKDIR /usr/local/src/nginx-1.13.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
EXPOSE 80
ADD nginx-1.13.2.tar.gz /usr/local/src
将Dockerfile同目录下的nginx-1.13.2.tar.gz加入(copy)到镜像(启动后的容器)的/usr/local/src目录下,会自动解压
WORKDIR /usr/local/src/nginx-1.13.2
相当于下边这些命令
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
是在cd /usr/local/src/nginx-1.13.2 (进入/usr/local/src/nginx-1.13.2 目录)之下敲入执行的
其中,每一个RUN就是增加一个镜像层文件,一层层的RUN命令最终形成一系列镜像层
进入Dockerfile目录,运行build指令(注意最后的.代表当前路径),制作镜像
docker build -t cent-ngx2 .
我们查看一下这个镜像的层次历史
docker images
docker history
可看到,此镜像层基本与dockerfile文件的RUN是一一对应的
使用制作的nginx镜像,创建一个容器。
因此镜像无前台命令,因为必须指定启动命令 :/usr/local/nginx/sbin/nginx -g "daemon off;"
为镜像指定环境变量,挂载目录,默认启动命令,避免每次启动都有输入 /usr/local/nginx/sbin/nginx -g "daemon off;"
在上一版镜像的基础上,我们新加配置
新编写Dockerfile文件
ENV 环境
执行:docker build -t cent-ngx3 .
查看镜像的历史,可看到比ngx2的镜像多了几个层
ngx3的镜像创建容器,已经不需要再指定cmd命令了
可执行命令自行校验:docker run -d --name ng2 cent-ngx3