• Docker 创建镜像


    我们从镜像仓库下载的,都是别人事先做好的。如果我们需要一个定制的镜像,就必须得自己动手。自己创建一个镜像有2种方式:
    a、基于一个现有的镜像来修改
    b、基于Dockerfile来创建

    1、基于一个现有的镜像进行修改
    a.修改已有镜像
    先使用docker pull training/sinatra下载镜像

    b.启动镜像

    [root@rocketmq-nameserver4 ~]# docker run -i -t training/sinatra /bin/bash

    c. 在镜像中添加json和gem两个应用

    root@7cbcbcc5e574:/# gem install json

    添加完成后,使用exit退出容器,我们在容器中添加了新的应用,容器被改变。

    d、我们使用docker commit命令来提交更新后的副本

    [root@rocketmq-nameserver4 ~]# docker commit -m 'add json gem' -a 'Docker Container' 7cbcbcc5e574 my/sinatra:v2
    sha256:8ba1d6a3ce4e6bb17f32e6421b6ccc14c05640099a2c6f07014b88f7c7812178 -->运行命令,返回镜像ID
    参数说明:
    -m:提交的描述信息
    -a:指定镜像作者
    7cbcbcc5e574:容器ID,在容器执行时可以在命令行开头查看。比如:root@7cbcbcc5e574中@之后的内容。此外还可以通过docker images来查看
    my/sinatra:v2:指定要创建的目标镜像名

    e.使用我们自己创建的镜像my/sinatra:v2来启动容器

    我们可以看到,一个容器就是一个微型的LINUX系统

    2、本地文件系统创建镜像
    使用Dockerfile来创建镜像,使用docker commit虽然很容易扩展镜像,但不便于团队分享,我们可以使用docker build来创建一个新的镜像,为此首先要创建一个Dockerfile文件,这个文件中包含如何创建镜像的指令。

    a.首先新建一个目录和Dockerfile

    [root@rocketmq-nameserver4 centos]# cd /home/xm6f/dev
    [root@rocketmq-nameserver4 centos]# mkdir centos 
    [root@rocketmq-nameserver4 centos]# cd centos/
    [root@rocketmq-nameserver4 centos]# touch Dockerfile #注意Dockerfile首字母是大写

    b.Dockerfile中输入指令,每条指令都创建镜像的一层。
    Dockerfile中内容如下:

    ------------------------------------------------------
    ##注解
    FROM centos
    ##FROM centos:6.7 
    MAINTAINER ruthless 41125784@qq.com
    RUN yum -qqy install python
    ------------------------------------------------------

    它与shell脚本类似,是一个批处理的过程,但是它具有自己的命令和语法。Dockerfile的命令都是大写的,比如:FROM、RUN等。

    FROM:告诉Docker使用哪个镜像作为基础
    MAINTAINER:维护者的信息
    RUN开头的指令会在创建中运行,例如安装一些软件包,这里使用yum 安装python;注意使用yum 需要制定参数 -qqy,不然呢可能会报错的。

    然后使用docker build构建镜像:

    $ docker build -t='my/centos_width_python:v1.0.1' . ##注意此处有个".",表示从当前目录查找Dockerfile


    其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

    可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据
    Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令
    并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有
    的中间步骤所产生的容器都被删除和清理了。

    需要注意的是一个镜像是不能操作127层的,否则会报错!

    c、查看刚创建的镜像

    当然Dockerfile中还可以输入其他的命令,例如可以使用ADD命令复制本地文件到镜像中;用EXPOSE命令对外开放端口;用CMD命令描述容器启动后运行的程序。

    d.现在可以使用创建好的镜像来启动容器

    [root@rocketmq-nameserver4 centos]# docker run -i -t my/centos_width_python:v1.0.1 /bin/bash

    现在觉的镜像的标签不好,可以使用docker tag 命来来修改镜像的标签。

    通过docker images命令发现,my/python就是修改标签过后的镜像。

  • 相关阅读:
    多线程博文地址 http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html
    vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)
    Lambda语句中创建自定义类型时,也可指定某种特定类型,方法是在new与{}之间写上类型名称
    Win7开始菜单所在目录
    C#中Struct与Class的区别
    Linq语句:三表联查
    用exp、dmp导入导出用户到同一个实例下时,类型type会有问题
    列、约束重命名,原数据不丢失
    CDM中,创建一个或多个组合属性的唯一约束
    EF中新建表和关联表的方法
  • 原文地址:https://www.cnblogs.com/linjiqin/p/8588836.html
Copyright © 2020-2023  润新知