zoukankan      html  css  js  c++  java
  • Docker定制镜像

    定制镜像

    除了使用定制好的镜像外,我们也可以通过定制实现符合自己环境的镜像。 在docker里面通过build方法来生成镜像,在生成镜像之前,我们需要一个Dockerfile脚本,脚本中包含的是一条一条的指令,用来的表示镜像的构建。

    这里我们以原先的nginx镜像为基础,使用Dockerfile重新定制一下,

    • 1.建立一个Dockerfile文件

    • 2.在Dockerfile中编写 FROM nginx RUN echo '<h1>Hello DockerFile!</h1>' > /usr/share/nginx/html/index.html 这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN。

    FROM 指定基础镜像

    所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。 而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

    RUN 执行指令

    RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。

    这样我们就生成了一个新的镜像。这个Dockerfile比较简单 其中涉及到两个指令FROMRUN 在定制镜像的时候,一般是以一些基础镜像为基础,在这之上进行定制。 这里的FROM nginx 就是在nginx镜像的基础上进行的定制。 RUN 指执行命令 类似于在shell中执行。 里我们使用了 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/-> 需要注意的是这里的上下文路径 不是生成镜像存放的位置,而是在生成镜像发送给docker引擎的路径。

    构建镜像

    Dockerfile文件完成之后,通过Docker build命令进行构建镜像。

    wangxian@wangxian:~/wangxian/Docker_test/code1$ docker build -t my_nginx:v1 .
    Sending build context to Docker daemon 2.048kB
    Step 1/2 : FROM nginx
    ---> cd5239a0906a
    Step 2/2 : RUN echo '<h1>Welcome to Docker!!<h1>' > /usr/share/nginx/html/index.html
    ---> Running in 4d51e06eccd5
    Removing intermediate container 4d51e06eccd5
    ---> 9c8135c4b40e
    Successfully built 9c8135c4b40e
    Successfully tagged my_nginx:v1
    wangxian@wangxian:~/wangxian/Docker_test/code1$ docker images
    REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE
    my_nginx           v1                 9c8135c4b40e       5 seconds ago       109MB
    ubuntu             latest             113a43faa138       2 weeks ago         81.2MB
    nginx               latest             cd5239a0906a       2 weeks ago         109MB

    在这里我们指定了最终镜像的名称 -t my_nginx:v1,构建成功后,我们可以像之前运行nginx那样来运行这个镜像.

    wangxian@wangxian:~/wangxian/Docker_test/code1$ docker run -d -p 80:80 my_nginx:v1 
    f30c9abd13de09e783f8b7db11833f31180becdb1bc5abc2243dd28f178e8592

    上下文环境

    Dockerfile常用指令

    在定制镜像时,除了上面所讲到的FROM和RUN之外,还有一些其他的常用的指令。

      1. COPY 复制文件 COPY 指令将从构建上下文目录中<源路径>的文件复制到新的一层的镜像内的<目标路径>位置。

    FROM nginx 
    RUN mkdir app
    COPY ./index.html ./app

    FROM ubuntu:16.04
    COPY ./code.txt /home/
    • 2.CMD容器启动命令 cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。

    CMD 指令的格式有两种

    shell 格式:CMD <命令>
    exec 格式:CMD ["可执行文件", "参数1", "参数2"...]

    第一种
    FROM ubuntu
    CMD echo 'Hello CMD!!'
    wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run e8c9913f85b4
    Hello CMD!
    运行之后,会执行语句。但是不支持添加参数

    第二种
    FROM ubuntu
    CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]

    wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v1
    Hello CMD!!
    wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v1 echo hhhh
    hhhh

    从结果可以发现 使用第二种方式 支持在运行容器是 添加参数 但是会覆盖掉CMD本身的命令。

    • 3.ENTRYPOINT 入口命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。不同的是当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为ENTRYPOINT CMD.

    FROM ubuntu
    CMD ["Hello CMD!!"]
    ENTRYPOINT ["echo"]

    wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v2
    Hello CMD!!
    wangxian@wangxian:~/wangxian/Docker_test/code2$ docker run cc:v2 aaaa
    aaaa
  • 相关阅读:
    自己动手,制作真正的.net Framework 3.5 SP1离线安装包(转)
    理解lvalue和rvalue
    Android webView 支持缩放及自适应屏幕
    微信打赏小程序寻投资或买断代码
    微信批量关注公众号,推送消息软件介绍
    QQ微信号数据库 微信号采集 可区分性别地区1-100万个
    给客户开发的 贵金属喊单视频直播间 财经直播间系统
    揭秘:各大视频网站是这样密谋秀场的
    类似YY 9158网页版多人语音视频聊天室远程教学系统源码
    WEB网页视频会议系统源码
  • 原文地址:https://www.cnblogs.com/pywjh/p/10555589.html
Copyright © 2011-2022 走看看