绪论
前文中已经提到,创建docker镜像的方式有两种,基于docker容器和编写dockerfile。此文讲述使用dockerfile创建docker镜像并打包上传至dockerfile。
dockerfile的编写
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
Dockerfile中的语法分为两部分,带#号的注释部分和指令详情,编写指令时要‘惜字如金,因为每条指令都会生成一个可写层,在构建镜像时都会分层构建,联合挂载。
- FROM,第一个非注释行必须是FROM指令,指定基于哪个镜像创建容器。
- MAINTAINER,镜像作者的详细信息,名称+联系方式(被替换为LABEL)MAINTAINER “mizhouzhou xxx@163.com”
- COPY,将宿主机中的文件复制到目标镜像的文件系统中,src文件路径必须是dockerfile的工作目录的路径,dest必须是绝对路径,复制目录时,会自动递归复制目录下的所有文件但是不会复制目录,目录必须/结尾。目标主机上的文件不存在时会自动创建。
- ADD,支持url文件,如果src为本地的tar文件,复制到远程主机上时会被展开(url的tar格式文件不会被展开)。
- WORKDIR,指定工作目录,可以多次指定,影响其后的所有命令。
- RUN,用于指定在dockerfile中运行的命令。RUN中可以写多个command命令
RUN COMMAND1 && COMMAND2 && COMMAND3,安装完成后yum clean all 并吧安装目录和安装包删除,以减少镜像的体积。RUN是基于基础镜像制作的,所有命令必须是基础镜像所含有的才行。 - CMD,将镜像启动为容器时未定义运行命令时默认运行的命令,可以给多个命令,但是只有最后一个生效。
注意一点,所有进程的入口为shell,当我们想要驳离shell命令行定义自己的启动命令时,此时使用nohub command &,将其送到后台,让其脱离shell使用我们自己定义的运行命令。(运维所有进程在退出shell之后不能继续进行)用户空间中ID为1位内核启动进程。驳离终端时,shell命令行下的主进程ID不为1 ,但是当我们使用exec时,shell就会让位退出,用户定义的启动方式的ID即为1。 - VOLUME,在容器中创建卷,docker管理的卷,但是不能指定宿主机上的卷。当创建为容器时会自动挂载存储卷。
- EXPOSE,为容器打开指定要监听的端口,不能指定地址,会动态绑定宿主机的端口。(因为启动的环境不一定,宿主机上被使用的端口不确定,端口是否需要被暴露也不确定)运行此镜像的时候直接使用-P随机暴露即可。不使用-P时就算dockerfile中暴露了也不会暴露。docker port 容器名查看哪些端口被暴露。
- ENV,可使用环境变量,做镜像时使用的环境变量,可被全局使用。多个变量的时候使用反斜杠来区分。docker run时使用-e来为docker镜像中的环境变量赋值。不可作为变量在编译或者运行时使用。
- ARG,作为变量可以在编译或者运行时使用。
- DockerFile引用的文件,在某个特定的目录下做镜像,DockerFile中引用文件或者软件包的路径必须放在此dockerfile文件所在的目录或者子目录。
- 还支持做隐藏文件,dockerignore,打包制作为镜像时,这些文件以及文件指定的路径不会被打包。
- 做好镜像,docker build 打包为镜像,隐藏起容器,和人工起容器一样,制作环境是底层镜像所能提供的环境和工具。
编写完dockerfile后构建docker镜像 docker build -t 标签 ./ (当前路径下的或者使用-f指定dockerfile所在位置)
Dockerfile构建nginx镜像
编写简单的dockerfile构建nginx镜像,首先创建Dockerfile文件夹,将构建镜像所需的nginx压缩包放入Dockerfile文件夹中,在Dockerfile文件夹中编写Dockerfile
编写Dockerfile文件内容如下
FROM centos
ADD nginx-1.11.2.tar.gz /usr/local/
RUN yum install -y gcc gcc-c++ glibc make openssl openssl-devel
RUN yum install -y gd gd-devel pcre-devel
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/nginx-1.11.2
RUN ./configure
EXPOSE 80
编写完Dockerfile之后构建nginx镜像,在Dockerfile文件夹下构建即可。
docker build -t nginx .
以上完成了Dockerfile编写nginx镜像并使用docker build构建nginx镜像。