我将使用swoft框架根目录的Dockerfile文件做讲解,看完指令的作用后,你可以自己编写一个。
FROM 指定基础镜像 (必须是第一个指令)
你需要一个基础的镜像为基,如果你实在想不出用啥镜像,就用 FROM scratch
,表示空镜像。
下面的会到docker仓库里去找,然后做为基础镜像。
FROM php:7.1
MAINTAINER 维护者信息,这个没什么好说的,就是告诉你这锅得谁背,哦不,是这事是谁干的。
MAINTAINER weikaixxxxxx <@email.com>
ENV 设置环境变量,在下方可以用。
换成php的写法就是: $PHPREDIS_VERSION = '4.0.0';
ENV PHPREDIS_VERSION 4.0.0
RUN 就是运行shell,看到第一行的{PHPREDIS_VERSION}
没?就是上面赋值的变量。
RUN wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tar.tgz \
&& pecl install /tmp/redis.tar.tgz \
&& rm -rf /tmp/redis.tar.tgz \
&& docker-php-ext-enable redis
注意了,因为镜像的层数是有限的,所以,尽量对RUN指令通过&&
进行拼接。
然后呢,你还发现有rm删除,这又是为什么呢?因为我们安装后压缩包就没有用了。
ADD是将本地文件添加到容器中,如果是压缩包类型(tar.gz,gzip, bzip2等)的会被解压。
格式是: ADD 源路径 目标路径,作用是将源路径文件加到目标路径镜像里去。这里“.”指的是当前目录下所有。
ADD . /var/www/swoft
还有一个COPY,和ADD功能相似,只是不会解压缩包。
WORKDIR 指定容器的工作目录,容器启动时执行的命令会在这个目录下执行
WORKDIR /var/www/swoft
EXPOSE 暴露端口,只是声明而已。
EXPOSE 80
当运行 docker run -P
会将 EXPOSE 配置的端口映射到宿主机的端口上。注意,P是大写的。
声明的是你容器的端口,上面这个图表示你用左边的端口去访问的话,就会访问到你容器的80端口。
感觉还是不好懂,比如你的web是apache,apache是80端口,你启动了apache的容器,此时的容器就是80端口,当你在浏览器地址栏访问32774端口的时候,就会访问到apache的首页了。
ENTRYPOINT 运行命令。
ENTRYPOINT [“php”, “/var/www/swoft/bin/swoft”, “start”]
相当于
# php /var/www/swoft/bin/swoft start
还有一个CMD,和ENTRYPOINT功能相似。ENTRYPOINT只能存在一条。
还有几个其它的,这儿用不着,就不说了。
编辑完运行
# docker build -t swoft:v1 .
-t
是给镜像命名(小写)。swoft是名称,冒号后的是版本号。“.” 表示当前目录,我是在Dockerfile所在的目录(/var/www/swoft)运行这条命令。
等待生成镜像,生成后运行
# docker image ls
就能看到你的镜像啦。
删除镜像
# docker rmi 镜像id