Docker集中化web界面管理平台shipyard

Shipyard(github)是建立在docker集群管理工具Citadel之上的可以管理容器、主机等资源的web图形化工具。包括core和extension两个版本,core即shipyard主要是把多个 Docker host上的 containers 统一管理(支持跨越多个host),extension即shipyard-extensions添加了应用路由和负载均衡、集中化日志、部署等。 1. 几个概念 engine 一个shipyard管理的docker集群可以包含一个或多个engine(引擎),一个engine就是监听tcp端口的docker daemon。shipyard管理docker daemon、images、containers完全基于Docker API,不需要做其他的修改。另外,shipyard可以对每个engine做资源限制,包括CPU和内存;因为TCP监听相比Unix socket方式会有一定的安全隐患,所以shipyard还支持通过SSL证书与docker后台进程安全通信。 rethinkdb RethinkDB是一个shipyard项目的一个docker镜像,用来存放账号(account)、引擎(engine)、服务密钥(service key)、扩展元数据(extension metadata)等信息,但不会存储任何有关容器或镜像的内容。一般会启动一个shipyard/rethinkdb容器shipyard-rethinkdb-data来使用它的/data作为数据卷供另外rethinkdb一个挂载,专门用于数据存储。 2. 搭建过程 修改tcp监听 Shipyard 要管理和控制 Docker host 的话需要先修改 Docker host 上的默认配置使其监听tcp端口(可以继续保持Unix socket)。有以下2种方式 sudo docker -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -d 启动docker daemon。如果为了避免每次启动都写这么长的命令,可以直接在/etc/init/docker.conf中修改。 修改/etc/default/docker的DOCKER_OPTS DOCKER_OPTS="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock"。这种方式在我docker version 1.4.1 in ubuntu 14.04上并没有生效。 重启服务 $ sudo docker -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -d 验证 $ netstat -ant |grep 4243 tcp6 0 0 :::4243 :::* LISTEN 启动rethinkdb shipyard(基于Python/Django)在v1版本时安装过程比较复杂,既可以通过在host上安装,也可以部署shipyard镜像(包括shipyard-agent、shipyard-deploy等组件)。v2版本简化了安装过程,启动两个镜像就完成:...

December 29, 2014 · admin

【转+改】Docker核心技术预览

本文简单介绍docker使用到的部分核心技术,但不做深入探究,因为每一个技术都是一个独立的项目,有机会再分别详细介绍。 来源地址:http://www.infoq.com/cn/articles/docker-core-technology-preview Linux Namespace (实例隔离)## The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. 每个用户实例之间相互隔离,互不影响。一般的硬件虚拟化方法给出的方法是VM,而LXC给出的方法是container,更细一点讲就是kernel namespace。其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS(“UNIX Time-sharing System”)和用户空间隔离开。 pid namespace 不同用户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现 Docker in Docker。 ** net namespace ** 有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net namespace实现的, 每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。LXC在此基础上有5种网络类型,docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge—docker0连接在一起。...

December 18, 2014 · admin

Docker简介

1. docker是什么 Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere. Docker是 PaaS 提供商dotCloud开源的一个基于 LXC 的高级容器引擎, 源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker近期非常火热,无论是从 GitHub 上的代码活跃度,还是Redhat宣布在RHEL7中正式支持Docker,都给业界一个信号,这是一项创新型的技术解决方案。就连 Google 公司的 Compute Engine 也支持 docker 在其之上运行,国内“BAT”先锋企业百度Baidu App Engine(BAE)平台也是以Docker作为其PaaS云基础。 Docker产生的目的就是为了解决以下问题: 环境管理复杂:从各种OS到各种中间件再到各种App,一款产品能够成功发布,作为开发者需要关心的东西太多,且难于管理,这个问题在软件行业中普遍存在并需要直接面对。Docker可以简化部署多种应用实例工作,比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个Image部署。 云计算时代的到来:AWS的成功,引导开发者将应用转移到云上, 解决了硬件管理的问题,然而软件配置和管理相关的问题依然存在 (AWS cloudformation是这个方向的业界标准, 样例模板可参考这里)。Docker的出现正好能帮助软件开发者开阔思路,尝试新的软件管理方法来解决这个问题。 虚拟化手段的变化:云时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需分配的资源需求以及保证可用性和隔离性。然而无论是KVM还是Xen,在 Docker 看来都在浪费资源,因为用户需要的是高效运行环境而非OS,GuestOS既浪费资源又难于管理,更加轻量级的LXC更加灵活和快速。 LXC的便携性:LXC在 Linux 2.6 的 Kernel 里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可便携性,决定其构建出的环境难于分发和标准化管理(相对于KVM之类image和snapshot的概念)。Docker就在这个问题上做出了实质性的创新方法。 Docker的主要特性如下: 文件系统隔离:每个进程容器运行在完全独立的根文件系统里。 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。 2. 比较 2....

