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

    用Dockerfile定制镜像

        镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那之前提示的无法重复的问题。镜像透明性问题。体积的问题就都会解决,所以就有了Dockerfile。

        Dockerfile是一个文本文件,其内容包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

    创建一个空的目录(养成好习惯,目录要干净,项目路径也是要干净简洁)

    mkdir mynginx

    创建一个文件 Dockerfile 里面这样写

    FROM nginx

    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

    就两行,第一行是指定基础镜像,就是这个镜像已哪个镜像为基础开始创建。上面是用的官方nginx镜像,官方Docker Hub有很多基础镜像,  

    服务类:

    nginx  、 redis  、 mongo  、 mysql  、 httpd  、 php  、 tomcat、

    语言应用:

    node  、 openjdk  、 python  、 ruby  、 golang 、 

    操作系统:

    ubuntu  、 debian  、 centos  、 fedora  、 alpine等很多镜像。

    如果想用空白镜,也就是不用镜像就直接 FROM scratch 这个并不罕见,swarm etcd 或者一些GO语言开发的应用很多会直接用这种方式来制作镜像。

    这个是Dockerfile里的第一条指令,第二条是用的RUN

    RUN  指令是用来执行命令行命令的。两种格式:

    shell 格式: RUN <命令>  

    exec 格式: RUN ["可执行文件", "参数1", "参数2"]

     

    一定一定一定要注意,每一条RUN都会创建一个单独的一层镜像的,千万不要这么写:


    这创建了七层镜像。正确姿势是类似这样:

     

    其实就是一条RUN 指令。必须这么写,这样就创建了一层了。不过讲真,这看着不舒服。

    还有就是Union FS是有最大层数限制的,AUFS曾经是最大42层,现在是127层。

    还有就是,构建镜像的时候,确保每一层只添加真正需要的东西,其他的或者是中间生成的垃圾,都记得删除清理掉。保持干净,给后面的镜像留下干净的环境。

     

    然后继续回到Dokcerfile构建这块来,现在是开始构建镜像。

    格式 docker build [选项] <上下文路径/URL/->

    具体操作是:docker build -t nginx:v3 .

    细节看下下面(我故意输入了一些命令,回忆下现在是个什么状态)

     

    跑跑试试

     

    可以,没问题。

    关于 【镜像构建上下文(Context)】

    上面 docker build -t nginx:v3 .  最后面的那个.是指定上下文的意思,这个上下文要注意,这块容易混淆。

    当构建的时候,用户会指定构建镜像上下文的路径, docker build  命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。然后如果你在Dockerfile中这么写:

    COPY ./package.json /app/

    其实是把上下文中的package.json复制到了/app/里。不是当前目录,也不是Dockerfile所在的目录。

     

       一般来说,应该会将  Dockerfile  置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用  .gitignore  一样的语法写一个  .dockerignore  ,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。

    同时:在默认情况下,如果不额外指定  Dockerfile  的话,会将上下文目录下的名为Dockerfile  的文件作为 Dockerfile

     

    Docker build还有其他姿势:直接简单看下下面就好。

    (1)docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1

    (2)docker build http://server/context.tar.gz

    (3)docker build - < Dockerfile 或者 cat Dockerfile | docker build -

    (4)docker build - < context.tar.gz

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    java_类承继其他类的内部类例子
    java_接口和抽象类的区别
    java_数组作缓存池的不可变类实例
    C++_归并排序(纯C版)
    C++_归并排序
    C++_快速排序(纯C版本)
    C++_快速排序
    C++_直接插入排序(纯C版)
    C++_直接插入排序
    自定义比较器的用法
  • 原文地址:https://www.cnblogs.com/csnd/p/12061844.html
Copyright © 2011-2022 走看看