创建 Dockerfile
第一步:创建一个存放 Dockerfile 的目录
第二部:创建 Dockerfile 文件
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
#通过 docker build 构建镜像
docker build [OPTIONS] PATH | URL | -
# docker build -t="镜像名(peterxxp/df_test3)"
Dockerfile 指令
FROM 指令
FROM
FORM
必须是已经存在的镜像,存在本机或者可以在公共仓库能 pull 到
基础镜像
第一条非注释指令
MAINTAINER 指令
指定镜像的作者信息,包含镜像的所有者和联系信息
MAINTAINER
RUN 指令
指定当前镜像中运行的命令
有2种模式:
RUN (shell 模式)
使用 /bin/bash -c command 执行
RUN echo hello
RUN ["shell", "param1", "param2"] (exec 模式)
可运行其他 shell ,并指定参数
RUN ['/bin/bash',"-c", "echo hello"]
注意:每个 RUN 都是一层新镜像
EXPOSE 指令
EXPOSE
指定运行改镜像的容器会使用的端口,支持设置多个。不是创建容器就马上自动映射端口。
注意:在容器运行时,必须手动指定端口映射,安全考虑 docker 不会自动指定端口。
#docker run -p 80 -d
CMD 指令
CMD ["executable","param1","param2"] (exec 模式)
CMD command param1 param2 (shell 模式)
CMD ["param1", "param2"] (作为 ENTRYPOINT 指令的默认参数)
注意:
容器运行的时候运行,RUN 在构建的时候运行。
如果 docker run 命令指定了容器运行时候的命令,CMD 就不会被执行
例子:
FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y nginx EXPOSE 80 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
构建镜像:
# docker build -t="peterxxp/nginx_1" .
运行镜像
docker run -d -p 80 --name nginx_c_1 peterxxp/nginx_1
#docker run -d -p 80
ENTRYPOINT 指令
ENTRYPOINT ["executable","param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
注意:与 CMD 区别是不会被 docker run 的指令覆盖
ENTRYPOINT + CMD 混合使用
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g"]
#复制文件到容器内
ADD
ADD ["
COPY
COPY ["
ADD vs COPY
ADD 包含类似 tar 的解压功能
如果单纯复制文件, Docker 推荐使用 COPY
例子:
FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y nginx COPY index.html /usr/share/nginx/html/ EXPOSE 80 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
#添加卷(提供:共享数据,数据持久化)
VOLUME ["/data"]
#指定工作目录(cmd / entrypoint 指定的命令都在这个目录下执行)
WORKDIR /path/to/workdir
1、指定后面 CMD 和 ENTRYPOINT 命令执行目录
2、一般绝对路径,如果是相对目录,会一直传递下去(在后面叠加)
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
输出: /a/b/c
#设置环境变量
ENV
ENV
build 和 run 时候都有效
#指定用户组
USER daemon 指定镜像以什么用户来运行,如果不指定用户,会以 root 身份运行
USER nginx 以 nginx 用户来运行
设置模式:
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
#镜像触发器
ONBUILD [INSTRUCTION]
当前镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
例子:
FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y nginx ONBUILD index.html /usr/share/nginx/html/ EXPOSE 80 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
Dockerfile 构建过程
1、从基础镜像运行一个容器;
2、执行一条指令,对容器做出修改;
3、执行类似 docker commit 的操作,提交一个新的镜像层;
4、再基于刚提交的镜像运行一个新容器;
5、执行 Dockerfile 中的下一条指令,直至所有指令执行完毕;
例子:
---> Runing in 9c87a0679522 //这个就是运行后的容器ID
---> 3104366bfc59 //把容器制作成镜像后,提交的镜像ID(中间层镜像ID)
技巧:
会删除中间层创建的容器,并不删除中间层镜像。
可以通过 docker run 运行中间层,可查看情况,镜像调试排错。
构建缓存
--->using cache 使用了构成缓存,之前构建过
#不用缓存
方法1:#docker build -t="xx" --no-cache .
方法2:使用环境变量 EVN REFRESH_DATE 2020-07-01 ,使用这个时间,可以导致缓存刷新。
#查看镜像构建过程
# docker history peterxx/test1