• docker构建镜像 (3)


    使用Dockerfile构建镜像

    Dockerfile使用DSL(Domain Specific Language)来构建一个Docker镜像,只要编辑好了Dockerfile文件,就可以使用docker build命令来构建一个新的镜像。

    我们先创建一个空文件夹并在文件夹下创建名为Dockerfile的文件。

    touch Dockerfile

    编辑这个Dockerfile文件添加如下所示的内容。

    vim Dockerfile
    # version: 0.0.1
    FROM ubuntu:14.04
    MAINTAINER jackfrued "jackfrued@126.com"
    RUN apt-get update && apt-get install -y nginx
    RUN echo 'hello, world!' > /usr/share/nginx/html/index.html
    EXPOSE 80

    我们来解释一下上面的Dockerfile文件。Dockerfile文件通过特殊的指令来指定基础镜像(FROM指令)、创建容器后需要指定的命令(RUN指令)以及需要暴露的端口(EXPOSE)等信息。我们稍后会专门为大家介绍这些Dockfile中的指令。

    接下来我们可以使用docker build命令来创建镜像,如下所示。

    docker build -t="jackfrued/webserver" .

    提示:上面的命令最后面的. 千万不要漏掉了哦,它表示从当前路径下寻找Dockerfile。

    通过下面的命令可以查看创建好的镜像。

    docker images
    REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
    jackfrued/webserver   latest              87d6cb096be2        23 minutes ago      222 MB

    如果想知道镜像文件是如何创建出来的,可以使用下面的命令。

    docker history jackfrued/webserver
    IMAGE         CREATED         CREATED BY                                      SIZE
    87d6cb096be2  25 minutes ago  /bin/sh -c #(nop)  EXPOSE 80/tcp  0 B                 
    53d3bc3a123e  25 minutes ago  /bin/sh -c service nginx start                  3 B
    10646b63275e  25 minutes ago  /bin/sh -c echo 'hello, world!' > /usr/sha...   14 B
    f3e3bf3e998e  25 minutes ago  /bin/sh -c apt-get update && apt-get insta...   34.3 MB
    c98e22cf5a64  26 minutes ago  /bin/sh -c #(nop)  MAINTAINER jackfrued "j...   0 B
    2c5e00d77a67  3 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
    <missing>     3 months ago    /bin/sh -c mkdir -p /run/systemd && echo '...   7 B
    <missing>     3 months ago    /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B
    <missing>     3 months ago    /bin/sh -c set -xe   && echo '#!/bin/sh' >...   195 kB
    <missing>     3 months ago    /bin/sh -c #(nop) ADD file:1e01ab604c0cc30...   188 MB

    使用该镜像来创建容器运行Web服务器。

    docker run -d -p 80:80 --name mywebserver jackfrued/webserver nginx -g "daemon off;"
    如果希望将上面创建的镜像文件放到dockerhub仓库中,可以按照如下所示的步骤进行操作。

    通过下面的命令登录到dockerhub。

    docker login

    输入用户名和口令进行登录。

    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: jackfrued
    Password: 
    Login Succeeded

    通过下面的命令将镜像推到仓库中(注意斜杠前一定是hub.docker.com的登录id否则会报错:denied: requested access to the resource is denied)。

    docker push jackfrued/webserver

    Dockerfile指令

    想了解Dockerfile的指令可以查看官方提供的参考手册,下面我们为大家介绍一些常用的指令。

    1. FROM:设置基础镜像,必须是Dockerfile中的第一条指令。

      FROM <镜像名> [AS <别名>]
      或
      
      FROM <镜像名>[:<标签>] [AS <别名>]
    2. RUN:指定构建镜像时要执行的命令。

      RUN <命令> [参数1], [参数2], ... 
      或
      
      RUN ["可执行文件", "参数1", "参数2", ...]
    3. CMD:指定构建镜像后要执行的命令。

      CMD <命令> [参数1], [参数2], ...
      或
      
      CMD ["可执行文件", "参数1", "参数2", ...]

      说明:Docker不同于虚拟机,容器本身就是一个进程,容器中的应用应该位于前台运行。CMD命令相当于就是用来指定容器主进程(创建容器后要在前台执行的程序)的,如果主进程结束了,容器也就停止运行了。所以在容器中启动Nginx不能使用service nginx start或是systemctl start nginx而是要通过CMD ["nginx", "-g", "daemon off;"]让它在前台运行。

    4. ENTRYPOINT:和CMD类似,也可以执行命令,但docker run命令行中指定的任何参数都会被当做参数再次传给ENTRYPOINT指令中的命令,这就使得我们可以构建一个镜像,它既可以运行一个默认的命令,也支持通过docker run命令行为该命令指定可覆盖的参数选项。

      ENTRYPOINT <命令> [参数1], [参数2], ...
      或
      
      ENTRYPOINT ["可执行文件", "参数1", "参数2", ...]
      WORKDIR:在通过镜像创建新容器时,在容器内部创建一个工作目录,ENTRYPOINT和CMD指定的程序会在这个目录下执行。在使用docker run命令时可以通过-w参数来覆盖由WORKDIR指定的工作目录。例如:
    5. WORKDIR /opt/webapp
      
      docker run -w /usr/share/webapp ...
    6. ENV:在创建镜像时设置环境变量。在使用docker run命令时,可以通过-e参数来修改环境变量的设置。例如:

      ENV DEFAULT_PORT=8080
      docker run -e "DEFAULT_PORT=8000" ...
    7. USER:指定镜像会以什么用户身份去运行。例如:

      USER nginx
    8. VOLUME:在创建容器时添加一个数据卷的挂载点。通过数据卷操作可以实现容器间数据的共享和重用,对卷所作的修改可以马上生效而不需要重新启动容器,我们之前创建容器时使用—volume参数就是为了实现数据卷的映射操作。

      VOLUME ["/路径1", "/路径2/子路径2.1/", ...]
    9. ADD:将构建目录下的文件和文件夹复制到镜像中,如果是压缩文件和归档文件,ADD命令会对这些文件进行解压缩解归档的操作。

      ADD [--chown=<用户>:<用户组>] <源文件> <目标文件>
    10. COPY:非常类似于ADD,但不会主动对文件进行提取操作。

    11. LABEL:为Docker镜像添加一些元数据,在使用docker inspect命令时会看到这些元数据。

      LABEL version="1.0.0" location="Chengdu"
    12. ONBUILD:为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像,触发器将会被执行。例如:

      ONBUILD ADD . /app/src
      ONBUILD RUN cd /app/src && make
  • 相关阅读:
    NOI 模拟赛
    bzoj 4998 星球联盟
    bzoj 4545 DQS 的 Trie
    loj #161 子集卷积
    bzoj 5093 图的价值
    bzoj 4299 Codechef FRBSUM
    NOI 模拟赛
    WC2018 州区划分
    CSP 2020 T2 动物园
    CSP 2020 T1 儒略日
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/12679571.html
Copyright © 2020-2023  润新知