9.4 Dockerfile使用

Docker可以使用build命令,通过指定一个Dockerfile文件来实现将镜像创建过程自动化。下面不仅使用Dockerfile文件来创建一个像上文一样安装nginx的ubuntu镜像,还要在nginx中运行一个网页。DockFile可以很轻松的完成这个问题。首先将新建一个名字为www的文件夹,文件夹下面可以放一些HTML网页,比如新建一个index.html文件,随便写点内容:

root@liu-ubuntu:~# mkdir www
root@liu-ubuntu:~# cd www
root@liu-ubuntu:~/www# vi index.html
root@liu-ubuntu:~/www# cat index.html
<html>
    <head>
    Nginx test
    </head>
    <body>
    <h1>Hello Docker!</h1>
    </body>
</html>

www的同级目录下新建一个名为Dockerfile的文件,将DockerFile文件改写如下:(注意Dockerfile的D需要大写)

FROM ubuntu:14.04
MAINTAINER gogogo gogogo@abc.com
ENV DEBIAN_FRONTEND noninteractive
RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d && apt-get update && apt-get install -y nginx
COPY ./www /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

解释下这个Dockerfile文件:

  • 第一行是用来声明镜像是基于什么构建的,这里指定为ubuntu 14.04;
  • 第二行的作用在于告诉别人你的名字和邮箱;
  • 第三行是取消交互;
  • 第三行RUN命令用来在容器内部的shell里执行命令;
  • 第四行将当前系统的www文件夹拷贝到容器的/usr/share/nginx/html目录下;
  • 第五行声明当前需要对外开放80端口;
  • 最后一行表示运行容器时开启nginx。

这些都是docker固定的语法,这时通过build命令来构建镜像,运行:

docker build -t="gogogo/ubuntu-nginx:v2" .

注意,最后的.表示Dockerfile在当前目录,也可指定其它目录。当创建完毕时,再次运行docker images就会看到刚刚生成的镜像:

root@liu-ubuntu:~# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
gogogo/ubuntu-nginx   v2                  0010acc30a30        40 seconds ago      266 MB
gogogo/ubuntu-nginx   v1                  3179e620c6f5        About an hour ago   266 MB
ubuntu                14.04               578c3e61a98c        2 weeks ago         223 MB

现在就可以运行刚刚的镜像了,和前面运行稍有不同,此时需要对外指定80端口,该行为通过-p参数指定,运行:

docker run -p 80:80 gogogo/ubuntu-nginx:v2

此时,终端会卡住,这是正常的,因为Docker的思想是每个容器最好只开一个线程做一件事,此时打开了nginx服务器,所以终端卡住也没关系。现在可以通过浏览器访问localhost查看效果,如果是虚拟主机则需输入主机ip地址,然后就能看到了如下的页面: