zoukankan      html  css  js  c++  java
  • 《Docker技术入门与实践》Docker入门4-使用Dockerfile创建镜像

    Dockerfile基础

    Dockerfile分四部分组成: 基础镜像、维护者信息、镜像操作指令、启动时命令
    ps: 我的本地镜像已经有centos,若没有请使用docker pull centos

    入门例子

    创建Dockerfile文件

    cd temp && vim Dockerfile

    #若本地镜像没有centos请先使用`docker pull centos`
    FROM centos
    
    MAINTAINER thewindkee thewindkee@163.com
    
    RUN  echo hi
    

    在当前目录下执行docker build .
    效果:构建了一个centos镜像,并且输出了hi

       Sending build context to Docker daemon 2.048 kB
       Step 1/3 : FROM centos
        ---> 1e1148e4cc2c
       Step 2/3 : MAINTAINER thewindkee thewindkee@163.com
        ---> Running in aa0fbd3c9882
        ---> fdeb2afefe47
       Removing intermediate container aa0fbd3c9882
       Step 3/3 : RUN echo hi
        ---> Running in f15e63f49e17
        
        hi
         ---> b96f2a0acf5d
        Removing intermediate container f15e63f49e17
        Successfully built b96f2a0acf5d
    

    在这里插入图片描述

    ★含有nginx的例子

    实际不需要这么麻烦,直接使用docker pull nginx即可,这里只是作为练习

    FROM centos
    
    MAINTAINER thewindkee thewindkee@163.com
    
    RUN yum install wget -y
    # or ADD nginx.tar ~
    RUN  wget http://nginx.org/download/nginx-1.14.2.tar.gz
    RUN tar -xvf nginx-1.14.2.tar.gz 
    WORKDIR nginx-1.14.2
    RUN ls
    
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
    RUN yum install -y libxml2 libxml2-dev libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install
    
    ENV PATH /usr/local/nginx/sbin:$PATH
    
    EXPOSE 80
    #防止启动后退出,因此daemon off;
    CMD ["/bin/bash", "-c", "nginx -g 'daemon off;'"]
    

    docker build

    docker build .  #利用Dockerfile 创建一个镜像
    

    打包效果:
    build中

    使用docker tag 镜像ID 新仓库名:TAG 为其添加版本号
    在这里插入图片描述
    启动
    在这里插入图片描述

    使用docker commit 创建一个新镜像

    docker commit 容器名 之后的镜像名:版本号
    docker commit 可以在一个容器的基础上创建一个新的镜像。
    这里为了方便看出效果,我们先改变一下原镜像的内容,再commit成新镜像

    启动刚才Dockerfiel使用exec 进入容器,改变index.html的title

    在这里插入图片描述

    commit后启动 新镜像
    可以发现新镜像是改变后的内容。
    ps:run每次开启一个新容器,start 启动已存在的容器.run = create+start

    在这里插入图片描述

    参考:
    Dockerfile 语法

    FROM
    基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。如果同一个DockerFile创建多个镜像时,可使用多个FROM指令(每个镜像一次)
    # Usage: FROM [image name]
    FROM ubuntu
    MAINTAINER
    指定维护者的信息,并应该放在FROM的后面。
    # Usage: MAINTAINER [name]
    MAINTAINER authors_name
    RUN
    RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
    格式为Run 或者Run [“executable” ,”Param1”, “param2”]
    前者在shell终端上运行,即/bin/sh -C,后者使用exec运行。例如:RUN [“/bin/bash”, “-c”,”echo hello”]
    每条run指令在当前基础镜像执行,并且提交新镜像。当命令比较长时,可以使用“/”换行。
    # Usage: RUN [command]
    RUN apt-get update
    USER
    格式为 USER daemon 。
    指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。
    当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。
    # Usage: USER [UID]
    USER 751
    VOLUME
    VOLUME命令用于让你的容器访问宿主机上的目录。
    格式为 VOLUME [“/data”] 。
    创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
    # Usage: VOLUME ["/dir_1", “/dir_2” …]
    VOLUME ["/my_files", “/app_files”]
    WORKDIR
    WORKDIR命令用于设置CMD指明的命令的运行目录。
    格式为 WORKDIR /path/to/workdir 。
    为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
    可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    # 最终路径为 /a/b/c 。
    CMD
    支持三种格式:
    CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐
    CMD command param1 param2,在/bin/sh上执行
    CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。
    每个容器只能执行一条CMD命令,多个CMD命令时,只最后一条被执行。
    # Usage 1: CMD application “argument”, “argument”, …
    CMD “echo” “Hello docker!”
    ENV
    格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
    ENV TZ “Asia/Shanghai”
    ENV LANG en_US.UTF-8
    ENV LC_ALL en_US.UTF-8
    ADD
    ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。如果文件是可识别的压缩格式,则docker会帮忙解压缩。
    # Usage: ADD [source directory or URL] [destination directory]
    ADD /my_app_folder /my_app_folder
    COPY(基本于ADD没有区别)
    COPY 将文件从路径 <src复制添加到容器内部路径 。
    COPY
    EXPOSE
    指定在docker允许时指定的端口进行转发
    EXPOSE […]
    ENTRYPOINT
    两种格式:
    ENTRYPOINT [“executable”, “param1”, “param2”]
    ENTRYPOINT command param1 param2(shell中执行)。
    配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
    ONBUILD
    ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

  • 相关阅读:
    业余爱好很有必要
    平和的心态
    合理预期
    有所为,有所不为
    iOS中使用UITextView设置不同文本部分点击事件小结
    一直在路上
    Windows平台交叉编译Arm Linux平台的QT5.7库
    UOS创建开机自启程序或脚本
    HTTP HTTP请求报文和响应报文的格式
    ObjectObject.prototype.toString.call()方法的使用
  • 原文地址:https://www.cnblogs.com/thewindkee/p/12873144.html
Copyright © 2011-2022 走看看