精华内容
下载资源
问答
  • dockfile

    2019-09-01 15:17:53
    dockfile怎么学 如果你想要从一个基础镜像开始建立一个自定义镜像,可以选择一步一步进行构建,也可以选择写一个配置文件,然后一条命令(docker build)完成构建,显然配置文件的方式可以更好地应对需求的变更,这...

    dockfile怎么学

    如果你想要从一个基础镜像开始建立一个自定义镜像,可以选择一步一步进行构建,也可以选择写一个配置文件,然后一条命令(docker build)完成构建,显然配置文件的方式可以更好地应对需求的变更,这个配置文件就是Dockerfile。
    学习Dockerfile的最好方式就是阅读别人写的Dockerfile,遇到不会的指令就查一查Dockerfile的文档,文档地址如下:
    https://docs.docker.com/engine/reference/builder/
    大家遇到不知道的指令多去里面翻一翻,下面我带着大家读几个开源Dockerfile,在读的过程中学习相关知识。
    ————————————————
    版权声明:本文为CSDN博主「燃烧杯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_33256688/article/details/80319673
    Docker 镜像、容器和 Dockerfile 三者之间的关系
    在这里插入图片描述

    docker所有命令解释

    FROM

    功能为指定基础镜像,并且必须是第一条指令。

    如果不以任何镜像为基础,那么写法为:FROM scratch

    同时意味着接下来所写的指令将作为镜像的第一层开始。

    语法:

    FROM <image>
    FROM <image>:<tag>
    FROM <image>:<digest> 
    

    三种写法,其中<tag><digest> 是可选项,如果没有选择,那么默认值为latest

    RUN

    功能为运行指定的命令

    RUN命令有两种格式

    1. RUN <command>
    2. RUN ["executable", "param1", "param2"]
    

    第一种后边直接跟shell命令

    在linux操作系统上默认 /bin/sh -c
    
    在windows操作系统上默认 cmd /S /C
    

    第二种是类似于函数调用。

    可将executable理解成为可执行文件,后面就是两个参数。

    两种写法比对:

    RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
    
    RUN ["/bin/bash", "-c", "echo hello"]
    

    注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.

    多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

    RUN书写时的换行符是\

    CMD

    功能为容器启动时要运行的命令

    语法有三种写法

    1. CMD ["executable","param1","param2"]
    2. CMD ["param1","param2"]
    3. CMD command param1 param2
    

    第三种比较好理解了,就时shell这种执行方式和写法

    第一种和第二种其实都是可执行文件加上参数的形式

    举例说明两种写法:

    CMD [ "sh", "-c", "echo $HOME" 
    
    CMD [ "echo", "$HOME" ]
    

    补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

    原因是参数传递后,docker解析的是一个JSON array

    RUN & CMD

    不要把RUN和CMD搞混了。

    RUN是构件容器时就运行的命令以及提交运行结果

    CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

    LABEL

    功能是为镜像指定标签

    语法:

    LABEL <key>=<value> <key>=<value> <key>=<value> ...
    

    一个Dockerfile种可以有多个LABEL,如下:

    LABEL "com.example.vendor"="ACME Incorporated"
    LABEL com.example.label-with-value="foo"
    LABEL version="1.0"
    LABEL description="This text illustrates \
    that label-values can span multiple lines."
    

    但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号

    如下:

    LABEL multi.label1="value1" \
    multi.label2="value2" \
    other="value3"
    

    说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

    MAINTAINER

    指定作者

    语法:

    MAINTAINER <name>
    

    EXPOSE

    功能为暴漏容器运行时的监听端口给外部

    但是EXPOSE并不会使容器访问主机的端口

    如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数

    ENV

    功能为设置环境变量

    语法有两种

    1. ENV <key> <value>
    2. ENV <key>=<value> ...
    

    两者的区别就是第一种是一次设置一个,第二种是一次设置多个

    ADD

    一个复制命令,把文件复制到景象中。

    如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。

    语法如下:

    1. ADD <src>... <dest>
    2. ADD ["<src>",... "<dest>"]
    

    <dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径。
    <src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
    如果把<src>写成一个url,那么ADD就类似于wget命令

    如以下写法都是可以的:

    ADD test relativeDir/ 
    ADD test /relativeDir
    ADD http://example.com/foobar /
    

    尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据

    COPY

    看这个名字就知道,又是一个复制命令

    语法如下:

    1. COPY <src>... <dest>
    2. COPY ["<src>",... "<dest>"]
    

    与ADD的区别

    COPY的<src>只能是本地文件,其他用法一致

    ENTRYPOINT

    功能是启动时的默认命令

    语法如下:

    1. ENTRYPOINT ["executable", "param1", "param2"]
    2. ENTRYPOINT command param1 param2
    

    如果从上到下看到这里的话,那么你应该对这两种语法很熟悉啦。

    第二种就是写shell

    第一种就是可执行文件加参数

    与CMD比较说明(这俩命令太像了,而且还可以配合使用):

    1. 相同点:

      只能写一条,如果写了多条,那么只有最后一条生效

      容器启动时才运行,运行时机相同

    2. 不同点:

      ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖

      如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

    如下:

    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    

    如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

    如下:

    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ls -al
    

    那么将执行ls -al ,top -b不会执行。

    Docker官方使用一张表格来展示了ENTRYPOINT 和CMD不同组合的执行情况

    VOLUME

    可实现挂载功能,可以将内地文件夹或者其他容器种得文件夹挂在到这个容器种

    语法为:

    VOLUME ["/data"]
    

    说明:

    ["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的

    VOLUME ["/var/log/"]
    
    VOLUME /var/log
    
    VOLUME /var/log /var/db
    

    一般的使用场景为需要持久化存储数据时

    容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。

    所以当数据需要持久化时用这个命令。

    USER

    设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的

    USER daemo
    USER UID
    

    注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行

    WORKDIR

    语法:

    WORKDIR /path/to/workdir
    

    设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。如:

    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    

    pwd执行的结果是/a/b/c

    WORKDIR也可以解析环境变量

    如:

    ENV DIRPATH /path
    WORKDIR $DIRPATH/$DIRNAME
    RUN pwd
    

    pwd的执行结果是/path/$DIRNAME

    ARG

    语法:

    ARG <name>[=<default value>]
    

    设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数

    如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning

    提示如下:

    [Warning] One or more build-args [foo] were not consumed.
    

    我们可以定义一个或多个参数,如下:

    FROM busybox
    ARG user1
    ARG buildno
    ...
    

    也可以给参数一个默认值:

    FROM busybox
    ARG user1=someuser
    ARG buildno=1
    ...
    

    如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值

    ONBUILD

    语法:

    ONBUILD [INSTRUCTION]
    

    这个命令只对当前镜像的子镜像生效。

    比如当前镜像为A,在Dockerfile种添加:

    ONBUILD RUN ls -al
    

    这个 ls -al 命令不会在A镜像构建或启动的时候执行

    此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。

    STOPSIGNAL

    语法:

    STOPSIGNAL signal
    

    STOPSIGNAL命令是的作用是当容器推出时给系统发送什么样的指令

    HEALTHCHECK

    容器健康状况检查命令

    语法有两种:

    1. HEALTHCHECK [OPTIONS] CMD command
    2. HEALTHCHECK NONE
    

    第一个的功能是在容器内部运行一个命令来检查容器的健康状况

    第二个的功能是在基础镜像中取消健康检查命令

    [OPTIONS]的选项支持以下三中选项:

    --interval=DURATION 两次检查默认的时间间隔为30秒
    --timeout=DURATION 健康检查命令运行超时时长,默认30秒
    --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
    

    注意:

    HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。

    CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:

    0: success - 表示容器是健康的
    1: unhealthy - 表示容器已经不能工作了
    2: reserved - 保留值
    

    例子:

    HEALTHCHECK --interval=5m --timeout=3s \
    CMD curl -f http://localhost/ || exit 1
    

    健康检查命令是:curl -f http://localhost/ || exit 1

    两次检查的间隔时间是5秒

    命令超时时间为3秒

    docker应用例子

    先查看下本地的镜像,选一个作为base image:

    [root@docker ~]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    wadeson/centos_nginx   v1                  210a202d37b8        2 hours ago         464MB
    nginx                  latest              c59f17fe53b0        4 days ago          108MB
    ubuntu                 latest              747cb2d60bbe        3 weeks ago         122MB
    centos                 latest              196e0ce0c9fb        6 weeks ago         197MB
    

    在某一个目录下面创建一个专门存放此demo的目录,也就是Dockerfile所在的context:

    [root@docker ~]# mkdir docker_demo
    [root@docker ~]# cd docker_demo/
    [root@docker docker_demo]# touch Dockerfile
    [root@docker docker_demo]# pwd
    /root/docker_demo
    [root@docker docker_demo]# ll
    total 0
    -rw-r--r--. 1 root root 0 Nov  1 04:34 Dockerfile
    

    接下来就开始编写Dockerfile文件了(注意Dockerfile的D需要大写)

    这里以编译nginx提供web服务来构建新的镜像

    1、下载nginx源码包到docker_demo这个目录下:

    [root@docker docker_demo]# ll
    total 960
    -rw-r--r--. 1 root root      0 Nov  1 04:34 Dockerfile
    -rw-r--r--. 1 root root 981687 Oct 17 09:20 nginx-1.10.2.tar.gz
    

    2、以下是编写好的Dockerfile v1版:

    [root@docker docker_demo]# cat Dockerfile

    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.10.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.10.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.10.2
    WORKDIR /usr/local/src/nginx-1.10.2
    
    # execute command to compile 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
    
    EXPOSE 80
    

    3、查看docker_demo目录情况:

    [root@docker docker_demo]# ll
    total 964
    -rw-r--r--. 1 root root   1112 Nov  1 04:58 Dockerfile
    -rw-r--r--. 1 root root 981687 Oct 17 09:20 nginx-1.10.2.tar.gz
    

    4、执行docker build进行构建:

    docker build -t centos_nginx:v1 .
    

    后面的.代表的是相对路径的当前目录,如果需要全路径则为/root/docker_demo(就是找到Dockerfile文件)。
    –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

    构建成功后,查看新构建的镜像:
    复制代码

    [root@docker docker_demo]# docker images         
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v1                  78d18f16e757        4 hours ago         464MB
    wadeson/centos_nginx   v1                  210a202d37b8        7 hours ago         464MB
    nginx                  latest              c59f17fe53b0        4 days ago          108MB
    ubuntu                 latest              747cb2d60bbe        3 weeks ago         122MB
    centos                 latest              196e0ce0c9fb        6 weeks ago         197MB
    

    5、然后使用构建的镜像启动一个container并开启nginx服务:

    [root@docker docker_demo]# docker run -d --name nginx1.10 -p 82:80 ngingx1.10.centos:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
    ea5af922378356a5ebff60992f000b186b09d1e8d6a4915b0b8ccf997ca12404
    

    然后查看启动的container是否在运行:docker ps -a

    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                NAMES
    f38bc42cdbaf        ngingx1.10.centos:v1     "/usr/local/nginx/..."   5 seconds ago       Up 5 seconds              0.0.0.0:82->80/tcp   nginx1.10
    

    于是进行访问:

    于是基于Dockerfile的一个简单实例构建完成,现在基于这个Dockerfile文件依次添加其他的指令进行构建

    添加ENV环境变量指令:

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    

    然后进行构建:

    [root@docker docker_demo]# docker build -t centos_nginx:v2 .
    Sending build context to Docker daemon  985.6kB
    Step 1/10 : FROM centos
     ---> 196e0ce0c9fb
    Step 2/10 : MAINTAINER json_hc@163.com
     ---> Using cache
     ---> cde1d7830106
    Step 3/10 : ADD nginx-1.12.2.tar.gz /usr/local/src
     ---> Using cache
     ---> 1e4d16340af0
    Step 4/10 : RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
     ---> Using cache
     ---> 405835ad9b0b
    Step 5/10 : RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
     ---> Using cache
     ---> 4002738cf7a6
    Step 6/10 : RUN useradd -M -s /sbin/nologin nginx
     ---> Using cache
     ---> 02961c5c564d
    Step 7/10 : WORKDIR /usr/local/src/nginx-1.12.2
     ---> Using cache
     ---> f1da71a93c5e
    Step 8/10 : 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
     ---> Using cache
     ---> cd2ad4c45004
    Step 9/10 : ENV PATH /usr/local/nginx/sbin:$PATH
     ---> Running in 07ba2f7129bc
     ---> 9588fa1058aa
    Removing intermediate container 07ba2f7129bc
    Step 10/10 : EXPOSE 80
     ---> Running in 473cd847154a
     ---> 2031faf8894a
    Removing intermediate container 473cd847154a
    Successfully built 2031faf8894a
    Successfully tagged centos_nginx:v2
    

    由于在构建的过程中docker会采用缓存的机制,上面的构建过程中包含很多using cache,所以这次构建非常快,如果需要重新构建,不想使用cache需要添加–no-cache

    --no-cache                   Do not use cache when building the image
    

    查看v2版本的镜像:

    [root@docker docker_demo]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v2                  2031faf8894a        2 minutes ago       464MB
    

    使用v2版本的镜像启动一个container:

    [root@docker docker_demo]# docker run -d -p 83:80 centos_nginx:v2 nginx -g "daemon off;"
    或者
    docker run -itd --name nginx-v2 -p 83:80 centos_nginx:v2 
    da48b465b1b1a14824497d724eee52b8408270b3b5223c5dd7094b7c0cef211d
    

    查看container运行状态:

    [root@docker docker_demo]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    da48b465b1b1        centos_nginx:v2     "nginx -g 'daemon ..."   23 seconds ago      Up 22 seconds       0.0.0.0:81->80/tcp   determined_neumann
    

    进行访问:

    上述启动容器的过程中使用的命令docker run -d -p81:80 centos_nginx:v2 nginx -g "daemon off;"为什么这里使用的nginx而不是

    /usr/local/nginx/sbin/nginx,因为在Dockerfile文化中执行了PATH=/usr/local/nginx/sbin:$PATH,添加到了环境变量

    添加指令CMD:

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    
    CMD /bin/sh -c 'nginx -g "daemon off;"'
    

    然后进行构建:

    [root@docker docker_demo]# docker build -t centos_nginx:v3 .
    

    查看v3版本的镜像:

    [root@docker docker_demo]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v3                  0e49a2c0562f        11 seconds ago      464MB
    

    然后基于v3版本的镜像启动一个container:

    [root@docker docker_demo]# docker run -d --name nginx-3 -p 84:80 centos_nginx:v3 
    d988c04d04f49b909f28e7b664be3959a0d51b951f1c1b04fcf5c716552b7c41
    

    查看启动的容器状态:

    [root@docker docker_demo]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    d988c04d04f4        centos_nginx:v3     "/bin/sh -c '/bin/..."   6 seconds ago       Up 5 seconds        0.0.0.0:82->80/tcp   optimistic_saha
    

    最后进行访问:

    新增加的CMD /bin/sh -c 'nginx -g “daemon off;”'表示

    当启动一个container时默认运行的命令,如果在启动container时赋予了command,那么

    定义的CMD中的命令将不会被执行,而会去执行command的命令

    添加entrypoint指令:

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    
    ENTRYPOINT ["nginx"]
    
    CMD ["-g","daemon off;"]
    

    当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g “daemon off;”

    而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)

    开始进行构建v4版本:

    [root@docker docker_demo]# docker build -t centos_nginx:v4 .
    

    查看新建的镜像:

    [root@docker docker_demo]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v4                  6c5128aaff05        4 minutes ago       464MB
    

    为v4版本的镜像启动一个container:

    [root@docker docker_demo]# docker run -d --name nginx-4 -p 85:80 centos_nginx:v4 
    6933c78255f3cebe44d4d5d080caf8a2fde45ded2f9b333ec01cdfe98cd5f417
    

    然后查看容器状态:

    [root@docker docker_demo]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    6933c78255f3        centos_nginx:v4     "nginx -g 'daemon ..."   6 seconds ago       Up 5 seconds        0.0.0.0:83->80/tcp   zealous_euclid
    

    最后进行访问:

    这里增加一个案例,如果Dockerfile修改成下面:

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    
    ENTRYPOINT ["nginx"]
    
    CMD ["-g","daemon on;"]
    

    CMD的命令修改为了后台,我们知道如果容器内的进程在后台运行那么容器将不会运行,现在以此构建v5版本镜像:

    [root@docker docker_demo]# docker build -t centos_nginx:v5 .
    

    查看v5版本的新镜像:

    [root@docker docker_demo]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v5                  5c1131306686        29 seconds ago      464MB
    

    现在利用v5版本镜像启动一个container,但是在启动的时候添加后面的command:

    [root@docker docker_demo]# docker run -d --name nginx-5 -p 86:80 centos_nginx:v5 -g "daemon off;"
    5e11edbbd2a0e184f1766c435c0d9b01ef5d74b57e2e2c3a1efed0cf2a2e037b
    

    可以看见在后面新增了-g “daemon off;”,前面说过如果增加了命令那么Dockerfile中的CMD中的命令将不会生效

    查看容器运行状态:

    [root@docker docker_demo]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    5e11edbbd2a0        centos_nginx:v5     "nginx -g 'daemon ..."   3 seconds ago       Up 3 seconds        0.0.0.0:85->80/tcp   nifty_bartik
    

    可以看见容器的运行丝毫没有问题,于是nginx的服务依然还是在前台运行,没有被CMD影响,而新增加的command(-g “daemon off;”)

    将作为ENTRYPOINT的新的参数以此为准,于是进行访问端口85

    添加VOLUME指令:

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # mount a dir to container
    VOLUME ["/data"]
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    
    # setup PATH
    ENV PATH /usr/local/nginx/sbin:$PATH
    
    # EXPOSE
    EXPOSE 80
    
    # the command of entrypoint
    ENTRYPOINT ["nginx"]
    
    CMD ["-g"]
    

    开始进行构建:

    [root@docker docker_demo]# docker build -t centos_nginx:v6 .
    

    查看v6版本的镜像:

    [root@docker ~]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    centos_nginx           v6                  959fdf4d4288        35 seconds ago      464MB
    

    利用该镜像启动一个container:

    [root@docker ~]# docker run -d -p 88:80 --name=nginx-8 centos_nginx:v8 -g "daemon off;"
    6c15a9e93fb1421bdb7eddaabe439996e97415e85a003f80c1d8b4b2c5ee3ffa
    

    查看启动的容器状态:

    [root@docker ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    6c15a9e93fb1        centos_nginx:v6     "nginx -g 'daemon ..."   4 seconds ago       Up 4 seconds        0.0.0.0:86->80/tcp   nginx6
    

    利用docker exec进入到container中,查看是否存在卷/data:

    docker exec -it nginx-6 /bin/bash
    [root@6c15a9e93fb1 /]#cd /; ll
    total 16
    -rw-r--r--.   8 root root 15836 Sep 11 15:53 anaconda-post.log
    lrwxrwxrwx.   1 root root     7 Sep 11 15:51 bin -> usr/bin
    drwxr-xr-x.   2 root root     6 Nov  2 01:42 data
    

    这个/data挂载的目录对应本机host的这个目录:

      docker inspect -f "{{.Mounts}}"  e3372ec66b2e
    [{volume 7ba7742353aebf6eeb63e60046c01ed491e10b7198f7505a5f1f28e47f7f5787 /var/lib/docker/volumes/7ba7742353aebf6eeb63e60046c01ed491e10b7198f7505a5f1f28e47f7f5787/_data /data local  true }]
    [root@t1 e3372ec66b2ec15454c4616a8bfaa90f2760f63e35cf6c233a094fa838f4034b]# cd /var/lib/docker/volumes/7ba7742353aebf6eeb63e60046c01ed491e10b7198f7505a5f1f28e47f7f5787/_data
    [root@t1 _data]# pwd
    /var/lib/docker/volumes/7ba7742353aebf6eeb63e60046c01ed491e10b7198f7505a5f1f28e47f7f5787/_data
    
      现在在本机host上的这个目录创建一个文件:
           [root@t1 _data]# touch aaa
           [root@t1 _data]# 
    

    然后切换到container中查看是否存在这个文件:

    [root@6c15a9e93fb1 /]# ll /data/
    total 0
    -rw-r--r--. 1 root root 0 Nov  2 01:45 aaa
    

    添加ONBUILD指令:

    ●ONBUILD 添加一个将来执行的触发器(trigger)
    格式:ONBUILD <其它指令>

    ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如RUN, COPY等,
    而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行,nginx-v7的内容

    [root@docker docker_demo]# cat Dockerfile 
    # base image
    FROM centos
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # mount a dir to container
    ONBUILD VOLUME ["/data2"]
    
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    
    # execute command to compile 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
    
    # setup PATH
    ENV PATH /usr/local/nginx/sbin:$PATH
    
    # EXPOSE
    EXPOSE 80
    
    # the command of entrypoint
    ENTRYPOINT ["nginx"]
    
    CMD ["-g"]
    

    使用上面Dockerfile构建镜像版本v7:

    [root@docker docker_demo]# docker run -d -p 87:80 --name=nginx7 centos_nginx:v7 -g "daemon off;"   
    48f1fe5c71aefc0f9513e8085af8f5b7cdf14fa986fb3b11f2050f18ceefd26e
    

    现在进入到容器内查看是否存在/data2,是不存在的:

    [root@docker ~]# docker exec -it nginx7 /bin/bash
    [root@48f1fe5c71ae nginx-1.12.2]# ll /data
    ls: cannot access /data: No such file or directory
    

    现在修改上面Dockerfile的FROM基于的base image:

    [root@docker docker_demo]# cat Dockerfile
    # base image
    FROM centos_nginx:v7
    
    # MAINTAINER
    MAINTAINER json_hc@163.com
    
    利用此Dockerfile构建镜像v8:
    
    [root@docker docker_demo]# docker build -t centos_nginx:v8 .
    Sending build context to Docker daemon  986.6kB
    Step 1/2 : FROM centos_nginx:v7
    # Executing 1 build trigger...
    Step 1/1 : VOLUME /data
     ---> Running in a6187867513d
     ---> 5ac07930be4c
    Removing intermediate container a6187867513d
    Step 2/2 : MAINTAINER json_hc@163.com
     ---> Running in e02dbf8219cf
     ---> 6f792dc07c35
    Removing intermediate container e02dbf8219cf
    Successfully built 6f792dc07c35
    Successfully tagged centos_nginx:v8
    

    可以看见卷/data已经执行了操作,现在启动一个container:

    [root@docker docker_demo]# docker run -d -p 88:80 --name=nginx8 centos_nginx:v8 -g "daemon off;"   
    6c2a847c5f6b59b02f91afecadbfc15c88d1217a477c0421a424bce6e5eb317a
    

    查看容器状态,并进入到容器验证/data目录:

    [root@docker docker_demo]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    6c2a847c5f6b        centos_nginx:v8     "nginx -g 'daemon ..."   37 seconds ago      Up 37 seconds       0.0.0.0:88->80/tcp   nginx8
    [root@docker docker_demo]# docker exec -it nginx8 /bin/bash
    [root@6c2a847c5f6b nginx-1.12.2]# ll /data2/
    total 0
    

    由此可见镜像v8包含了v7 的所有内容,并且增加了ONBUILD的data2目录内容。

    展开全文
  • Dockfile

    千次阅读 2016-05-31 17:22:45
    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker...

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。


    1. Dockerfile的书写规则及指令使用方法


    Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
    Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。


    (1)FROM(指定基础image)

    构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
    该指令有两种格式:
    [plain] view plaincopy
    1. FROM <image>  
    指定基础image为该image的最后修改的版本。或者:
    [plain] view plaincopy
    1. FROM <image>:<tag>  
    指定基础image为该image的一个tag版本。


    (2)MAINTAINER(用来指定镜像创建者信息)

    构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
    格式:
    [plain] view plaincopy
    1. MAINTAINER <name>  


    (3)RUN(安装软件用)

    构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
    该指令有两种格式:
    [plain] view plaincopy
    1. RUN <command> (the command is run in a shell - `/bin/sh -c`)  
    2. RUN ["executable", "param1", "param2" ... ]  (exec form)  


    (4)CMD(设置container启动时执行的操作)

    设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
    该指令有三种格式:
    [plain] view plaincopy
    1. CMD ["executable","param1","param2"] (like an exec, this is the preferred form)  
    2. CMD command param1 param2 (as a shell)  
    当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:
    [plain] view plaincopy
    1. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)  
    ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1和param2作为参数执行。所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT。


    (5)ENTRYPOINT(设置container启动时执行的操作)

    设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
    两种格式:
    [plain] view plaincopy
    1. ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)  
    2. ENTRYPOINT command param1 param2 (as a shell)  
    该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。
    当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
    [plain] view plaincopy
    1. # CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
    2. CMD echo “Hello, World!”  
    3. ENTRYPOINT ls -l  
    另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。
    [plain] view plaincopy
    1. FROM ubuntu  
    2. CMD ["-l"]  
    3. ENTRYPOINT ["/usr/bin/ls"]  


    (6)USER(设置container容器的用户)

    设置指令,设置启动容器的用户,默认是root用户。
    [plain] view plaincopy
    1. # 指定memcached的运行用户  
    2. ENTRYPOINT ["memcached"]  
    3. USER daemon  
    4. 或  
    5. ENTRYPOINT ["memcached", "-u", "daemon"]  


    (7)EXPOSE(指定容器需要映射到宿主机器的端口)

    设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
    格式:
    [plain] view plaincopy
    1. EXPOSE <port> [<port>...]  

    [plain] view plaincopy
    1. # 映射一个端口  
    2. EXPOSE port1  
    3. # 相应的运行容器使用的命令  
    4. docker run -p port1 image  
    5.   
    6. # 映射多个端口  
    7. EXPOSE port1 port2 port3  
    8. # 相应的运行容器使用的命令  
    9. docker run -p port1 -p port2 -p port3 image  
    10. # 还可以指定需要映射到宿主机器上的某个端口号  
    11. docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  
    端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。


    (8)ENV(用于设置环境变量)

    构建指令,在image中设置一个环境变量。
    格式:
    [plain] view plaincopy
    1. ENV <key> <value>  

    设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
    假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
    ENV JAVA_HOME /path/to/java/dirent


    (9)ADD(从src复制文件到container的dest路径)

    构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。
    格式:
    [plain] view plaincopy
    1. ADD <src> <dest>  

    <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
    <dest> 是container中的绝对路径


    (10)VOLUME(指定挂载点))

    设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
    格式:
    [plain] view plaincopy
    1. VOLUME ["<mountpoint>"]  

    [plain] view plaincopy
    1. FROM base  
    2. VOLUME ["/tmp/data"]  
    运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动一个容器:
    [plain] view plaincopy
    1. docker run -t -i -rm -volumes-from container1 image2 bash  
    container1为第一个容器的ID,image2为第二个容器运行image的名字。


    (11)WORKDIR(切换目录)

    设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
    格式:
    [plain] view plaincopy
    1. WORKDIR /path/to/workdir  

    [plain] view plaincopy
    1. # 在 /p1/p2 下执行 vim a.txt  
    2. WORKDIR /p1 WORKDIR p2 RUN vim a.txt  


    (12)ONBUILD(在子镜像中执行)

    [plain] view plaincopy
    1. ONBUILD <Dockerfile关键字>  
    ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
    详细资料可参考https://www.dockboard.org/docker-quicktip-3-onbuild


    2. 创建Dockerfile,构建jdk+tomcat环境


    Dockerfile文件

    [html] view plaincopy
    1. # Pull base image  
    2. FROM ubuntu:13.10  
    3.   
    4. MAINTAINER zing wang "zing.jian.wang@gmail.com"  
    5.   
    6. # update source  
    7. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list  
    8. RUN apt-get update  
    9.   
    10. # Install curl  
    11. RUN apt-get -y install curl  
    12.   
    13. # Install JDK 7  
    14. RUN cd /tmp &&  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz  
    15. RUN mkdir -p /usr/lib/jvm  
    16. RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/  
    17.   
    18. # Set Oracle JDK 7 as default Java  
    19. RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300     
    20. RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300     
    21.   
    22. ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/  
    23.   
    24. # Install tomcat7  
    25. RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz  
    26. RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/  
    27.   
    28. ENV CATALINA_HOME /opt/tomcat7  
    29. ENV PATH $PATH:$CATALINA_HOME/bin  
    30.   
    31. ADD tomcat7.sh /etc/init.d/tomcat7  
    32. RUN chmod 755 /etc/init.d/tomcat7  
    33.   
    34. # Expose ports.  
    35. EXPOSE 8080  
    36.   
    37. # Define default command.  
    38. ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out  

    tomcat7.sh

    [plain] view plaincopy
    1. export JAVA_HOME=/usr/lib/jvm/java-7-oracle/  
    2. export TOMCAT_HOME=/opt/tomcat7  
    3.   
    4. case $1 in  
    5. start)  
    6.   sh $TOMCAT_HOME/bin/startup.sh  
    7. ;;  
    8. stop)  
    9.   sh $TOMCAT_HOME/bin/shutdown.sh  
    10. ;;  
    11. restart)  
    12.   sh $TOMCAT_HOME/bin/shutdown.sh  
    13.   sh $TOMCAT_HOME/bin/startup.sh  
    14. ;;  
    15. esac  
    16. exit 0  

    我已经把这些文件上传到了Github https://github.com/agileshell/dockerfile-jdk-tomcat.git


    3. 构建镜像

    脚本写好了,需要转换成镜像:

    [plain] view plaincopy
    1. docker build -t zingdocker/jdk-tomcat .  
    2. docker run -d -p 8090:8080 zingdocker/jdk-tomcat  


    默认情况下,tomcat会占用8080端口,刚才在启动container的时候,指定了 -p 8090:8080,映射到宿主机端口就是8090。

    http://<host>:8090 host为主机IP

    展开全文
  • dockFile

    2019-03-28 15:44:59
    在这部分中,我们讲一步一步创建一个Dockfile,这个Dockerfile可用于构建MongoDB镜像进而构建MongoDB容器。 创建一个Dockerfile 使用nano文本编辑器,让我们创建Dockerfile。 sudo nano Dockerfile 定义...

    转载:https://www.cnblogs.com/boshen-hzb/p/6400272.html

    Docker简介

    Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全的,基于轻量级容器的环境,来实现这个目标。这些容器由镜像创建,而镜像可以通过命令行手工创建或 者通过Dockerfile自动创建。

    Dockerfile

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

    Dockerfile 语法

    在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。

    什么是语法?

    非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。

    Dockerfile 语法示例

    Dockerfile语法由两部分构成,注释和命令+参数

    1. # Line blocks used for commenting
    2. command argument argument ..

    一个简单的例子:

    1. # Print "Hello docker!"
    2. RUN echo "Hello docker!"

    Dockerfile 命令

    Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

    ADD

    ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

    1. # Usage: ADD [source directory or URL] [destination directory]
    2. ADD /my_app_folder /my_app_folder 

    CMD

    和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

    1. # Usage 1: CMD application "argument", "argument", ..
    2. CMD "echo" "Hello docker!"

    ENTRYPOINT

    配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

    ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

    1. # Usage: ENTRYPOINT application "argument", "argument", ..
    2. # Remember: arguments are optional. They can be provided by CMD
    3. # or during the creation of a container.
    4. ENTRYPOINT echo
    5. # Usage example with CMD:
    6. # Arguments set with CMD can be overridden during *run*
    7. CMD "Hello docker!"
    8. ENTRYPOINT echo

    ENV 

    ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

    1. # Usage: ENV key value
    2. ENV SERVER_WORKS 4

     

    EXPOSE

    EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

    1. # Usage: EXPOSE [port]
    2. EXPOSE 8080

    FROM

    FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

    1. # Usage: FROM [image name]
    2. FROM ubuntu 

    MAINTAINER

    我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

    1. # Usage: MAINTAINER [name]
    2. MAINTAINER authors_name 

    RUN

    RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

    1. # Usage: RUN [command]
    2. RUN aptitude install -y riak

    USER

    USER命令用于设置运行容器的UID。

    1. # Usage: USER [UID]
    2. USER 751

    VOLUME

    VOLUME命令用于让你的容器访问宿主机上的目录。

    1. # Usage: VOLUME ["/dir_1", "/dir_2" ..]
    2. VOLUME ["/my_files"]

    WORKDIR

    WORKDIR命令用于设置CMD指明的命令的运行目录。

    1. # Usage: WORKDIR /path
    2. WORKDIR ~/

    如何使用Dockerfiles

    使用Dockerfiles和手工使用Docker Daemon运行命令一样简单。脚本运行后输出为新的镜像ID。

    1. # Build an image using the Dockerfile at current location
    2. # Example: sudo docker build -t [name] .
    3. sudo docker build -t my_mongodb . 

    Dockerfile 示例一:创建一个MongoDB的镜像

    在这部分中,我们讲一步一步创建一个Dockfile,这个Dockerfile可用于构建MongoDB镜像进而构建MongoDB容器。

    创建一个Dockerfile

    使用nano文本编辑器,让我们创建Dockerfile。

    1. sudo nano Dockerfile

    定义文件和它的目的

    让阅读者明确Dockerfile的目的永远是必要的。为此,我们通常从注释开始写Dockerfile。

    1. ############################################################
    2. # Dockerfile to build MongoDB container images
    3. # Based on Ubuntu
    4. ############################################################

    设置基础镜像 

    1. # Set the base image to Ubuntu
    2. FROM ubuntu

    定义作者

    1. # File Author / Maintainer
    2. MAINTAINER Example McAuthor

    设置命令与参数下载MongoDB

    1. ################## BEGIN INSTALLATION ######################
    2. # Install MongoDB Following the Instructions at MongoDB Docs
    3. # Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
    4. # Add the package verification key
    5. RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
    6. # Add MongoDB to the repository sources list
    7. RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
    8. # Update the repository sources list once more
    9. RUN apt-get update
    10. # Install MongoDB package (.deb)
    11. RUN apt-get install -y mongodb-10gen
    12. # Create the default data directory
    13. RUN mkdir -p /data/db
    14. ##################### INSTALLATION END #####################

     

    设置MongoDB端口 

    1. # Expose the default port
    2. EXPOSE 27017
    3. # Default port to execute the entrypoint (MongoDB)
    4. CMD ["--port 27017"]
    5. # Set default container command
    6. ENTRYPOINT usr/bin/mongod

    保存Dockerfile。

    构建镜像

    使用上述的Dockerfile,我们已经可以开始构建MongoDB镜像

    1. sudo docker build -t my_mongodb .

    Dockerfile 示例二:创建一个Nginx的镜像

    Nginx简述

    Nginx是一个高性能的 HTTP 和 反向代理 服务器。它因为它的轻量级,易用,易于扩展而流行于业界。基于优良的架构设计,它能够比之前的类似软件处理更多的请求。它也可以用来提供静态文件服务,比如图片,脚本和CSS。

    和上个例子一样,我们还是从基础镜像开始,运用FROM命令和MAINTAINER命令

    1. ############################################################
    2. # Dockerfile to build Nginx Installed Containers
    3. # Based on Ubuntu
    4. ############################################################
    5. # Set the base image to Ubuntu
    6. FROM ubuntu
    7. # File Author / Maintainer
    8. MAINTAINER Maintaner Name

    安装Nginx

    1. # Install Nginx
    2. # Add application repository URL to the default sources
    3. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
    4. # Update the repository
    5. RUN apt-get update
    6. # Install necessary tools
    7. RUN apt-get install -y nano wget dialog net-tools
    8. # Download and Install Nginx
    9. RUN apt-get install -y nginx

    Bootstrapping 

    安装Nginx后,我们需要配置Nginx并且替换掉默认的配置文件

    1. # Remove the default Nginx configuration file
    2. RUN rm -v /etc/nginx/nginx.conf
    3. # Copy a configuration file from the current directory
    4. ADD nginx.conf /etc/nginx/
    5. # Append "daemon off;" to the beginning of the configuration
    6. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    7. # Expose ports
    8. EXPOSE 80
    9. # Set the default command to execute
    10. # when creating a new container
    11. CMD service nginx start

    保存 dockfile。

    使用Dockerfile自动构建Nginx容器

    因为我们命令Docker用当前目录的Nginx的配置文件替换默认的配置文件,我们要保证这个新的配置文件存在。在Dockerfile存在的目录下,创建nginx.conf:

    1. sudo nano nginx.conf

    然后用下述内容替换原有内容:

    1. worker_processes 1;
    2. events { worker_connections 1024; }
    3. http {
    4.      sendfile on;
    5.      server {
    6.          listen 80;
    7.          location / {
    8.               proxy_pass http://httpstat.us/;
    9.               proxy_set_header X-Real-IP $remote_addr;
    10.          }
    11.      }
    12. }

    让我们保存nginx.conf。之后我们就可以用Dockerfile和配置文件来构建镜像。

    展开全文
  • DOCKFILE 编写

    2020-07-19 19:01:32
    之前写过一篇DOCKER的基本操作,踩了很多坑,其实很多坑都可以通过正确的编写DOCKFILE来解决,决定开一篇博客写写DOCKFILE,照样从简开始,慢慢更新。

    之前写过一篇DOCKER的基本操作,踩了很多坑,其实很多坑都可以通过正确的编写DOCKFILE来解决,决定开一篇博客写写DOCKFILE,照样从简开始,慢慢更新。

    展开全文
  • Dockfile详解

    千次阅读 2019-06-10 13:22:07
    1.基本说明  Dockfile是一个用于编写docker镜像...在一个文件夹中,如果有一个名字为Dockfile的文件,其内容满足语法要求,在这个文件夹路径下执行命令:docker build --tag name:tag .,就可以按照描述构建一个镜...
  • dockfile2

    2019-04-17 14:09:02
    dockfile2 FROM ubuntu MAINTAINER xbf RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nginx COPY index.html /var/www/html ...
  • Dockfile构造镜像

    2020-07-21 00:20:43
    (1)编写Dockfile文件的内容: FROM centos MAINTAINER ethanethan@163.com #表示作者 ENV MYPATH /usr/local WORKDIR $MYPATH #设置进入容器的默认目录/usr/local RUN yum -y install vim #容器里面...
  • DockFile的指令学习

    2020-10-20 22:15:25
    DockFile的指令学习 DockerFile形象指令图 指令解释 FROM 镜像名 #基础镜像,一切从这里开始构建 MAINTAINER 姓名+邮箱 #该镜像是谁写的 RUN 命令 #docker build构建的时候需要运行的命令 ADD 一些压缩包 #往基础...
  • Dockfile镜像部署jar

    2019-05-05 14:45:43
    Dockfile 配置 #base mirror FROM anapsix/alpine-java #create by MAINTAINER username<email@xxx.com> #set workdir WORKDIR /app #拷贝文件到容器 ADD app.jar /app/app.jar #build arg #target run ...
  • 使用dockfile创建javaweb环境 程序员遇见bug了,第一句话:在我环境上没问题啊,你环境问题。好吧,容器技术能把咱们环境都给搞一致了,再也不用担心本地和服务器环境不一致啊导致的种种问题 创建容器 创建容器...
  • 1.Dockerfile格式 FROM //指定基于哪个基础镜像 格式 FROM <image> 或者 FROM <image>:<tag>, 比如 FROM centos FROM centos:latest MAINTAINER //指定作者信息 ...MAINTAINER fxq ...
  • Dockfile容器管理和镜像制作
  • 当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们...Dockfile FROM centos:latest RUN groupadd -r redis \ &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; useradd -r -g redis redis RUN y...
  • pytorch的DockfileDocker介绍Dockfile文件Dockfile文件编译运行及错误解决 基础镜像nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 Docker介绍 参考教程: 这可能是最为详细的Docker入门吐血总结 Dockfile文件 # =======...
  • 文章目录apache-apollo Dockfile 镜像制作apache-apolloapache-apollo-Dockerfile 详解Dockerfile详解docker 启动apollo镜像docker-compose 启动Apollo镜像验证是否成 apache-apollo Dockfile 镜像制作 apache-...
  • Docker Dockfile

    2021-07-01 15:59:26
    以文档形式将构建命令存起来,其他地方可以复用。
  • dockfile编写

    2021-05-21 10:09:15
    dockerfile实例 实例 实例一 FROM java:8 MAINTAINER zhangsan<xxx@qq.com> ...RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &...RUN mkdir -p /data/app/${SERVICE_N

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,708
精华内容 1,483
关键字:

dockfile