2

前言

上一篇文章呢,我们简单的了解了Docker的基本命令,这篇文章呢,我们来了解下Dockerfile这个文件。

一个神奇的文件:Dockerfile

我不知道有多少同学之前用过Vagrant来统一开发环境的,如果你之前接触过Vagrant的话,Dockerfile有点类似于vagrantfile文件。
一言以蔽之,Dockerfile就是描述了你要构建一个什么样的镜像,好比你要建立一栋大楼,你需要把每一步写进一张蓝图中,然后交给工人(docker build [dockerfile文件所在路径]),然后你就拥有了一栋房子,懂了么?懂了么?懂了么?
我们来看下dockerfile长什么样子吧?

# Nginx
#
# VERSION               0.0.1

FROM      ubuntu
MAINTAINER Victor Vieux <victor@docker.com>

LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

这个是官方给出的例子。
FROM指明了这里镜像继承Ubuntu的基础系统。
MAINTAINER是指明了作者信息,一般是名字和邮箱。
LABEL是为你即将打造的镜像写上一些标签信息。
RUN这个是执行一条命令,等价于你在终端打了一条命令

当然,远远不止这些命令,我列举几条比较常用的还有一些注意点吧。

FROM指令

FROM <image>:<tag> 

这里大家要注意一点就是,docker官方源镜像被墙,所以如果你要使用国内源的话需要这样来书写:FROM daocloud.io/ubuntu:latest,这是很多新人一直摸不着头脑经常要问的,这里给大家提示下。

RUN指令

RUN <command>

这条命令相当于你在终端执行了一条命令,当然这条命令一般是一条能够带来内容写入的命令,比如RUN apt-get install vim这样的安装程序的命令,或者是RUN echo "Hello" > /hello.txt这样的脚本命令。RUN可以在dockerfile中存在多条,大家要注意了。
当然还有RUN ["/bin/bash", "-c", "echo hello"]这样也是可以的。

CMD指令

CMD ["executable","param1","param2"]

CMD指令一般用来指明启动容器时需要运行什么进程。一般我们是跑一条无输入有输出的前台进程,比如官方ghost启动时就运行了/entrypoint.sh npm start,这就是一条无输入有输出的命令,输出将会作为容器的日志显示。但是你看到ghost的Dockerfile会发现:

...
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

EXPOSE 2368
CMD ["npm", "start"]

ENTRYPOINT是配置容器启动后执行的命令,CMD此时为它提供了两个参数,所以等价于CMD /entrypoint.sh npm startCMD只能执行一次,重复写会覆盖哦。

EXPOSE指令

EXPOSE <port> [<port>...]

这条命令是指明最后容器需要暴露哪些端口号,这样其他系统才能使用这个端口。比如常见的803306这些,PHP开发者对这些端口应该是非常熟悉的了。在这里多说几句,就是写明了这个指令不代表你可以从外面就直接连进来,因为你的dockerfile最后生成的是镜像文件,你需要用这个镜像文件来run容器。所以你要在run的时候使用-P参数来随机分配映射口或者使用-p来指定端口映射。

ADD、COPY指令

ADD  <src> <dest>
COPY <src> <dest>

这两个都是复制命令,比如Ubuntu下需要换源(替换/etc/apt/source.list文件)就可以用这个命令,推荐使用COPY

VOLUME挂载指令

VOLUME ["/data"]

顾名思义,就是挂载一个主机目录到你的容器内,对于PHP开发者而言就是你可以在本地写好代码在目录/workdir/test,然后挂载进去来省去繁杂的复制代码进入容器的过程。但是灵活性不高,后面我在编排的时候会教大家用编排来统一开发环境。

更多

还有更多指令大家看下官方文档,我自己觉得上面的指令算是使用比较多的了。作为PHP开发者只要认识这几个我觉得够用了。

构建镜像

前面说了好多,目的就只是为了自动化构建一个属于自己的镜像。哈哈,别不耐烦,但凡官方给出的镜像都会附带一份dockerfile的,不信到hub上去look look。你的PHP官方也是给出了dockerfile:Docker Official Image packaging for PHP

好了,该给出这道命令了

docker build [dockerfile所在目录]

比如我的dockerfile路径是~/project/dockerfile,那么我构建镜像的命令是:

docker build -t cnbrucehong/myimg   ~/project/
                   |                     |
       -t指明了你要给这个镜像什么名字  注意这里没有dockerfile

然后你键入

docker images

你就能看到你创建的镜像啦,赶紧run一下试试吧!~有问题可以在下面留言哦!~

下节预告

下届我们来说说如何在Mac下优雅的搭建Docker,哈哈如果你是linux的用户可以直接跳过,如果是window的话也是可以看看的,因为里面介绍的软件在window也是有的,但是我还是推荐大家使用mac啦,下节见咯!~


洪旭
4.1k 声望134 粉丝

欢迎关注我的微博:@码云