之前分享了一个Nginx的Dockerfile实战文章,但这是基于原有镜像的基础上去添加修改的,那么本文 来详细讲解一下,如何从ubuntu镜像生成一个Nginx镜像

Step1:

#最开始,还是需要先搜索一个可用的镜像

$docker search ubuntu

#在这里,可以看到许多的相关镜像,但这里我们安装第一个就可以,可以看STARS评级很高的那个

$docker pull ubuntu

#如果网络情况够好的话,稍等片刻,一个可用的镜像就下载完毕了


Step2:

下载完镜像以后,我们需要在一个特定的目录下编写Dockerfile文件,文件名字也建议以Dockerfile命名

$mkdir -p /opt/docker/dfs/nginx

$vi Dockerfile

在Dockerfile内非注释行的第一行,必须填写来源镜像,这里以ubuntu为例

FROM ubuntu

注意,Dockerfile指令,不区分大小写,但为了写作规范,建议以大写为好。

接着,可以编写一些维护人员信息

MAINTAINER Leonlong    Email@Domain.com

为了安全起见,建议不要使用root用户来管理和启动镜像,在这里,可以用以下指令指定管理镜像的用户

USER yourusername

还可以指令工作目录,以免在Dockerfile中写过长的路径名称

RUN adduser --diabled-login nginx

WORKDIR /home/nginx

可能需要修改一下时区信息,以免应用程序调用时出现问题

RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata

在安装Nginx之前,需要更新一下Ubuntu的apt源,因为Docker在Build的时候会创建Cache,所以建议这里使用个指令,把所有需要安装的软件装完。以免在后续步骤出问题时,修改Dockerfile后重新build会带来额外的时间开销。当然,有一些软件并不在官方源当中,可以使用以下两条RUN指令来安装想要的应用。如果使用编译安装,可能流程就比较长,这里主要讲Dockerfile各个注意事项,所以请自行研究

RUN ECHO "deb http://sourceurlinfo" >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y nginx 

在安装完以后,其实就可以直接使用CMD参数启动nginx,但是我们可能以后还需要修改配置。而如果在这里直接修改配置,容器的生生命周期结束后,这些配置就荡然无存。所以,可以通过挂载卷的方法来完成我们的配置。而这里,仅仅需要修改主配置文件的一点内容就可以不再去管它。具体配置方案,可以根据自己的情况来。我的博客也有nginx相关的配置文档,可以自行研究。

RUN mkdir -p /etc/nginx/vhost/ && mkdir -p /opt/nginx/www

下面,将我们需要观察或者修改的动态内容,通过挂载卷的方式,从宿主机目录挂载到以下目录,并给出启动命令参数

VOLUME /etc/nginx/vhost

VOLUME /var/log/nginx

VOLUME /opt/nginx/www

ADD nginx.conf /etc/nginx/nginx.conf

CMD nginx

在启动完成nginx之后,我们想要外部对其访问,那么就让主机映射其端口

EXPOSE 80

EXPOSE 443

:wq!


还是要注意,无论如何配置nginx.conf文件,必须包含"daemon off;"一行

至此,一个简单的Dockerfile已经编写完成,当然,在Dockerfile中也有一些其它的指令参数可以使用,比如ENV、COPY、ARG等,之前已经写过Dockerfile指令使用指南,可以查看 http://leon0long.blog.51cto.com/3011404/1768324


Step3:

那么Dockerfile编写完毕以后,就需要将编写好的dockerfile,制作成我们想要的镜像,方便我们使用

$cd /opt/docker/dfs/nginx ;docker build -t nginx:private .

命令最后的'.'就代表使用当前目录的Dockerfile进行构建了。另外注意,在构建的时候,最好不要使用latest标签

现在,就可以使用docker run来启动一个容器了

$docker run -it -p 80:80 -p 443:443 

-v /opt/docker/mounts/nginx/log:/var/log/nginx

-v /opt/docker/mounts/nginx/conf:/etc/nginx/vhost

-v /opt/docker/mounts/nginx/www:/opt/nginx/www 

--name nginxtest nginx:private

使用docker ps,就可以看到正在运行当中的容器了


如果想要对镜像进行修改,只用再次编辑新的dockerfile,并生成一个新的镜像即可。

顾头不顾尾,不是我的风格,docker在网络方面一直是很让人纠结的地方,后面会针对网络进行专讲