Dockerfile 构建镜像和指令

原创 Docker
阅读数: 1112 2020年08月02日

创建 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


phpriji.cn | 网站地图 | 沪ICP备17015433号-1