• 阿里云部署Docker(9)----Dockerfile脚本定制镜像


    本文为原创文章。转载需注明转自:http://blog.csdn.net/minimicall?

    viewmode=contents

    技术爱好者都是比較懒的。而docker又是开发人员支持起来的。所以。它肯定是有比較懒的方式供我们定制自己须要的东西。

    docker build

    docker 用build指令来运行dockerfile脚本。

    详细的使用方法:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. sudo docker build .  
    小心后面那个点,表示当前文件夹。当前文件夹有一个Dockerfile的文件。

    当然,你能够指定你建立的镜像的名字。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. sudo docker build -t shykes/myapp .  

    然后你就能够看到运行过程。也许,会很的漫长,取决于要下的东西的大小和你的网速。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. sudo docker build -t SvenDowideit/ambassador .  
    2. Uploading context 10.24 kB  
    3. Uploading context  
    4. Step 1 : FROM docker-ut  
    5.  ---> cbba202fe96b  
    6. Step 2 : MAINTAINER SvenDowideit@home.org.au  
    7.  ---> Using cache  
    8.  ---> 51182097be13  
    9. Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_([0-9]*)_TCP=tcp://(.*):(.*)/socat TCP4-LISTEN:1,fork,reuseaddr TCP4:2:3 &/'  | sh && top  
    10.  ---> Using cache  
    11.  ---> 1a5ffc17324d  
    12. Successfully built 1a5ffc17324d  
    当你下完之后,你能够用:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. docker images  

    你会发现多了你下载的镜像。

    好接下来我们讲讲Dockerfile本身怎样编写。

    格式:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. # Comment  
    2. INSTRUCTION arguments  
    命令是大写的。

    FROM

    全部的镜像都应该是基于某一个现有的镜像。

    所以。就有了FROM 指令

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. FROM <image>  
    或者,更加详细点说明它的Tag。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. FROM <Image>:<TAG>  

    FROM语句必须是第一句“非凝视”语句,在Dockerfile中。

    我们总是会想在一个脚本里面加入些凝视,来说明一些想说的话。


    凝视

    那就是凝视:#开头的行。

    可是#在行中,则却表示是一个參数。

    维护

    接下来。须要说明维护人。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. MAINTAINER <name>  
    填上你的NICK NAME。

    表示你做的。

    RUN指令

    RUN指令应该是用的最多的指令。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. RUN <command> (the command is run in a shell - /bin/sh -c - shell form)  

    还有一种方式是:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. RUN ["executable""param1""param2"] (exec form)  

    RUN语句会在当前镜像的基础上运行该条指令,同一时候运行完就成了一个新的镜像一样,即数据和影响都是会保存的。然后用这个新的镜像去运行下一条指令。这样上一条的结果镜像是下一条指令的基础,如此不断推进。

    CMD指令

    格式:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. CMD ["executable","param1","param2"] (exec form, this is the preferred form)  
    2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)  
    3. CMD command param1 param2 (shell form)  

    有三种形式。

    CMD在DOckerfile里面仅仅能用一次,假设你写了非常多条,那么仅仅有最后一条是有效的。


    CMD有什么用呢,能够理解为Main函数一样吧。作为一个入口。详细见英文

    The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.

    EXPOSE

    这个单词的中文叫什么,暴露。对,他就是暴露镜像的某个接口出来。

    比如,我的镜像是用来做http服务的,那么我就理应暴露我镜像的80port。

    然后-p 主机port:80 。还记得吧。

    port映射。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. EXPOSE <port> [<port>...]  

    ENV

    环境变量的设置

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. ENV <key> <value>  

    环境变量一旦设定,对整个Dockerfile都是有效的。

    当然,key = value这样直接说,事实上效果是一样的。

    ADD指令

    有点像拷贝指令,至少它就是完毕文件的拷贝工作的。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. ADD <src> <dst>  

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. ADD hom* /mydir/        # adds all files starting with "hom"  
    2. ADD hom?.txt /mydir/    # ? is replaced with any single character  

    COPY指令

    和ADD一样。是拷贝


    ENTRYPOINT

    入口点

    真正的MAIN函数

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. ENTRYPOINT ["executable""param1""param2"] (exec form, the preferred form)  
    2. ENTRYPOINT command param1 param2 (shell form)  
    CMD和这个指令的差别。是应用的场景不一样。

    这里。我给大家贴原文会比較好。

    An ENTRYPOINT helps you to configure a container that you can run as an executable. That is, when you specify an ENTRYPOINT, then the whole container runs as if it was just that executable.


    Unlike the behavior of the CMD instruction, The ENTRYPOINT instruction adds an entry command that will not be overwritten when arguments are passed to docker run. This allows arguments to be passed to the entry point, i.e. docker run <image> -d will pass the -d argument to the entry point.


    You can specify parameters either in the ENTRYPOINT JSON array (as in "like an exec" above), or by using a CMD instruction. Parameters in the ENTRYPOINT instruction will not be overridden by the docker run arguments, but parameters specified via a CMD instruction will be overridden by docker run arguments.


    Like a CMD, you can specify a plain string for the ENTRYPOINT and it will execute in /bin/sh -c:


    FROM ubuntu
    ENTRYPOINT ls -l
    For example, that Dockerfile's image will always take a directory as an input and return a directory listing. If you wanted to make this optional but default, you could use a CMD instruction:


    FROM ubuntu
    CMD ["-l"]
    ENTRYPOINT ["ls"]

    WORKDIR 工作文件夹

    RUN ENTERPOINT带的指令在哪里运行的设置。


    此外,另一些指令,比如

    USER 。ONBUILD。等就不想说了。

    最后给出一个演示样例

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. # Nginx  
    2. #  
    3. # VERSION               0.0.1  
    4.   
    5. FROM      ubuntu  
    6. MAINTAINER Victor Vieux <victor@docker.com>  
    7.   
    8. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server  
    9.   
    10. # Firefox over VNC  
    11. #  
    12. # VERSION               0.3  
    13.   
    14. FROM ubuntu  
    15.   
    16. # Install vnc, xvfb in order to create a 'fake' display and firefox  
    17. RUN apt-get update && apt-get install -y x11vnc xvfb firefox  
    18. RUN mkdir /.vnc  
    19. # Setup a password  
    20. RUN x11vnc -storepasswd 1234 ~/.vnc/passwd  
    21. # Autostart firefox (might not be the best way, but it does the trick)  
    22. RUN bash -c 'echo "firefox" >> /.bashrc'  
    23.   
    24. EXPOSE 5900  
    25. CMD    ["x11vnc""-forever""-usepw""-create"]  
    26.   
    27. # Multiple images example  
    28. #  
    29. # VERSION               0.1  
    30.   
    31. FROM ubuntu  
    32. RUN echo foo > bar  
    33. # Will output something like ===> 907ad6c2736f  
    34.   
    35. FROM ubuntu  
    36. RUN echo moo > oink  
    37. # Will output something like ===> 695d7793cbe4  
    38.   
    39. # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with  
    40. # /oink.  





  • 相关阅读:
    深入理解JavaScript系列(24):JavaScript与DOM(下)
    大叔手记(20):ASP.NET MVC中使用jQuery时的浏览器缓存问题
    深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP
    深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
    深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
    深入理解JavaScript系列(25):设计模式之单例模式
    深入理解JavaScript系列(26):设计模式之构造函数模式
    ASP.NET GridView中使用搜索框(SearchableGridView)
    WPF中的图表设计器 – 1
    使用URL Routing进行数据分页
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6971713.html
Copyright © 2020-2023  润新知