1.FROM 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
就像我们之前运行了一个redis镜像的容器,再进行修改一样,基础镜像是必须指定的。
而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,
如ubuntu 、 debian 、 centos、 alpine 等这些操作系统的软件库
2、RUN 执行命令
RUN 指令是用来执行命令行命令的。
格式:
RUN <command> (类似/bin/sh -cshell格式)
RUN ["executable", "param1", "param2"] (exec格式)
类似shell脚本风格的:
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
之前说过,Dockerfile 中每一个指令都会建立一层, RUN 也不例外。
每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,
在其上执行这些命令,执行结束后, commit这一层的修改,构成新的镜像。使用 Dockerfile 定制镜像 而上面的这种写法,创建了很多层镜像。
这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。
结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学 Docker 的人常犯的一个错误。
Union FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。