zoukankan      html  css  js  c++  java
  • Dockerfile 一个不容忽视的文件

    我们在之前的文章中分享过Docke的三个关键名称:仓库, 镜像, 容器之间的概念和关系.

    今天我们就把重点放在Dockerfile上.

     Docker通过dockerfile来自动构建镜像.

    Dockerfile是什么


    Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层该如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 生成docker 镜像.

    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 四部分说明:

    一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.

    接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.

    后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.

    最后是CMD指令,来指明运行容器时的操作命令.

    Dockerfile 指令选项:

    • FROM
    • MAINTAINER
    • RUN
    • CMD
    • EXPOSE
    • ENV
    • ADD
    • COPY
    • ENTRYPOINT
    • VOLUME
    • USER
    • WORKDIR
    • ONBUILD

     具体的指令使用可以参阅官方:http://www.docker.org.cn/

    构建镜像


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

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

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

    镜像标签


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

    docker build -t nginx/v3 .

    如果存在多个仓库下, 或者使用多个镜像标签, 可以用多个-t参数

    docker build -t nginx/v3:1.0.2 -t nginx/v3:latest .

    简单示例


    接下来用一个简单的示例Dockerfile如何来构建和启动容器.

    在一个空白的文本文件, 命名为Dockerfile

    mkdir mynginx
    cd mynginx
    vi Dockerfile

    Dockerfile文件内容:

    FROM nginx
    RUN echo '<h1>It works!</h1>' > /usr/share/nginx/html/index.html

    非常简单的Dockerfile, 在执行过程中重写了nginx的默认页面信息,将其替换为It works!

    在dockerfile文件目录下执行

    docker build -t nginx:v1 .

    就开始构建了

    louie-mac:mynginx louiezhou$ vi Dockerfile
    louie-mac:mynginx louiezhou$ docker build -t nginx:v1 .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM nginx
    latest: Pulling from library/nginx
    bc51dd8edc1b: Pull complete
    66ba67045f57: Pull complete
    bf317aa10aa5: Pull complete
    Digest: sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
    Status: Downloaded newer image for nginx:latest
     ---> 2073e0bcb60e
    Step 2/2 : RUN echo '<h1>It works!</h1>' > /usr/share/nginx/html/index.html
     ---> Running in 2f49ab8104be
    Removing intermediate container 2f49ab8104be
     ---> e68df98a0494
    Successfully built e68df98a0494
    Successfully tagged nginx:v1

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

    louie-mac:mynginx louiezhou$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               v1                  e68df98a0494        4 minutes ago       127MB
    nginx               latest              2073e0bcb60e        2 weeks ago         127MB

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

    louie-mac:mynginx louiezhou$ docker run  --name docker_nginx_v1   -d -p 80:80 nginx:v1
    32180627ef8a97710726d14efa499d4c61ccb95d9e7b0d293cd1f0227fc74f94

    这条命令会使用nginx镜像启动一个容器, 命名为 docker_nginx_v1 , 映射端口是80

    打开浏览器地址localhost,就可以看到

     这样一个简单使用Dockerfile构建镜像,运行容器就完成了.

    修改容器内容


    容器启动后,需要对容器内容的文件进行完善, 可以使用

    docker exec -it 容器名称 bash 命令进行修改, 基于上面示例基础修改启动提示内容

    docker exec -it docker_nginx_v1   bash
    root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    root@3729b97e8226:/# exit
    exit

    以交互式终端方式进入docker_nginx_v1 容器, 并执行bash命令,也就是获取了一个可操作的shell,再次刷新浏览器, 就是你新修改的内容了.

    修改了容器的文件,也就是动了容器的存储层,可以通过docker diff命令看到具体改动

    louie-mac:mynginx louiezhou$ docker diff docker_nginx_v1
    C /run
    A /run/nginx.pid
    C /var/cache/nginx
    A /var/cache/nginx/client_temp
    A /var/cache/nginx/fastcgi_temp
    A /var/cache/nginx/proxy_temp
    A /var/cache/nginx/scgi_temp
    A /var/cache/nginx/uwsgi_temp

    到此Dockerfile使用方式就介绍的差不多了

    补充内容:

    缓存


     Dockerfile守护进程会一条条执行Dockerfile中的命令, 而且会在每一步提交并生成一个新镜像,最后会输出最终镜像的id, 生成完成后, Docker守护进程会自动清理你发的上下文.

    Dockerfile文件中的每一条指令都会被独立执行, 并会创建一个新的镜像,RUN命令等不会对下一条指令产生影响.

  • 相关阅读:
    python---逻辑运算(and、or、not)
    VsCode预览HTML文件的方法
    Windows10下composer的安装以及配置
    Centos7上SVN客户端的安装和使用
    Centos7安装redis
    centos7下解决yum install mysql-server没有可用包
    Centos7 安装的mysql 报错 Unit mysqld.service entered failed state.
    Redis的一些规范
    PHP安装Redis扩展
    bzip2:无法 exec: 没有那个文件或目录
  • 原文地址:https://www.cnblogs.com/louiezhou/p/12331338.html
Copyright © 2011-2022 走看看