Dockerfile 命令

自定义Dockerfile自定义mycentos使镜像有vim编辑器,ifconfig等支持:

FROM centos
ENV MY_PATH /tmp
WORKDIR $MY_PATH 
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD /bin/bash
[root@localhost ~]# docker build -f Dockerfile -t mycentos:1.1 .
...
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mycentos            1.1                 4c877d106213        About a minute ago   481 MB
[root@localhost ~]# docker run -it mycentos:1.1 
[root@9804426b241e tmp]# pwd
/tmp
[root@9804426b241e tmp]# ifconfig
...
[root@9804426b241e tmp]# vim test.txt
...
ctrl+p+q
[root@localhost ~]# docker stop 98
...
[root@localhost ~]# docker start 98
...
[root@localhost ~]# docker attach 98
[root@9804426b241e tmp]#

自定义Dockerfile执行命令并使用run后面的参数:
使用ENTRYPOINT

...
ENTRYPOINT ["curl","-s","https://ip.cn/"]
[root@localhost ~]# docker run -it mycentos:1.1 -i

合起来是 curl -s -i https://ip.cn/

docker 阿里云 发布和拉取镜像 dev.aliyun.com
$ sudo docker login --username=15720613056 registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sakuragio/mytest:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sakuragio/mytest:[镜像版本号]
 
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/sakuragio/mytest:[镜像版本号]





1. 基础知识

  1. 每条保留字指令(ADD、CMD…)都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上倒下,顺序执行
  3. # 表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

执行Dockerfile的大致流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

从应用软件角度来看,DockerFile、Docker镜像与Docker容器分别代表软件的三个不同阶段。

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态
     

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合理充当Docker体系的基石。

2. 保留字指令

  • FROM 基础镜像,当前镜像是基于哪个镜像的

    有点像java中的extends关键字
     
    FROM
    FROM :
    FROM @

  • MAINTAINER 镜像维护者的姓名和邮箱地址

    MAINTRINER wang

  • RUN 容器构建时需要运行的命令

    RUN 在shell终端中运行,这种方式类似于直接在命令行输入命令
    RUN ["executable", "param1", "param2"] 使用exec执行,这种方式类似于函数调用

  • EXPOSE 当前容器对外暴露出的端口

    EXPOSE [...]
     
    需要注意的是,这只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的主要作用是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时,会自动映射EXPOSE的端口
    例如:
    EXPOSE post1 相应的运行容器使用的命令 docker rum -p port1 imagedocker run -P image
    EXPORT port1 port2 port3 相应的运行容器使用的命令 docker run -p port1 -p port2 -p port3 image
    也可以指定映射 host_port1:post

  • WORKDIR 指定在创建容器后,中断默认登录进来的工作目录

    切换目录指令,类似于cd命令,卸载该指令后的RUN、CMD以及ENTRYPOINT指令都将该目录作为当前目录,并执行相应的命令

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

    ENV
    ENV = ...
    ENV MY_PATH /usr/mytest
    这个环境变量可以在后续的任何RUN指令中使用,也可以在其他指令中直接使用这些环境变量
    比如:WORKDIR $MY_PATH

  • ARG 设置构建参数

    类似于ENV,和ENV不同的是,ARG设置的是构建时的环境变量,在容器运行时是不会存在这些变量的
    例如:
    ARG user1=someuser

  • ADD 用于复制文件

    ADD ...
    ADD ["",...""]
    从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包

    • src必须在构建的上下文内,不能使用例如 ADD …/somethine/something 这样的命令,因为docker build命令首先会将上下文路径和其子目录发送到docker daemon
    • 如果src是一个URL,同时desc以斜杠结尾,dest将被视为目录,src对应内容将被下载到dest目录
    • 如果src是一个URL,同时dest不以斜杠结尾,dest将被视为文件,src对应内容文件将下载到dest
    • 如果文件是可识别的压缩包格式,则docker会自动解压

    例:
    ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar

  • COPY 复制文件

    COPY ...
    COPY ["",...""]
    复制本地端的src到容器的dest,和ADD指令类似,但不支持URL和解压

  • VOLUME 容器数据卷,用于数据保存和持久化工作

    VOLUME /data
    指定挂载点,是容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器

  • CMD 容器启动命令

    CMD命令用于为执行容器提供默认值,每个Dockerfile只有一个CMD命令,如果指定了多个CMD命令,那么只有最后一条会被执行,如果启动容器时指定了运行的命令,则会覆盖CMD指令的命令。
    CMD ["executable", "param1", "param2"] (exec格式)
    CMD ["param1", "param2"] (为ENTRYPOINT指令提供预设参数)
    CMD command param1 param2 (shell格式,在shell中执行)

    例如:
    CMD echo "This is a test." | wc -

    docker run it -p 8888:8080 tomcat ls -l 会 覆盖 CMD ["catalina.sh", "run"] 命令 导致tomcat启动不起来

  • ENTRYPOINT 入口点

    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2
    和CMD指令目的一样,都是指定Docker容器启动时执行的命令,可多次设置,但run的时候只有最后一个有效
    docker run ... 之后的参数会被当作参数传递给ENTRYPOINT,之后形成新的命令组合

  • ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发

你可能感兴趣的:(Docker)