zoukankan      html  css  js  c++  java
  • Dockerfile

    http://blog.csdn.net/jiashiwen/article/details/48806243 一:如何使用:
    Dockerfile 用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令bulid来创建新的image
    docker build -t 命名空间/images
    二:Dockerfile语法关键字
    1,FROM:基于那个镜像
    FROM <image>
    FROM <image>:<tag>
    不加tag,则latest版本
    2,RUN:安装软件用
    构建指令,RUN可以运行任何被基础image支持的命令,如基础image选择ubuntu,那么软件管理部分只能使用ubuntu的命令,该指令有两种格式:
    RUN <command>(the command is run in a shell - `/bin/sh -c`)
    RUN ["executable","param1","param2" ...](exec form)
    3,MAINTAINER:镜像创建者
    MAINTAINER <name>
    4,CMD:container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.设置指令用于container启动时指定的操作,该操作可以是执行自定义脚本,也可以是执行系统命令
    该指令有三种格式:
    CMD ["executable","param1","param2"](like an exec,this is the preferred form)
    CMD command param1 param2 (as a shell)
    当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:
    CMD ["param1","param2"](as default parameters to ENTRYPOINT)
    ENTRYPOINT 指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序会以param1和param2作为参数执行,所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT
    5,ENTRYPOINT:container启动时执行的操作,但是一个Dockerfile只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条ENTRYPOINT没有CMD的可替换特性
    两种形式:
    ENTRYPOINT ["executable","param1","param2"](like an exec,the preferred form)
    ENTRYPOINT command param1 param2 (as a shell)
    该指令的使用分为两种情况,一种是独自使用,另一种是和CMD指令配合使用
    当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
    #CMD不会执行,只有ENTRYPOINT指令会被执行
    CMD echo "hello world"
    ENTRYPOINT ls -l
    另一种用法和CMD每集配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数 
    FROM ubuntu
    CMD ["-l"]
    ENTRYPOINT ["/usr/bin/ls"]
    6,USER:使用那个用户跑container如:
    ENTRYPOINT["mecached"]
    USER daemon
    ENTRYPOINT ["memcached","-u","daemon"]
    7,EXPOSE:指定容器需要映射到宿主机器的端口
    设置指令,该指定会将容器中的端口映射成宿主机器中的某个端口,当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口,要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这时要确保 主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项
    EXPOSE <port>[<port>...]
    #映射一个端口
    EXPOSE port1
    #相应的运行容器使用的命令
    docker run -p port1 image
     
    #映射多个端口
    EXPOST port1 port2 port3
    #相应的运行容器使用的命令
    docker run -p port1 -p port2 -p port3 image
    #还可以指定需要映射到宿主机器上某个端口号
    docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
    docker run -d -p 127.0.0.1:33301:22 image
    则该container ssh服务的22端口被映射到主机的33301端口
    端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的,宿主机器的IP地址是固定的,我们可以将容器的端口映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都李查看容器的IP的地址,对于一个运行的容器,可以使用docker port 加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口
    8,ENV:用来设置环境变量
    ENV LANG en_US.UTF-8
    ENV LC_ALL en_US.UTF-8
    设置后。后续RUN命令都可以使用,container启动后,可以通过docker inspect 查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量
    假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dokcerfile中这样写
    ENV JAVA_HOME /path/to/java/direct/
    9,ADD将文件<src>拷贝到container的文件系统对应的路径<dest>
    所有拷贝 到container中的文件和文件夹权限 为0755,uid和gid为0,如果文件是可识别的压缩格式,则docker会帮忙解压缩,如果是一个目录,那么会将该目录下的所有文件添加到container中,如果<src>国文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下,格式:
    ADD <src> <dest>
    <src>是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程文件url;
    <dest>是container中绝对路径
    10.VOLUME(指定挂载点)
    使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用,我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失 ,当容器中的应用有持久化数据的需要时可以在Dockerfile中使用该指令:
    VOLUME ["<mountpoint>"]
    FORM base
    VOLUME ["/tmp/data"]
    运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在,例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动
    docker run -it -rm -volumes-from container1 image2 bash
    container1为第一个容器的ID,image2为第二个容器运行image名字
    11.WORKDIR(切换目录)
    可以多次切换(相当于cd命令)对RUN,CMD,ENTRYPOINT生效
    格式:
    WORKDIR /path/to/workdir
    #在/p1/p2下执行 vim a.txt
    WORKDIR /p1 WORKDIR p2 RUN vim a.txt
    12.ONBUILD(在子镜像中执行)
    ONBUILD <Dockerfile关键字>
    ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
    一个例子:构建jdk + tomcat环境 Dockerfile文件
    #pull base image
    FROM ubuntu:13.10
    MAINTAINER test "test@gmail.com"
     
    #update source
    RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
    RUN apt-get update
     
    #Install curl
    RUN apt-get install -y curl
     
    #install JDK 7
    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
    RUN mkdir -p /usr/lib/jvm
    RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/
     
    # Set Oracle JDK 7 as default Java
    RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300
    RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300
     
    ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
     
    #Install tomcat7
    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
    RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/
     
    ENV CATALINA_HOME /opt/tomcat7
    ENV PATH $PATH:$CATALINA_HOME/bin
     
    ADD tomcat7.sh /etc/init.d/tomcat7
    RUN chomd 755 /etc/init.d/tomcat7
     
    #Expose ports
    EXPOSE 8080
     
    #define default command
    ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out
     
    tomcat7.sh
    export JAVA_HOME=/usr/lib/jvm/java-7-oracle/
    export TOMCAT_HOME=/opt/tomcat7
    case $1 in
    start)
    sh $TOMCAT_HOME/bin/startup.sh
    ;;
    stop)
    sh $TOMCAT_HOME/bin/shutdown.sh
    ;;
    restart)
    sh $TOMCAT_HOME/bin/shutdown.sh
    sh $TOMCAT_HOME/bin/startup.sh
    ;;
    esac
    exit 0
    三:最后一步:脚本写好了,需要转换成镜像
    docker build --r testdocker/jdk-tomcat .
    docker run -d -p 8090:8080 testdocker/jdk-tomcat
    默认情况下,tomcat会占用8080端口,刚才在启动container的时候,指定了 -p 8090:8080,映射到宿主机端口就是8090。
    http://<host>:8090 host为主机IP

    有关docker部署php环境主参考 : http://blog.csdn.net/jiashiwen/article/details/48806243 (文章相当详细)

  • 相关阅读:
    vue-fullcalendar插件
    iframe 父框架调用子框架的函数
    关于调试的一点感想
    hdfs 删除和新增节点
    hadoop yarn 实战错误汇总
    Ganglia 安装 No package 'ck' found
    storm on yarn(CDH5) 部署笔记
    spark on yarn 安装笔记
    storm on yarn安装时 提交到yarn失败 failed
    yarn storm spark
  • 原文地址:https://www.cnblogs.com/EvileOn/p/6078250.html
Copyright © 2011-2022 走看看