December 18, 2014 · admin

Linux下同步工具inotify+rsync使用详解

1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。 运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。Rsync可以搭配ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。 基本特点: 可以镜像保存整个目录树和文件系统; 可以很容易做到保持原来文件的权限、时间、软硬链接等; 无须特殊权限即可安装; 优化的流程,文件传输效率高; 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接; 支持匿名传输。 命令语法: rsync的命令格式可以为以下六种: rsync [OPTION]… SRC DEST rsync [OPTION]… SRC [USER@]HOST:DEST rsync [OPTION]… [USER@]HOST:SRC DEST rsync [OPTION]… [USER@]HOST::SRC DEST rsync [OPTION]… SRC [USER@]HOST::DEST rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST] 对应于以上六种命令格式,我们可以总结rsync有2种不同的工作模式: shell模式:使用远程shell程序(如ssh或rsh)进行连接。当源路径或目的路径的主机名后面包含一个冒号分隔符时使用这种模式,rsync安装完成后就可以直接使用了,无所谓启动。(目前没有尝试过这个方法) daemon模式:使用TCP直接连接rsync daemon。当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时使用这种模式,无需远程shell,但必须在一台机器上启动rsync daemon,默认端口873,这里可以通过rsync --daemon使用独立进程的方式,或者通过xinetd超级进程来管理rsync后台进程。 当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口,或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日志和lock file的权限。当rsync以daemon模式运行时,它还需要一个配置文件——rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。 我们一般把DEST远程服务器端成为rsync Server,运行rsync命令的一端SRC称为Client。 安装: rsync在CentOS6上默认已经安装,如果没有则可以使用yum install rsync -y,服务端和客户端是同一个安装包。 # rsync -h 1.2 同步测试 关于rsync命令的诸多选项说明,见另外一篇文章rsync与inotifywait命令和配置选项说明。 1.2.1 本机文件夹同步 # rsync -auvrtzopgP --progress /root/ /tmp/rsync_bak/ 会看到从/root/传输文件到/tmp/rsync_bak/的列表和速率,再运行一次会看到sending incremental file list下没有复制的内容,可以在/root/下touch某一个文件再运行看到只同步了修改过的文件。...

December 12, 2014 · admin

