docker 学习笔记

第四章

Dockerfile指令

CMD

  1. 类似于RUN命令,RUN是构建镜像时指定的命令,CMD是启动时要执行的命令。

  2. docker run 命令可以覆盖 CMD命令,

  3. dockerfile中只能指定一个CMD命令,如果指定多条CMD命令,也只有最后一条命令被执行;如果想要在容器启动时执行多条CMD命令或进程,可以考虑使用supervisor这样的工作

ENTRYPOINT

  1. 指定一个容器启动时要运行的命令,和CMD命令具有相同目的,但不同的一点是,ENTRYPOINT 后的命令不会被覆盖,而且docker run中的命令会被当成参数传递给 ENTRYPOINT。而且可以有多个,并且都可以生效。

  2. 可以将ENTRYPOINT+CMD两个命令配合使用,如果没有传参数,那么就使用CMD的的参数为ENTRYPOINT做为默认参数;

  3. 可以在docker run中指定—entrypoint来覆盖ENTRYPOINT

WORKDIR

  1. 工作目录,CMD和ENTRYPOINT指定的命令会在这个目录执行;

  2. 可以在docker run中指定-w参数来覆盖工作目录

ENV

  1. 用来在构建镜像过程中设置环境变量

  2. 可以使用docker run -e传递环境变量

USER

  1. 指定该镜像的执行用户,指定的话默认为root

  2. 可以使用docker run -u命令覆盖

VOLUME

  1. 向基于镜像创建的容器添加卷,一个卷可以在一个或多个容器内的特定目录;

  2. 卷可以在容器内共享,重用的

  3. 一个容器可以不是和其他容器共享卷

  4. 对卷的修改实时生效

  5. 对卷的修改不会对更新镜像产生影响

  6. 卷会一直存在,直到没有容器使用它

ADD

  1. 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

  2. 参数以/结尾,那么就是目录,否则就是文件

COPY

类似于ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的 <目标路径>位置 两种写法

LABEL

为docker镜像添加元数据信息

STOPSIGNAL

停止容器时,发送什么系统调用信号给容器

ARG

构建时指定dockerfile中的参数,docker build —build-arg

ONBULD

为镜像添加触发器,当一个镜像被当作其他镜像的基础镜像时,该镜像的触发器会被执行

Dockerfile常用指令简介(转载)

编号 指令 作用 示例 备注
1 FROM 构建的镜像是基于哪个镜像 FROM centos:7 tag是可选的
2 MAINTAINER 镜像维护者姓名或邮箱地址 MAINTAINER yang 或 MAINTAINER [email protected] -
3 LABEL 镜像的属性标签,一般放到第三行 LABEL version=“1.0” 为了查看,docker inspect 容器名,并没有实质性的作用
4 RUN 制作镜像过程中需要的执行命令(安装服务) RUN yum -y install nginx 或 RUN [ "yum","install","nginx" ] RUN 指令:用于指定 docker build 过程中要运行的命令,可以写多条
5 CMD 容器启动的时候执行的初始命令,容易被替换(启动服务) CMD [ "-c","/start.sh" ] 或CMD [ "/usr/sbin/sshd","-D" ] 或 CMD /usr/sbin/sshd -D 1.CMD和ENTRYPOINT在运行容器时运行,只能写一条,如果是写多条,最后一条生效2.CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
6 EXPOSE 镜像内部暴漏的服务端口 EXPOSE 80 443 可以指定多个端口,默认tcp协议
7 ARG 和ENV类似 ARG A=19 1.和ENV类似,但是在build,启动容器的时候就会失效,除非在build的时候特意指定,如:docker build -t nginx --build-arg A=19 . (--build-arg A=19会临时修Dockerfile中配置的ARG参数)2.ARG是一个构建参数,只有在构建(docker build -t )的时候才会生效,真正运行的时候就无效了
8 ENV 设置容器内环境变量 ENV MYSQL_PASSWORD 123456 1. 如果ARG和ENV同时使用,操作如下:ARG A=19 \ ENV B $A ,这样在build出来的镜像,会通过ENV打印出ARG的参数信息2.ENV从构建时到运行时,会一直有效的环境变量,永远不会失效
9 ADD 将Dockerfile当前目录下的文件或目录拷贝到镜像中,如果是url或压缩包会自动下载 语法: ADD <源目录或文件>…<目标目录或文件> ADD [ "",… "" ] ADD hom* /mydir/ ADD https://xxx.com/html.tar.gz /var/www/html ADD html.tar.gz /var/www/html 支持curl格式,如果是内部网络的话,推荐使用COPY,将下载下来的tar包会自动解压,然后删除下载下来的压缩包文件,减少了占用的空间
10 COPY 将Dockerfile当前目录下的文件拷贝到镜像中 COPY index.html /usr/nginx/html/ 不自动解压tar包
11 ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换 ENTRYPOINT [ "/bin/bash","-c","/start.sh" ] ENTRYPOINT /bin/bash -c '/start.sh' 1.ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序;2. 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT参数,就是拼接到一起使用
12 VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器 VOLUME [ "/var/lib/mysql" ] 1.该指令使容器中的一个目录具有持久化存储功能,该目录可被容器本身使用,也可以共享给其它容器2.当容器中的应用有持久化数据的需求时可以在 Dockerfile 中使用该指令
13 USER 为RUN、CMD、ENTRYPOINT执行命令指定运行用户 USER :: USER yang 镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
14 WORKDIR 为RUN、CMD、ENTRYPOINT、COPY、ADD设置工作目录 WORKDIR /usr/local/nginx 如果目录不存在,就会自动创建目录
15 ONBULD 当前镜像构建的时候不会执行,基于当前镜像构建的镜像才会执行 ONBUILD RUN mkdir app 示例: Dockerfile1 FROM ubuntu ONBUILD RUN mkdir app docker build -t image1 . docker run --name ct1 -it image1 /bin/bash 创建容器后发现未生成文件夹app Dockerfile2 FROM image1 docker build -t image2 . docker run --name ct2 -it image2 /bin/bash 创建容器ct2的时候,RUN mkdir app执行,文件夹app生成 在使用ONBUILD命令时,其后面跟着的其他命令在当前镜像构建时不会被执行,以其为基础镜像源,构建下级镜像源时才会执行
16 HEALTHCHECK 检查容器健康状态 HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ exit 1 1.interval:间隔(s秒、m分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查; 2.timeout:执行command需要时间,比如curl 一个地址,如果超过timeout秒则认为超时是错误的状态,此时每次健康检查的时间是timeout+interval秒。 3.注意:在Dockerfile中只能有一个HEALTHCHECK指令。如果您列出多个,则只有最后一个HEALTHCHECK将生效。
17 STOPSIGNAL 指定当前的容器使用什么信号 STOPSIGNAL signal 一般很少使用指令设置将被发送到容器退出的系统调用信号。该信号可以是与内核 syscall 表中的位置匹配的有效无符号数字(例如9),也可以是 SIGNAME 格式的信号名称(例如 SIGKILL)。
18 SHELL 当前镜像中使用的是哪种shell,一般Linux默认是/bin/sh(如果想修改,可以改成/bin/bash),而在Windows上[“cmd”, “/S”, “/C”]。 SHELL [“powershell”, “-command”] SHELL /bin/sh 1.SHELL指令必须以JSON格式写入Dockerfile 2.SHELL指令可以多次出现。每条SHELL指令都会覆盖所有先前的 SHELL指令,并影响所有后续指令

第五章 docker 连接

image.png
image.png

你可能感兴趣的:(docker 学习笔记)