FROM:定制的镜像都是基于 FROM 的镜像
#例子:FROM alpine:latest,这里的 alpine:latest 就是定制需要的基础镜像。后续的操作都是基于alpine:latest。
RUN:用于执行后面跟着的命令行命令
#例子:#RUN <命令行命令> <命令行命令> 等同于,在终端操作的 shell 命令。
CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
#作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
#CMD 在docker run 时运行。
#RUN 是在 docker build。
#例子:CMD ["/bin/sh","/init.sh"]
#CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
#如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
#但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。
#例子:ENTRYPOINT ["/bin/sh","/init.sh"]
#在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
#如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
ADD:把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY:把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
#例子:COPY www.conf /etc/php7/php-fpm.d/www.conf
WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。
#例子:WORKDIR /html
#目录不存在会自动创建目录
#使用WORKDIR之后当前目录就一直在指向的目录中 指定容器的默认工作目录
EXPOSE:镜像要暴露的端口
#例子:EXPOSE 80
#在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
#避免重要的数据,因容器重启而丢失,这是非常致命的。
#避免容器不断变大。
#例子 VOLUME ["<路径1>", "<路径2>"...]
# VOLUME <路径>
#在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
ENV:设置环境变量,定义了环境变量,那么在后续的容器指令中,就可以使用这个环境变量。
#例子:ENV NODE_VERSION 7.2.0
# RUN $NODE_VERSION
LABEL:镜像的属性标签
MAINTAINER:管理者标识 或者 指定作者的名字
使用dockerfile自动制作基于alpine系统的kod镜像
#先随便创建一个容器
docker run -it -P alpine:latest /bin/sh
#进入容器
docker exec -it jovial_franklin /bin/sh
#更新清华源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
#下载nginx和php
apk add nginx php-fpm php-gd php-mbstring php-session php-json curl php-ldap php-pdo php-xml php-curl php-iconv
#编辑php和nginx配置文件
vim /etc/php7/php-fpm.d/www.conf
user = nginx
group = nginx
vim /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name;
include fastcgi_params;
}
}
}
#然后把配置文件导出来宿主机
cd /root/dockerfile/dockerfile_alpine_kod
docker cp jovial_franklin:/etc/nginx/nginx.conf .
docker cp jovial_franklin:/etc/php7/php-fpm.d/www.conf .
把kod.tar.gz 拉进 /root/dockerfile/dockerfile_alpine_kod
#创建dockerfile
mkdir /root/dockerfile/dockerfile_alpine_kod
cd /root/dockerfile/dockerfile_alpine_kod
vim dockerfile
FROM alpine:latest
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk update
RUN apk add nginx php-fpm php-gd php-mbstring php-session php-json curl php-ldap php-pdo php-xml php-curl php-iconv
COPY www.conf /etc/php7/php-fpm.d/www.conf
COPY nginx.conf /etc/nginx/nginx.conf
WORKDIR /html
COPY kod.tar.gz /html/kod.tar.gz
RUN tar xf kod.tar.gz
RUN chown -R nginx.nginx /html
RUN mkdir /run/nginx/ -p
COPY init.sh /init.sh
RUN chmod +x /init.sh
ENTRYPOINT ["/bin/sh","/init.sh"]
vim init.sh
#!/bin/bash
nginx
php-fpm7 --nodaemonize
#构建镜像
docker build -t alpine:latest --network=host .
#启动容器
docker run -d -it -p 80:80 alpine:latest
#验证
docker history alpine:latest
访问10.0.0.11:80 出现可道云网页
dockerfile优化
a: 使用体积小的linux镜像alpine作为基础镜像
b:尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件
dockerfile多阶段构建
默认情况下,阶段未命名,您可以通过整数来引用它们,从第0个FROM指令开始。
但是,您可以通过向FROM指令添加as NAME来命名您的阶段。此示例通过命名阶段并使用COPY指令中的名称来改进前一个示例。
这意味着即使稍后重新排序Dockerfile中的指令,COPY也不会中断。
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]