tar命令高级用法——备份数据

Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件和目录备份到磁带中,然后从磁带中提取或恢复文件。现在我们可以使用tar来备份数据到任何存储介质上。它是文件级备份,不必考虑底层文件系统类别,并且支持增量备份。 1. 部分常用选项 -z, --gzip:使用gzip工具(解)压缩,后缀一般为.gz -c, --create:tar打包,后缀一般为.tar -f, --file=:后面立刻接打包或压缩后得到的文件名 -x, --extract:解包命令,与-c对应 -p:保留备份数据的原本权限和属性 -g:后接增量备份的快照文件 -C:指定解压缩的目录 --exclude:排除不打包的目录或文件,支持正则匹配 其他 -X, --exclude-from:在一个文件中列出要排除的目录或文件(在--exclude=较多时使用) -t, --list:列出备份档案中的文件列表,不与-c、-x同时出现 -j, --bzip2:使用bzip2工具(解)压缩,后缀一般为.bz2 -P:保留绝对路径,解压时同样会自动解压到绝对路径下 -v:(解)压缩过程显示文件处理过程,常用但不建议对大型文件使用 2. 增量备份(网站)数据 许多系统(应用或网站)每天都有静态文件产生,对于一些比较重要的静态文件如果有进行定期备份的需求,就可以通过tar打包压缩备份到指定的地方,特别是对一些总文件比较大比较多的情况,还可以利用-g选项来做增量备份。 备份的目录最好使用相对路径,也就是进入到需要备份的根目录下 具体示例方法如下。 备份当前目录下的所有文件 # tar -g /tmp/snapshot_data.snap -zcpf /tmp/data01.tar.gz . 在需要恢复的目录下解压恢复 # tar -zxpf /tmp/data01.tar.gz -C . -g选项可以理解备份时给目录文件做一个快照,记录权限和属性等信息,第一次备份时/tmp/snapshot_data.snap不存在,会新建一个并做完全备份。当目录下的文件有修改后,再次执行第一条备份命令(记得修改后面的档案文件名),会自动根据-g指定的快照文件,增量备份修改过的文件,包括权限和属性,没有动过的文件不会重复备份。 另外需要注意上面的恢复,是“保留恢复”,即存在相同文件名的文件会被覆盖,而原目录下已存在(但备份档案里没有)的,会依然保留。所以如果你想完全恢复到与备份文件一模一样,需要清空原目录。如果有增量备份档案,则还需要使用同样的方式分别解压这些档案,而且要注意顺序。 下面演示一个比较综合的例子,要求: 备份/tmp/data目录,但cache目录以及临时文件排除在外 由于目录比较大(>4G),所以全备时分割备份的档案(如每个备份档案文件最大1G) 保留所有文件的权限和属性,如用户组和读写权限 # cd /tmp/data 做一次完全备份 # rm -f /tmp/snapshot_data.snap # tar -g /tmp/snapshot_data.snap -zcpf - --exclude=./cache ./ | split -b 1024M - /tmp/bak_data$(date -I)....

December 8, 2014 · admin

MySQL备份命令mysqldump参数说明与示例

