zoukankan      html  css  js  c++  java
  • 【转】一个简单的Dockerfile实例

    原文:https://blog.csdn.net/big_data1/article/details/90241986

    ------------------------------

    一、Dockerfile 概念
    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

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

    Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

    二、Dockerfile文件格式
    Dockerfile文件格式如下:

    ## Dockerfile文件格式

    # This dockerfile uses the ubuntu image
    # VERSION 2 - EDITION 1
    # Author: docker_user
    # Command format: Instruction [arguments / command] ..

    # 1、第一行必须指定 基础镜像信息
    FROM ubuntu

    # 2、维护者信息
    MAINTAINER docker_user docker_user@email.com

    # 3、镜像操作指令
    RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
    RUN apt-get update && apt-get install -y nginx
    RUN echo " daemon off;" >> /etc/nginx/nginx.conf

    # 4、容器启动执行指令
    CMD /usr/sbin/nginx

    Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。

    三、构建镜像
    docker build 命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,所以构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。

    将当前目录做为构建上下文时,可以像下面这样使用docker build命令构建镜像:

    docker build .
    Sending build context to Docker daemon 6.51 MB
    ...

    说明:构建会在 Docker 后台守护进程(daemon)中执行,而不是CLI中。构建前,构建进程会将全部内容(递归)发送到守护进程。大多情况下,应该将一个空目录作为构建上下文环境,并将 Dockerfile 文件放在该目录下。

    在构建上下文中使用的 Dockerfile 文件,是一个构建指令文件。为了提高构建性能,可以通过.dockerignore文件排除上下文目录下不需要的文件和目录。

    在 Docker 构建镜像的第一步,docker CLI 会先在上下文目录中寻找.dockerignore文件,根据.dockerignore 文件排除上下文目录中的部分文件和目录,然后把剩下的文件和目录传递给 Docker 服务。

    Dockerfile 一般位于构建上下文的根目录下,也可以通过-f指定该文件的位置:

    docker build -f /path/to/a/Dockerfile .

    构建时,还可以通过-t参数指定构建成镜像的仓库、标签。

    四、简单示例
    首先我们准备一个nginx的基础镜像。

    docker pull library/ngnix

    在镜像列表中会看到我们从远程仓库中获取的nginx镜像。

    docker images

    准备好了基础镜像,接下来用一个简单的示例来感受一下 Dockerfile 是如何用来构建镜像启动容器。我们以定制 nginx 镜像为例,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

    mkdir mydocker
    cd mydocker
    vi Dockerfile

    构建一个 Dockerfile 内容如下:

    FROM nginx
    RUN echo '<h1>hello, docker!</h1>' > /usr/share/nginx/html/index.html

    这个 Dockerfile 很简单,一共就两行涉及到了两条指令:FROM 和 RUN,FROM 表示获取指定基础镜像,RUN 执行命令,在执行的过程中重写了 nginx 的默认页面信息,将信息替换为:Hello, Docker!。

    构建镜像,在 Dockerfile 文件所在目录执行:

    docker build -t nginx:v1 .

    命令最后有一个. 表示当前目录

    构建完成之后,使用 docker images 命令查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功。

    docker images

    接下来使用 docker run 命令来启动容器。

    docker run --name docker_nginx_v1 -itd -p 80:80 nginx:v1

    这条命令会用 nginx 镜像启动一个容器,命名为docker_nginx_v1,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器:http://10.0.50.100/, 页面返回信息:

    这一步有可能会报错:

    解决办法:在文件 /etc/sysctl.conf 中添加如下代码:

    net.ipv4.ip_forward=1

    重启network服务和docker,查看是否修改成功:

    sysctl net.ipv4.ip_forward

    如果返回为“net.ipv4.ip_forward = 1”则表示成功了。
    ————————————————
    版权声明:本文为CSDN博主「Coder杨公子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/big_data1/article/details/90241986

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14921283.html
Copyright © 2011-2022 走看看