
本期目录
提交构建镜像的命令如下:
$ docker commit -m="提交描述信息" -a="作者" 容器ID 目标镜像名称:[TAG]
举例:本节我们将自己构建一个带 Vim 编辑工具的 Ubuntu 镜像。从官网下载的 base Ubuntu 镜像,里面是没有 Vim 工具的,那么我可以在 base Ubuntu 镜像的基础上,增加 Vim 工具,再构建出一个带 Vim 的 Ubuntu 镜像,使其天生带有 Vim ,在这个镜像创建的容器都会带有 Vim 。
前台交互式启动一个 Ubuntu 容器。
$ docker run -it ubuntu:latest /bin/bash

尾号 5731 的 Ubuntu 容器是不带 Vim 编辑工具的。
$ vim

安装 Vim 之前,先更新包管理工具 apt-get ( Ubuntu 一般用的是 apt-get ) 。
$ apt-get update

然后,在这个容器中安装 Vim 。
$ apt-get -y install vim
安装完成后,测试 Vim 。
$ vim a.txt

能够进入编辑页面,Vim 安装成功。

键盘按下 Ctrl + P + Q 让 Ubuntu 容器保持运行退出容器。

接下来是本节的核心内容,把带 Vim 的 Ubuntu 容器 Commit 成镜像。镜像构建成功后,返回镜像 ID 。
$ docker commit -m="add vim cmd" -a="xiesh" 45ce35485731 ouc/myubuntu:1.0

此时列出所有镜像,可以看到成功构建了镜像。由于添加了 Vim 编辑工具,我们构建的 Ubuntu 镜像大小已经从官方原来的 72.8 MB 扩大到 181 MB 。这就是镜像分层带来的好处,可以基于最简单的 base 镜像,像搭积木一样一层一层往上加自己需要的程序和软件,最终构建出功能越来越强大的镜像。

【总结】Docker 中的镜像分层,支持通过扩展现有的镜像,创建新的镜像。类似于 Java 继承于一个 Base 基础类,自己再按需扩展。新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

本节把刚刚构建的带 Vim 的 Ubuntu 镜像发布到阿里云 (公有云) ,这样别的开发者就可以拉取你制作的镜像使用了,服务广大人民群众。
首先登录阿里云官网 https://www.aliyun.com/ ,点击【控制台】。

点击【容器镜像服务】。

进入【个人实例】。

设置密码。

先创建命名空间,点击【命名空间】,点击【创建命名空间】。


设为【公开】开源给大家。

点击【镜像仓库】。

点击【创建镜像仓库】。

然后选择【本地仓库】上传,直接【创建镜像仓库】。


把本地镜像推送到阿里云镜像仓库,推送脚本可从上面的管理页面复制。首先登录到阿里云的远程仓库。
$ docker login --username=xiesh registry.cn-hangzhou.aliyuncs.com

设置 Tag 。
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:[镜像版本号]
推送到阿里云远程库。
$ docker push registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:[镜像版本号]

到此就成功把本地镜像推送到阿里云了。
为了验证,我们接下来从阿里云镜像仓库拉取镜像到本地仓库。先把本地仓库中的 Ubuntu 镜像删除。
$ docker rmi -f b9b636ea0a65

拉取镜像到本地。
$ docker pull registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:1.0

拉取成功。创建容器,并尝试使用 Vim 编辑文本。
$ docker run -it b9b636ea0a65 /bin/bash
$ vim a.txt


说明我们构建的带 Vim 的 Ubuntu 镜像成功推送到阿里云远程库,并可以正常拉取镜像和创建容器。
在企业中,为了安全,构建的镜像绝大部分都是推送到企业内部的私有云镜像仓库中。Docker Registry 是官方提供的工具,可以用于构建私有镜像仓库。
本节把刚刚构建的带 Vim 的 Ubuntu 镜像发布到私有云作为演示。
$ docker pull registry

$ docker run -d -p 5000:5000 -v /root/myregistry/:/tmp/registry --privileged=true registry:latest

其中,-d 表示后台守护式运行;-p 5000:5000 表示把容器的 5000 端口映射到宿主机的 5000 端口端口上;-v 表示把容器中 /tmp/registry 目录下的数据同步到宿主机的 /root/myregistry 目录中;--priviledged=true 表示扩大容器的权限解决挂载目录没有权限的问题 。
默认情况下,仓库被创建在容器的 /var/lib/registry 目录下,建议自行用容器卷映射,方便与宿主机联调。
$ docker run -it --name=u1 ubuntu:latest /bin/bash

安装 ifconfig 之前,先更新包管理工具 apt-get ( Ubuntu 一般用的是 apt-get ) 。
$ apt-get update

然后,在这个容器中安装 ifconfig 命令。
$ apt-get -y install net-tools

安装完成后,测试 ifconfig 。能看到这个 Ubuntu 容器内部的 IP 信息。
$ ifconfig

安装完成后,commit 我们自己构建的新镜像。
$ docker commit -m="add ifconfig cmd" -a="xiesh" cbcc904f1be5 ouc/myubuntu:1.1

接下来我们是想把构建的带 ifconfig 命令的 Ubuntu 镜像推送到本地的 Docker Registry 私有仓库中。首先我们要查看该私有库中有什么镜像。
$ curl -XGET http://192.168.168.101:5000/v2/_catalog

可以看到私服仓库是空的,里面没有任何镜像。
ouc/myubuntu:1.1 修改成符合私服规范的 Tag 。$ docker tag 镜像:Tag Host:Port/Registry:Tag
注意,这里要写自己的 host 主机 IP 地址。
使用该命令将 ouc/myubuntu:1.1 这个镜像修改为 192.168.168.101:5000/ouc/myubuntu:1.1 。
$ docker tag ouc/myubuntu:1.1 192.168.168.101:5000/ouc/myubuntu:1.1

由于 Docker Registry 做了安全加固,默认不支持 HTTP 协议的推送。因此我们要取消此限制。
$ cat /etc/docker/daemon.json

registry-mirrors 配置的是国内阿里云提供的镜像加速地址,不用的话访问官网会很慢。
我们要在这个文件中新增内容。注意 JSON 格式要加逗号分隔。
$ vim /etc/docker/daemon.json

按 :wq 保存退出,如果修改完后不生效,建议重启 Docker 和 registry 容器。
$ systemctl restart docker
$ docker start d035810c65ef
$ docker push 192.168.168.101:5000/ouc/myubuntu:1.1

$ curl -XGET http://192.168.168.101:5000/v2/_catalog

先删除本地仓库的镜像。
$ docker rmi -f 192.168.168.101:5000/ouc/myubuntu:1.1

从私服仓库中拉取镜像到本地。
$ docker pull 192.168.168.101:5000/ouc/myubuntu:1.1

运行这个镜像,创建容器。并使用 ifconfig 命令。
$ docker run -it a73412a51b67 /bin/bash
$ ifconfig

拉取的镜像创建的容器可以成功运行 ifconfig 命令。至此,我们又获得了一个增加了 ifconfig 命令的 Ubuntu 镜像。
从此以后,你编写的微服务就可以打包成镜像,推送到公司的私服仓库中。如果新入职的同事来了,可以装个逼,我们公司一切在云端,处处是容器,在容器下进行云原生的开发。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解