前言
上一篇文章呢,我们简单的了解了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 start
。CMD
只能执行一次,重复写会覆盖哦。
EXPOSE指令
EXPOSE <port> [<port>...]
这条命令是指明最后容器需要暴露哪些端口号,这样其他系统才能使用这个端口。比如常见的80
、3306
这些,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啦,下节见咯!~