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地址,然后就能看到了如下的页面: