zoukankan      html  css  js  c++  java
  • dockerfile

    Best practices for writing Dockerfiles

    Dockerfile 文件说明

    1. 每一行以Dockerfile的指令开头,指令不区分大小写,惯例使用大写
    2. 使用 # 开始作为注释
    3. 每一行只支持一条指令,每条指令可以携带多个参数
    4. 指令按文件的顺序从上至下进行执行
    5. 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
    6. 制作镜像一般可能需要反复多次,每次执行dockfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件的后面
    FROM 指定基础镜像
    LABEL 指定镜像元数据
    ADD 复制和解包文件
    COPY 复制本地宿主机的文件到容器中(use add)
    ENV 设置环境变量, 可让后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持
    ARG 构建参数,ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量. 如果和ENV同名,ENV覆盖ARG变量
    EXPOSE 暴露端口, 指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信
    ENTRYPOINT 入口点,功能类似于CMD,配置容器启动后执行的命令及参数
    RUN 执行shell命令,在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令
    USER 指定当前用户,指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。如果没有指定 USER,默认是 root 身份执行
    VOLUME 匿名卷, 即使容器后期被删除,此宿主机的目录仍会保留,实现容器数据的持久保存 /var/lib/docker/volumes/<volume_id>/_data
    WORKDIR 指定工作目录, 为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录,WORKDIR 会自行创建
    CMD 容器启动命令
    HEALTHCHECK 检查容器的健康性
    STOPSIGNAL 退出容器的信号
    SHELL 指定shell

    image

    [0 root@vps /data/dockerfile] #cat Dockerfile
    FROM nginx-ubuntu:1.18
    LABEL maintainer="AlexG firewalld@foxmail.com" 
          user="nginx"
    RUN echo `hostname -i`Nginx Website in Docker > /usr/local/nginx/html/index.html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    [0 root@vps /data/dockerfile] #cat build.sh
    docker build /data/dockerfile/ -t $1
    [0 root@vps /data/dockerfile] #bash build.sh nginx:v1
    Sending build context to Docker daemon  3.072kB
    Step 1/5 : FROM nginx-ubuntu:1.18
     ---> b43e05778727
    Step 2/5 : LABEL maintainer="AlexG firewalld@foxmail.com"       user="nginx"
     ---> Running in e04f374c228d
    Removing intermediate container e04f374c228d
     ---> b12e6d0236f3
    Step 3/5 : RUN echo `hostname -i`Nginx Website in Docker > /usr/local/nginx/html/index.html
     ---> Running in d343d7511455
    Removing intermediate container d343d7511455
     ---> cba247a9f7e5
    Step 4/5 : EXPOSE 80
     ---> Running in b060542ed701
    Removing intermediate container b060542ed701
     ---> a063cc75db02
    Step 5/5 : CMD ["nginx", "-g", "daemon off;"]
     ---> Running in 880b8b0be52c
    Removing intermediate container 880b8b0be52c
     ---> a5baca5fad04
    Successfully built a5baca5fad04
    Successfully tagged nginx:v1
    [0 root@vps /data/dockerfile] #
    

    Dockerfile workflow

    1. 选择一个基础镜像的容器

    FROM ubuntu:18.04
    

    2. 做相关自定义设置

    ADD sources .
    ADD code.tgz .
    RUN cd /apps && 
        mvn clean install
    CMD ["mvn", "spring-boot:run"]
    

    3. 导出或打为镜像标签上传仓库

    docker commit -m="add sources" -a="AlexG" ${容器ID/NAME} front_web:v1.0
    docket tag front_web:v1.0 docker.registary.com/dev/front_web:v1.0
    docker save front_web:v1.0 > /data/front_web_1.0.tgz
    docker load -i /data/front_web_1.0.tgz
    

    4. 运行测试

    docker run -d -P docker.registary.com/dev/front_web:v1.0
    

    nginx.dockerfile

    FROM centos:7.9.2009
    LABEL nginx.version=1.18.0
    LABEL maintainer="AlexG <firewalld@foxmmail.com>"
    WORKDIR /data
    ADD nginx-1.18.0.tar.gz /data
    RUN yum -y install  gcc pcre-devel openssl-devel zlib-devel make 
        && useradd -M -s /sbin/nologin nginx 
        && cd nginx-1.18.0 
        && ./configure --prefix=/usr/local/nginx 
           --user=nginx 
           --group=nginx 
           --with-http_ssl_module 
           --with-http_v2_module 
           --with-http_realip_module 
           --with-http_stub_status_module 
           --with-http_gzip_static_module 
           --with-pcre 
           --with-stream 
           --with-stream_ssl_module 
           --with-stream_realip_module 
        && make && make install 
        && rm -rf /data/nginx-1.18.0
        && chown -R nginx.nginx /usr/local/nginx 
        && chown -R nginx.nginx /usr/local/nginx 
        && ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ 
        && echo "<h1>Nginx is OK</h1>" > /usr/local/nginx/html/index.html
    
    EXPOSE 80
    CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
    
    docker build -f Dockerfile -t nginx:v1
    docker run --name  local-nginx -d -p 80:80  nginx:v1
    

    - PS

    /usr/share/vim/vimfiles/doc/dockerfile.txt
    /usr/share/vim/vimfiles/ftdetect/dockerfile.vim
    /usr/share/vim/vimfiles/syntax/dockerfile.vim
    
  • 相关阅读:
    HTML中所用的标签(二)
    HTML中所用的标签(一)
    学习笔记之04表格嵌套练习1
    学习笔记之03百度搜索页面
    学习笔记之02简单的基础
    学习笔记之01程序员起航篇
    Part 53 to 55 Talking about Reflection in C#
    Part 48 to 51 Talking about Access Modifiers in C#
    Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
    Part 57 to 58 Why should you override ToString and Equal Method
  • 原文地址:https://www.cnblogs.com/firewalld/p/14633434.html
Copyright © 2011-2022 走看看