zoukankan      html  css  js  c++  java
  • docker 学习(一)镜像和镜像的构建Dockerfile

    docker学习

    概述

    • 诞生时间:2013年
    • 编写语言:go
    • 目标:实现轻量级操作系统虚拟化解决方案。
    • 基础是Linux容器(LXC)等技术。
    • 与传统虚拟化的区别:
    ![Alt text](./1530091149104.png) ![Alt text](./1530091153149.png)

    在任何地方开发、部署和运行任何应用

    Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

    docker 组件

    • docker engine 基于虚拟化技术的轻量级并且功能强大的开源引擎管理工具。
    • docker hub 分享管理images尽享的SaaS服务

    为什么选择docker

    • 快速交付应用程序
      • 部署快
      • 依赖少
      • 易迁移
      • 省资源
    • 快速构建轻松管理

    镜像

    镜像概述

    • docker 镜像又文件系统叠加而成,低端是一个引导文件系统bootfs,用户不会跟引导文件系统又交互,当容器启动后,就会被移到内存中,引导文件系统就会被卸载。
    • 第二层是rootfs,可以是操作系统。docker里rootfs永远是只读状态
    • 镜像存在只读层,不会改变
    • 父镜像:每个镜像都可能依赖有一个或多个下层组成的一个镜像,下层就是上层的父镜像
    • 基础镜像:没有父镜像的镜像就是基础景象
    • 镜像id:所有镜像都通过一个64位十六进制字符串内部是256bit的值来标识,为了简化使用,前12个字符组成短id。

    获取镜像

    docker pull命令从仓库获取镜像,默认仓库源是docker官方源,为了加快速度,可以使用其它源地址:

    docker pull  http://localhost:5000/ubuntu:18.04

    最常用的是更换docker默认源为国内源:
    vim /etc/docker/daemon.json

    {
          "registry-mirrors": [
                  "https://registry.docker-cn.com"
                    ]
    }

    重启docker即可使用

    列出本地镜像

    docker images

    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    192.168.100.52:5000/centos        latest              7a5530ef979d        5 days ago          4.75 GB
    centos                            lnmp2               7a5530ef979d        5 days ago          4.75 GB
    127.0.0.1:5000/centos             latest              7a5530ef979d        5 days ago          4.75 GB
    192.168.100.52/centos             latest              7a5530ef979d        5 days ago          4.75 GB

    id相同的镜像是同一个镜像
    tag用来标记同意仓库的不同镜像
    使用docker run 启动镜像的时候,如果不指定具体的tag。怎会启动最新latest

    构建镜像

    一般来说不是真正的创建新镜像,而是基于一个已有的基础镜像,如ubuntu,centos等构建新镜像而已。

    1.可以从已有镜像上更新,也可以基于本地系统创建

    修改已有镜像

    先使用镜像启动容器,然后进入容器进行修改,修改完成后退出容器,用docke commit 命令进行提交更改后的容器副本,

    提交

    docker commit

    选项:
    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。

    2.Dockerfile和docker build构建镜像:

    • Dockerfile使用的是DSL语法。docker build基于Dockerfile里面的指定进行构建镜像。
    • 创建一个空目录,并新建Dockerfile文件
      mkdir -p /home/docker-web && cd /home/docker-web && touch Dockerfile
      vim Dockerfile
    #注释
    FROM ubuntu:14.04 #指定一个基础镜像,FROM要大写
    MAINTAINER #镜像作者以及联系方式
    RUN #RUN命令会在当前镜像中运行指定命令。比如:
    RUN yum -y install apache
    默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c来执行,不支持shell用exec格式的RUN
    RUN [ "yum","-y","install","apache"]
    EXPOSE指定需要打开哪些端口

    构建镜像
    docker build -t="centos/apache:v1 ."
    -t 选项为镜像指定仓库和镜像名字。
    .指定在当前目录中指定Dockerfile
    也可以指定一个git仓库源地址
    构建每一步都会有id,如果构建出错,进入前一步骤的id进行调试,然后再次构建。
    - Dockerfile和构建缓存
    由于每步过程都会提交为镜像,最终镜像之前的镜像就可以看作是缓存,如果构建失败对某一步骤进行调试,前面几步没有改动,会在有修改的步骤开始进行构建。
    不需要构建缓存时,用--no-cache参数
    - 基于缓存构建Dockerfile模板
    构建缓存的好处是,可以实现简单的Dockerfile模板,,比如在Dockerfile文件顶部增加包仓库或者更新包,尽可能命中缓存。
    - ENV指令为环境变量,由于镜像的层次文件系统,环境变量在后续的层次中被引用。当容器启动后,在容器可以通过env命令查看环境变量。
    ENV DIR=/usr/local/
    WORKDIR $DIR
    ENV创建的环境变量会持久的保存到从此镜像创建的任何容器中,也可所以使用docker run -e参数指定环境变量,只在启动时有效
    - RUN命令是构建容器时所需要运行的命令
    - CMD是在容器运行时,需要运行的命令,将要运行的命令放在一个数组结构中例如:CMD ["bin/bash","ls"], 如果不加数组结构,docker会在命令前加上/bin/sh -c
    - 启动容器时docker run命令可以覆盖CMD
    - Dockerfile中只能指定一个CMD命令。多个CMD只会执行最后一个
    - ENTRYPOINT指令与CMD相似,区别:docker run会覆盖CMD命令,但是不能覆盖ENTRYPOINT命令。如需覆盖在启动时市容docker run --entrypoint
    - WORKDIR指令从镜像创建容器时,在容器内设置一个工作目录,指定ENTRYPOINT和/或者CMD、RUN、COPY、ADD指令的工作目录,如果不存在,就会创建。可以多次设置。在启动容器时,用docker run -w参数进行覆盖。
    - USER指令用来指定该镜像会议什么用户运行。启动时用docker run -u参数进行覆盖。默认为root。

    USER user
    USER user:group
    USER uid:gid
    USER uid:group
    • VOLUME指令基于镜像创建的容器添加卷,VOLUME ["/data/mysql","data"]
    • ADD指令将构建环境下的文件和目录复制到镜像中,ADD passwd /etc/passwd将本地构建目录下的passwd复制到镜像中/etc/passwd。可以是一个url,或者构建上下文文件或者目录,不能是构建目录意外的文件。docker通过末尾的/判断是目录还是文件。添加url示例:ADD http://www.baidu.com/123.zip /home/baidu.zip当ADD的文件是本地归档文件。会自动解包。ADD baidu.zip /home/会自动解包,如果存在目标文件或目录,不会被覆盖,自动解压支支持本地归档文件,不支持url。如果目标路径不存在则会自动创建
    • COPY指令与ADD类似,区别是COPY只是在构建上下文中复制本地文件,不会提取和解压,本地文件与Dockerdile同一路径。目标位置必须是是容器内的一个绝对路径。任何由该指令创建的文件uid和gid都是0
    • ONBUILD指令是Dockerfile文件中的触发器,并不会在基于此Dockerfile构建镜像中生效,当基于此父镜像构建子镜像时,才会触发生效。孙子镜像不能触发,onbuild不能执行FROM、MAINTAINER、和ONBUILD本身
    • EXPOSE指令是告诉docker该容器内部的应用程序会使用容器的指定端口,

  • 相关阅读:
    简单项目却持着一颗纠结的心
    一个简单的打的系统
    ftqghkwiNdrpid快速建项Sql语句生
    3/21 Django框架 模板路径及模板过滤器 1.模板路径查找
    3/19 Django框架 url路由配置及模板渲染
    3/18 Django框架 启动django服务
    3/16 Django框架 环境搭建
    Windows子系统配置,cmder配置, pycharm配置django开发环境
    Requests+正则表达式抓取猫眼电影TOP100
    分析Ajax抓取今日头条街拍美图
  • 原文地址:https://www.cnblogs.com/lixuebin/p/10808460.html
Copyright © 2011-2022 走看看