-
构建镜像命令
docker build -t 仓库名/镜像名:tag .
FROM ubuntu:14.04
MAINTAINER sunqi sunqi@xxx.com
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra -
Dockerfile 四个部分
- 基础镜像信息 FROM
- 维护者信息 MAINTAINER
- 镜像操作指令 RUN
- 容器启动指令 CMD
指令 | 说明 |
---|---|
FROM | 指定所创建镜像的基础镜像 |
MAINTAINER | 指定维护者信息 |
RUN | 运行命令 |
CMD | 容器启动默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息 |
EXPOSE | 声明镜像内服务监听的端口 |
ENV | 指定环境变量 |
ADD | 复制指定src路径的内容到容器的dest路径下。如果src为tar文件,则自动解压到dest路镜下 |
COPY | 复制指定src路径的内容到镜像的dest路径下 |
ENTERPOINT | 指定镜像的默认入口 |
VOLUME | 创建镜像的数据卷挂载点 |
USER | 指定运行容器的用户名或UID |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数 |
ONBUILD | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行创建操作指令 |
STOPSIGNAL | 容器退出信号值 |
HEALTHCHECK | 如何进行健康检查 |
SHELL | 指定使用shell的默认shell类型 |
-
FROM
- FROM是Dockerfile里的第一条而且只能是除了首行注释之外的第一条指令
- 可以有多个FROM指令。来创建多个镜像
- FROM后边是有效的镜像名称。如果该镜像没有在本地仓库,就会去远程pull,如果远程仓库也没有,就会报错build失败
- 下面所有的系统可执行指令,在FROM的镜像中执行
-
RUN
- 格式
- RUN (shell 模式)
- RUN [“executable”, “param1”, “param2”] (exec模式)
- 表示当前镜像构建时运行的命令,如果有确认输入的话,一定要在命令中添加-y参数
- 如果命令比较长,那么可以在命令结尾使用
\
来换行 - 生产中,推荐使用exec模式
- shell模式
/bin/bash -c command
- exec模式
RUN["/bin/bash", "-c", "command"]
- 格式
-
EXPOSE
- 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加
-p
或-P
参数对容器的端口进行分配
- 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加
-
CMD
- 格式
- CMD [“execuable”, “param1”, “param2”] (exec模式,推荐)
- CMD command param1 param2 (shell模式)
- CMD [“param1”, “param2”] 提供给ENTRYPOINT的默认参数
- 解释
- CMD制定容器启动时的默认执行的命令
- 每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行
- 如果你在启动容器的时候docker run 指定的运行命令,那么会覆盖CMD命令
- CMD [ “/usr/sbin/nginx” , “-g”, “daemon off;”]
- 格式
-
ENTRYPOINT
- 格式
- ENTRYPOINT [“execuable”, “param1”, “param2”] (exec模式)
- ENTRYPOINT command param1 param2 (shell 模式)
- 解释
- 和CMD类似都是配置容器启动后执行的命令,并且不会被docker run提供的参数覆盖
- 每个Dockerfile只能有一个有效的ENTRYPOINT,当指定多个时,只有最后一个起效
- 可以同时使用CMD和ENTRYPOINT
- 想要在docker run 时覆盖,可以使用
docker run --entrypoint
- 任何docker run 设置的命令参数或者CMD指令都将作为ENTRYPOINT指令的命令参数,追加到ENTRYPOINT指令之后
- ENTRYPOINT ["/usr/sbin/nginx" , “-g”, “daemon off;”]
- 格式
-
ADD
- 格式
- ADD …
- ADD ["", …, “”]
- 解释
- 将制定的src文件复制到容器文件系统中的dest
- src指的是宿主机,dest指的是容器
- 所有拷贝到容器中的文件和文件夹权限为0755,uid和gid为0
- 如果文件是可识别的压缩格式,则docker会进行解压操作
- 如果源路径是文件夹,且目标路径是以
/
结尾,则docker会把目标路径当作一个文件,如果目标路径不存在,则会自动创建目标路径 - 如果源路径是个文件,且目标路径不是以
/
结尾,则docker会把目标路径当作一个文件,如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件 - 如果目标文件存在,会用源文件覆盖,只是内容覆盖,文件名还保留目标文件名
- 如果目标文件实际是个存在的目录,则会将源文件拷贝到该目录下。这种情况下,最好显示的以
/
结尾,避免混淆
- 格式
-
COPY
- 格式
- COPY …
- COPY ["", … , “”]
- 解释
- COPY指令和ADD指令功能和使用方式类似,只是COPY指令不会进行自动解压工作
- 单纯文件复制场景,推荐使用COPY
- 格式
-
VOLUME
- 格式
- VOLUME ["/data"]
- 解释
- VOLUME指令可以在镜像中创建挂载点,这样只要通过镜像创建的容器就都有了挂载点
- 通过VOLUME指令创建的挂载点,无法指定主机上对应的目录,是自动生成的
- VOLUME ["/var/lib/tomcat7/webapps"]
- 创建数据卷容器,然后其他容器可以挂载数据卷,然后通过volumes-from参数可以共享挂载卷的数据
docker run -itd --name v-1 --volumes-from nginx3 nginx
docker run -itd --name v-2 --volumes-from nginx3 nginx
- nginx3 位数据卷容器,然后v-1和v-2就会共享nginx3设置的挂载点内的文件
- 格式
-
ENV
- 格式
- ENV key value
- ENV key=value ,… 可以一次设置多个环境变量
- 解释
- 设置环境变量,可以在RUN之前使用,RUN命令时调用,容器启动时这些环境变量都会被指定,容器内的应用程序可以读取到设置的环境变量
- 格式
-
WORKDIR
- 格式
- WORKDIR /path/to/workdir(shell 模式)
- 解释
- 切换目录,为后续的RUN,CMD,ETNTRYPOINT指令配置工作目录,相当于cd
- 可以多次切换
- 也可以使用 多个WORKDIR 命令,后续命令如果参数是相对路径,则会基于之前的命令指定的路径
- 格式
-
ONBUILD
-
格式
- ONBUILD [command]
-
解释
-
当一个镜像A被作为其他镜像的基础镜像是,这个触发器才会被执行
-
新镜像B在构建的时候,会插入触发器中的指令
-
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSK4lVAC-1614158556787)(/Users/sunqi/Library/Application Support/typora-user-images/image-20210120184813586.png)]
-
入门Dockerfile
FROM ubuntu RUN mkdir hello RUN mkdir world RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install nginx -y EXPOSE 80
docker build -t mynginx:v1 .
-
优化版Dockerfile
FROM ubuntu RUN mkdir hello && mkdir world RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update && apt-get install nginx -y EXPOSE 80
docker build -t mynginx:v2 .