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

  • 相关阅读:
    AC自己主动机
    curl命令具体解释
    javascript事件和事件处理
    STM32 水晶不摇
    Play Modules Morphia 1.2.9a 之 Aggregation and Group aggregation
    菜板 动态规划
    姿势体系结构的详细解释 -- C
    有情无情胜, 大家是不是谁谁谁的意外
    S性能 Sigmoid Function or Logistic Function
    iOS 中国排序
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14921283.html
Copyright © 2011-2022 走看看