ockerfile构建镜像


1.明确镜像满足什么需求

Dockerfile构建镜像_java

在构建镜像之前,我们需要明确构建这个镜像用来干嘛,在一个镜像中最好只提供一个服务,不要同时安装多个服务。比如我们需要构建一个Nginx镜像。

Dockerfile构建镜像_java


2.服务通过什么方式安装?

Dockerfile构建镜像_java

确定了镜像需要满足什么需求之后,考虑使用哪种方式来安装该服务。一般有yum安装、编译安装、二进制安装着三种方法。yum和二进制安装比较简单,但是很难满足我们的需求,所以推荐使用编译安装的方式,可以定制安装更好的满足我们的需求。

Dockerfile构建镜像_java


3. 确定基础镜像

Dockerfile构建镜像_java

选择一个自己用的比较顺手的基础镜像更有利于Dockerfile的编写,所以我一般选择centos的基础镜像。当然你也可以根据自己的喜好来选择。

Dockerfile构建镜像_java


4.编写Dockerfile之前

个人不建议一开始就着手开始编写Dockerfile然后每次都要通过不停的docker build报错之后调整Dockerfile的内容。这样既费时又费力。

在编写Dockerfile之前,我们可以先通过基础镜像启动一个容器,然后在容器中通过命令行一步一步安装,最终搭建出自己需要的服务。并记录下自己的所有操作过程,因为基础镜像很小,在安装的时候可能会缺少很多的依赖,而通过手动安装这个过程我们可以很明确的知道缺少了什么依赖,如果是通过直接编写Dockerfile的情况的话这个过程就会很痛苦(别问我怎么知道的)!


5.编写Dockerfile

在容器中手动安装成功之后,根据自己的操作记录来精简和优化各种命令之后,编写出更好的Dockerfile。

下面给出一个我自己编写的构建Nginx镜像的Dockerfile:


FROM centos:7MAINTAINER staryjie@gmail.comRUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel gd-devel iproute net-tools telnet wget curl && \    yum clean all && \     rm -rf /var/cache/yum/*RUN useradd -s /sbin/nologin -M www && \    wget http://nginx.org/download/nginx-1.13.3.tar.gz && \     tar xf nginx-1.13.3.tar.gz && \     cd nginx-1.13.3 && \     ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module \     --with-http_ssl_module --with-http_realip_module && \     make && make install && echo ok >> /usr/local/nginx/html/status.html && \     cd / && rm -rf nginx-1.13.3* && \     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/nginx/sbinWORKDIR /usr/local/nginxEXPOSE 80 443CMD [nginx, -g, daemon off;]
Dockerfile构建镜像_java


6.不断学习不断优化

Dockerfile构建镜像_java

写出一个符合自己需求的Dockerfile其实并不难,稍微用点心都可以写出来,如果想要写的更好更优的话,还是需要不断的学习和实践。建议多去DockerHub上看一看那些比较优秀的镜像维护者都是怎么书写Dockerfile的,然后结合自己的需求不断完善自己的Dockerfile。