关于Docker基础,请看http://blog.zhuxyid.com/2018/11/23/Docker
自制镜像方式
基于容器方式来制作镜像,这种方法配置繁琐,不适合使用,每次配置文件更该都需要制作镜像
基于Dockerfile
Dockerfile
Dockerfile是一个文本文档,包含用户可以在命令行上调用命令组合,使用docker build用户可以自动构建一个连续执行多个命令行
Dockerfile编译完成科研使用docker build
来进行编译Dockerfile文件
1 | docker build -t IMAGE_NAME:TAGS /DOCKERFILE_PATH/Dockerfile |
Dockerfile注意事项
1 | Comment #注释 |
Dockerfile语法
FROM
FROM指令是最重的 一个且必须为Dockerfile文件开篇的第一个非注释行,
用于镜像文件构建过程 指定基准镜像,后续的指令运行于 此基准镜像 所提供的运行环境
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,其不存在时,则会从Docker hub registry拉去所需的镜像文件 (如果找不到指定的镜像文件,docker build会返回一个错误信息)
1 | 语法: |
MAINTANIER
用于让dockerfile制作者提供信息,Dockerfile并不限制MAINTAINER指令可在出现的位置,但推荐放在FROM指令后
1 | 语法: |
COPY
用于从Docker主机复制文件到创建的新镜像文件
1 | 语法: |
ADD
ADD指令类似COPY指令,ADD支持使用TAR文件和URL路径
1 | 语法: |
WORKDIR
用于为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD指定设定工作目录
1 | 语法: |
VOLUME
用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷
1 | 语法: |
EXPOSE
用于为容器打开指定要监听的端口以实现与外部通讯,注意,这里只能是定义容器的端口.后期docker下载下来宿主机的端口并不确定
1 | 语法: |
ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENV,ADD,COPY等)所调用 WORKDIR只是工作目录
调用格式为$variable_name
或者${variable_name}
1 | 语法: |
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
1 | 语法: |
CMD
类似RUN指令,CMD指令也可以用于运行任何命令或应用程序,不过二者运行时间点不同
RUN 指令运行与镜像文件构建过程,而CMD指令运行基于Dockerfile构建出的新映像文件启动一个容器时
CMD 指定的首要 目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器将终止;不过CMD指令的命令其可以被docker run的命令选项所覆盖
在Dockerfile中可以存在多个CMD指令,但仅是最后一个会生效,而RUN不是
1 | 语法: |
RUN 是运行在docker build过程中的命令,而CMD 是在docker run运行时的命令
注意:一个容器只是用于单个应用。nginx,redis,mysql都是运行在后台
所有进程都是一个进程的子进程,除了init。init是内核启动
比如手动启动nginx,它是shell的子进程,有些shell子经常会占据终端窗口,需要加&符号
nginx & 这里nginx父进程依然是shell,当shell结束后,会将nginx也结束
nohup nginx & 这里是将nginx送到后台,重新赋予一个新的进程,这是shell退出这个依然存在
在用户空间先启动shell,才能使用ls,cat,等命令,可以直接exec执行命令.
在容器中可以基于shell启动程序,也可以通过exec启动程序
在json数组中,引号一定要写双引号,单引号可能会出现问题
ENTRYPOINT
类似CMD指定的功能,用于为容器指定默认运行程序,从而使得容器像一个单独的可执行程序
于CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令参数会被当做参数传递给ENTRYPOINT指定指定的程序
不过,docker run命令的–entrypoint选项参数可覆盖ENTRYPOINT指令指定的程序
1 | 语法: |
USER
用于指定运行image时或者运行Dockerfile中任何RUN,CMD或者ENTRYPOINT指令指定的程序时的用户名或UID
默认情况下, container运行身份是root用户.
1 | 语法 |
HEALTHCHECK
健康状态检查,判断容器里面的程序是否正常运行.
这里需要注意,如果nginx指定的目录不存在,nginx也会运行,但是用户访问是访问不了的,可以断定这虽然是可以运行但不是想要的结果,比如使用curl检测网页200的信息,如果是200则正常,非200则不正常
1 | HEALTHCHECK定义一个CMD来检测容器中主进程工作状态与否 |
SHELL
linux默认shell是[“/bin/sh”,”-c”]
windows默认是[“cmd”,”/S”,”/C”]
格式:SHELL ["/bin/bash","-c"]
STOPSIGNAL
定义停止的信号,默认是15
格式: STOPSIGNAL 14
可以修改停止的信号
ARG
ARG的参数只是一个变量,只在docker build时候使用,在--build-arg <varname>=<value>
1 | 语法: |
ONBUILD
用于在Dockerfile中定义一个触发器
Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile作用FROM指令的参数,并以之构建新的映像文件
在后面的这个Dockerfile中FROM指令在build过程中被执行,将会”触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
1 | 语法: |
Example
1 | mkdir /data/container/web1 |