zoukankan      html  css  js  c++  java
  • Dockerfile

    之前我们介绍了Docker的三大组件,Image(镜像),Container(容器),Repository(仓库)。
    今天我们来看一下怎么使用Dockerfile,制作一个镜像。
    dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),遵循的语法为DSL(Domain Specified Language),例如我们想构建一个Nginx镜像:
    #Base images
    FROM centos
    
    #MAINTAINER 维护人
    MAINTAINER test
    
    #ADD 添加本地文件到镜像
    ADD pcre-8.37.tar.gz /usr/local/src
    ADD nginx-1.9.3.tar.gz /usr/local/src
    
    #RUN 在镜像中执行命令
    RUN yum install -y wget gcc_c++ make openssl-devel
    RUN useradd -s /sbin/nologin -M www
    
    #WORKDIR 镜像中切换到目录
    WORKDIR /usr/local/src/nginx-1.9.3
    
    RUN yum install -y gcc gcc-c++
    RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37 && make && make install
    RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
    
    #配置环境变量
    ENV PATH /usr/local/nginx/sbin:$PATH
    
    EXPOSE 80
    
    CMD  ["nginx"]
    • FROM:指定基础镜像,一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令可以使用下面这几种语法指定基础镜像:
      • FROM <image>
      • FROM <image>:<tag>
      • FROM <image>:<digest>
    • MAINTAINER : 指定作者
    • RUN:指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。
      • RUN <command> : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
      • RUN ["executable", "param1", "param2"] : RUN ["/bin/bash", "-c", "echo hello"]
    • COPY : 复制命令,COPY package.json /usr/src/app/
      • COPY [--chown=<user>:<group>] <源路径>... <目标路径>
      • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
    • ADD : 更高级的复制文件, ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能,比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去;如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。 这些是COPY指令不能做到的。
    • WORKDIR 指定工作目录,使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
      • WORKDIR <工作目录路径>
    • ENV 设置环境变量,格式有两种
      • ENV <key> <value>
      • ENV <key1>=<value1> <key2>=<value2>...
    • EXPOSE 声明端口,EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务,在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
      • EXPOSE <端口1> [<端口2>...]
    • CMD 容器启动命令,之前介绍容器的时候曾经说过,Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

    了解了以上这些指令之后我们再来看Dockerfile做了哪些事情


    1.指定了基础镜像Centos
    2.指定了作者为test
    3.这里我们看到了两个ADD命令,上面我们提到过ADD命令会自动解压原路径中的压缩文件,所有这两加过两个压缩文件解压到了指定目录。
    4.安装 gcc_c++ make openssl-devel这几个软件
    5.建立用户帐号和创建用户的起始目录,-s:指定用户登入后所使用的shell。默认值为/bin/bash。-M:不要自动建立用户的登入目录。 www为用户改名称。
    6.设置了工作目录为:/usr/local/src/nginx-1.9.3
    7.安装了gcc gcc-c++以及nginx,并将daemon off; 写入到nginx的config文件(daemon on | off   默认on:是否以守护进程的方式运行nginx,守护进程是指脱离终端并且在后头运行的进程,关闭守护进程执行的方式可以让我们方便调试nginx)
    8.设置环境变量,将nginx sbin路径加入到了环境变量PATH中。
    9.声明服务端口为80
    10.设置了启动容器时,需要执行的命令。

    编写万Dockerfile后我们就可以使用docker build命名制作镜像了,具体命令如下:
    docker build -t nginx-image:v1 . -t指定了镜像的名称以及版本, 这个时候我们就制作了一个镜像, 名称为:nginx-docker

    如果想要启动容器则执行命令:
    docker run -it -p 8888:80 --name nginx-container nginx-image:v1
    -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开, -p: 端口映射,格式为:主机(宿主)端口:容器端口, --name 指定了启动的容器的名称为nginx-container,方便以后识别。 这样我们就访问主机的8888端口,就可以访问到docker中运行的nginx 主页。






  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/is-possible/p/12323463.html
Copyright © 2011-2022 走看看