1. 语法选项说明 -h, --host=name 主机名 -P[ port_num], --port=port_num 用于连接MySQL服务器的的TCP/IP端口号 --master-data 这个选项可以把binlog的位置和文件名添加到输出中,如果等于1,将会打印成一个CHANGE MASTER命令;如果等于2,会加上注释前缀。并且这个选项会自动打开--lock-all-tables,除非同时设置了--single-transaction(这种情况下,全局读锁只会在开始dump的时候加上一小段时间,不要忘了阅读--single-transaction的部分)。在任何情况下,所有日志中的操作都会发生在导出的准确时刻。这个选项会自动关闭--lock-tables。 -x, --lock-all-tables 锁定所有库中所有的表。这是通过在整个dump的过程中持有全局读锁来实现的。会自动关闭--single-transaction和--lock-tables。 --single-transaction 通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作;其他引擎不能保证导出是一致的。当导出开启了--single-transaction选项时,要确保导出文件有效(正确的表数据和二进制日志位置),就要保证没有其他连接会执行如下语句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,这会导致一致性快照失效。这个选项开启后会自动关闭--lock-tables。 -l, --lock-tables 对所有表加读锁。(默认是打开的,用--skip-lock-tables来关闭,上面的选项会把关闭-l选项) -F, --flush-logs 在开始导出前刷新服务器的日志文件。注意,如果你一次性导出很多数据库(使用 -databases=或--all-databases选项),导出每个库时都会触发日志刷新。例外是当使用了--lock-all-tables或--master-data时:日志只会被刷新一次,那个时候所有表都会被锁住。所以如果你希望你的导出和日志刷新发生在同一个确定的时刻,你需要使用--lock-all-tables,或者--master-data配合--flush-logs。 --delete-master-logs 备份完成后删除主库上的日志。这个选项会自动打开``–master-data`。 --opt 同-add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys。(默认已开启,--skip-opt关闭表示这些选项保持它的默认值)应该给你为读入一个MySQL服务器的尽可能最快的导出,--compact差不多是禁用上面的选项。 -q, --quick 不缓冲查询,直接导出至stdout。(默认打开,用--skip-quick来关闭)该选项用于转储大的表。 --set-charset 将SET NAMES default_character_set加到输出中。该选项默认启用。要想禁用SET NAMES语句,使用--skip-set-charset。 --add-drop-tables 在每个CREATE TABLE语句前添加DROP TABLE语句。默认开启。 --add-locks 在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。默认开启。 --create-option 在CREATE TABLE语句中包括所有MySQL表选项。默认开启,使用--skip-create-options来关闭。 -e, --extended-insert 使用全新多行INSERT语法,默认开启(给出更紧缩并且更快的插入语句) -d, --no-data 不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的。 --add-drop-database 在create数据库之前先DROP DATABASE,默认关闭,所以一般在导入时需要保证数据库已存在。...

December 5, 2014 · admin

MySQL增量备份与恢复实例

小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了mysql的binlog日志。 本次操作的MySQL版本为5.5.40 for Linux (x86_64)。 增量备份要确保打开了二进制日志,参考mysql的日志系统: mysql> show variables like '%log_bin%'; 首先对pak数据库做一个完整备份: $ mysqldump -h localhost -upak -ppwd -P3306 --master-data=2 --single-transaction --opt pak > pak_bak_full.sql 这时候就会得到一个全备文件pak_bak_full.sql。mysqldump操作会导致滚动一次log,假设新的binlog文件是mysql-bin.000002。 1. 模拟插入数据和误操作 a. 在pak库的某个表插入一些数据,然后执行flush logs命令。这时将会产生一个新的二进制日志文件mysql-bin.000003,mysql-bin.000002则保存了全备过后的所有更改,既增加记录的操作也保存在了mysql-bin.00002中。 b. 再在pak库中的t_user表中增加两条记录,然后误删除t_user表。t_user中增加记录的操作和删除表的操作都记录在mysql-bin.000003中。 2. 开始恢复 恢复过程不要记录日志: mysql > set global sql_log_bin=0; 3. 首先导入全备数据 $ mysql -h localhost -upak -ppwd < pak_bak_full.sql 或 mysql> source /path/backup/pak_bak_full.sql 我们也可以看到全备时的binlog位置: head -50 backup-file.sql |grep 'CHANGE MASTER' -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4321; 查看当前所在二进制日志中的位置: mysql> show master status; 根据上面两个position能大概确定需要完整恢复哪几个binlog文件。...

December 5, 2014 · admin

Oracle单实例安装环境一键配置脚本(CentOS6 + 11gR2 )

这是自己曾经写的一个oracle 11gR2在CentOS6 x86_64服务器上,一键配置安装环境的脚本,能快速完成安装前环境的配置。 具体完成以下工作: 备份系统配置文件,以防出错 添加oracle用户和用户组 创建安装目录 关闭selinux 在.bash_profile中修改环境变量 修改sysctl.conf文件 修改limits.conf文件 修改PAM的login文件 安装必要的依赖包 使用注意事项: root的用户执行,chmod +x oraclePreInstCheck.sh ./oraclePreInstCheck.sh运行后,请仔细阅读说明,再决定是否使用该脚本 该脚本默认参数适用于2核4G内存的环境,你可以根据需要修改kernelset()部分 执行完后,你检查一下你的安装目录及权限(默认/db/oracle) 该脚本会有提示输入的地方,请不要挑战它的健壮性,比如输入安装根目录时,不要带入空格 脚本只需执行一次,修改系统参数如sysctl.conf之前,都有备份成xxx.ora_bak 请确保可以通过yum方式安装软件包(使用挂载DVD镜像或联网) 建议结合tee将执行过程记录在日志文件中,./oraclePreInstCheck.sh | tee oraclePreInstCheck.log oraclePreInstCheck.sh: #!/bin/bash # author zhouxiao # date 2014-03-07 # description oracle 11g R2 for linux 6.0+ x86_64 安装辅助脚本 #定义常量 SYSCTL=/etc/sysctl.conf LIMITS=/etc/security/limits.conf PAM=/etc/pam.d/login PROFILE=/etc/profile BASH_PROFILE=/home/oracle/.bash_profile #循环变量 i=1 #定义显示颜色 #颜色定义 信息(33黄色) 警示(31红色) 过程(36浅蓝) usage() { echo "Scripts: initialize the required env settings for Oracle 11gR2 installation on Linux 6....

December 2, 2014 · admin

关于研究生的一点担忧

最近有个在大学玩的比较好现在在读研的同学,来询问我一些如何给老师做精品课程在线测试系统的问题,从沟通中我忍不住从个人的角度来表达一下感想和担忧。 首先从我接收到的信息来看,高校导师为了给自己擅长的课程评选上学校、市级或省级精品课程,急于完成一个展示成果的平台,只要能在最短的时间内提交所能看的见的成果,那就表明有效率和实力。所以这个在线测试系统只需要能够展示一个页面,页面上有单项、多选题,提交测试后直接显示对错和总分,无需记录测试者姓名等其他任何与试题无关的信息,也就是没有数据库。差不多就是一个静态页面了,对错的判断,包括答案都固定在代码里面了。我相信稍微了解IT软件开发的人都知道,这样的系统设计可以让人感到无语,当然还有很多不是计算机类专业的,可能看不懂这些,只关心最终实现的效果达到预期就行。偏偏导师和所交予任务的学生,都不懂设计和编程。所以当我说至少应该有个数据库时,“太麻烦,不懂,周期太长”。由于是出于帮忙的目的,也就没有说太多的话来打击他的积极性,说多了反而有点表现自己有多牛B的嫌疑,就硬着头皮做了个demo。 由此可见大学老师为评上精品课程,那种急功近利的心理,只要对外宣传“我们有一个在线测评系统来检验学生学习效果,blablabla…”,然后评选小组比对评选规则里面有“在线测评”,加分!但请问像上面那样的系统意义何在?老师不知道有谁做过测试,不知道分数,只知道“当前浏览xxx次”,学生完全取决于是否主动。我想如果老师把这个测评当做一个硬性要求或作为所熟知却非常神秘的“平时成绩”的一部分,那只能是通过某种方式提交测试截图了。我心还想,在线测评系统一次性完成上线,是不是就再也不会修改了,加题减题,都要大动干戈的去修改后台代码,丝毫没有规划以后的扩展,当然也许我想多了,因为“这就是很简单的一个测试系统”,嗯,都说是测试而不是正式环境了,认真你就输了。 这里做个小插曲。我们生活的环境,充斥着太多的指标、太多的名声。想起上周在我司门口早上卖炸酱面的摊贩被城管执法包围那件事。每天早上这位大叔家的炸酱面是附近最好吃的,每天都排着很长的队,如果不赶时间我和同事们都会优先选择这家。大家都生活不易,城管也是,起早贪黑,四处蹲点追赶流动摊贩,因为没有业绩没有完成指标,如何回去交差。又想起电视里报道过某地的交警每月要达到罚款20万的指标,这说多了其实就是社会问题了,我们这些小众市民除了旁观,祈祷不要发生在我们身上,还能做些什么呢。指标本应该是一个积极充满正能量的、督促机构上进的一个目标,但是如果是为了充数而不择手段去实现,急功近利,那就变质了。 就在线测评问题来说,个人觉得比较合适的做法,应该是要具有一个长远的观念,为何学校不统一做一个在线测评系统,其他各个课程申请账号,获得出题的资格,自由的在后台添加题目,是否需要记录分数和姓名,老师还可以统计对比各班的情况,甚至在评上精品课程以后,作为进一步考核的数据来源,一次投入,无限产出。相比每门课程做重复低效的工作,一眼就可以看出利弊了。导师舍不得花钱请廉价的学生开发一个拿得出手的系统,只能让手下的研究生“自己看着办”。 另外一方面是我对研究生所表现出来的担忧,是关于学习方法和学习能力。研究生最后毕业靠的是一纸论文,我相信会有高水平有独立见解的论文,但大部分论文“借鉴”的成分会不会太高呢?我们原创性的东西太少了,习惯捡现成的东西,包括我自己也是,写一份配置文档需要google许多文章,然后东抄西拆,拼接起来,但至少它都是实践有效了,对于我个人来说具有较大的参考价值。然而在大学里养成了这样的习惯,就会慢慢的丧失学习能力,遇见要解决一个全新的问题,第一反应不是自己去网上检索,而是找到会的直接问“这个怎么做?”。我该如何回答是好呢? 提问也是有智慧的,问得太宽泛,需要与回答者反复沟通来确认具体的问题,才给出什么样的答案。依然是最初的例子,同学使用ASP.NET来做一个在线测试系统,但他完全不懂编程,于是就问了我“有哪些方法,要准备啥”(还好不是宽泛的问“要怎么做”),我告诉他一些流程性的东西,要基本会一些什么,但他说他是小白,编程基础几乎为零。还是为了快速拿出成果,于是我就违心的打开了2年没有点开竟然没有卸载的Visual Studio 2010,一边搜索,一边拖拉控件,许多基本知识都忘了,做了个及其简陋的demo,拙劣的后台代码自己都不忍直视。我一直不承认自己是个程序猿,实际上也不是,但依然偶尔会兼职一下。很难说我是不是把自己同学给害了,没害是这种可快速复制、完成任务的技能已经学会了,毕竟这一次之后他再也不必学习编程,害他是我把现成的东西给他了。其实任何一本书、任何一篇博客教程都可以自己琢磨快速搞定,而不是一出现问题“表格怎么做”、“图片怎么查”,我真就回了一句“ 搜索关键字 ‘html 表格’、‘asp.net 插入图片’ ”,当然一部分原因是当时忙,没有时间手把手教。 遇到问题,自己查阅资料,自己去理解,练习独立的去面对、解决问题,琢磨不明白的再去问,这样也不会浪费对方太多时间。当然简单一句话的能搞定的问题,也没必要说让提问者去走冤枉路,大概就是这个“度”的问题区分了人与人之间的差距和性格吧,无所谓绝对的对错。 写这么多,有点不自量力了,额,请看到的同学不要对号入座,没有任何针对性和攻击性。

November 30, 2014 · admin

Dockerfile指令详解

Docker可以从Dockerfile中一步一步的读取指令来自动的创建镜像,常使用Dockerfile来创建用户自定义的镜像。格式如下: # Comment INSTRUCTION arguments 虽然前面的指令大小写不敏感,但习惯性的还是建议大写。docker是严格按照顺序(#注释起来的忽略)运行指令的。 下面逐个来介绍几个必要的指令。 FROM FROM <image> 或 FROM <image>:<tag> 在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,<image>首选本地是否存在,如果不存在则会从公共仓库下载(当然也可以使用私有仓库的格式)。 RUN RUN <commnad> 或 RUN ["executable", "param1", "param2"] RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到。 上面看到RUN后的格式有两种写法。 shell格式,相当于执行/bin/sh -c "<command>": RUN apt-get install vim -y exec格式,不会触发shell,所以$HOME这样的环境变量无法使用,但它可以在没有bash的镜像中执行,而且可以避免错误的解析命令字符串: RUN ["apt-get", "install", "vim", "-y"] 或 RUN ["/bin/bash", "-c", "apt-get install vim -y"] 与shell风格相同 ENTRYPOINT ENTRYPOINT命令设置在容器启动时执行命令,如果有多个ENTRYPOINT指令,那只有最后一个生效。有以下两种命令格式: ENTRYPOINT ["executable", "param1", "param2"] 数组/exec格式,推荐 或 ENTRYPOINT command param1 param2 shell格式 比如: docker run -i -t --rm -p 80:80 nginx 使用exec格式,在docker run <image>的所有参数,都会追加到ENTRYPOINT之后,并且会覆盖CMD所指定的参数(如果有的话)。当然可以在run时使用--entrypoint来覆盖ENTRYPOINT指令。 使用shell格式,ENTRYPOINT相当于执行/bin/sh -c <command....

November 17, 2014 · admin