osquery -Facebook开源的一款基于SQL的操作系统检测和监控框架

官网:https://osquery.io/

osquery是一款面向OSX和Linux的操作系统检测框架。它将操作系统暴露为一个高性能的关系型数据库,允许用户编写SQL查询查看操作系统数据。在osquery中,SQL表代表像下面这样的抽象概念:

  • 正在运行的进程
  • 已加载的内核模块
  • 打开的网络连接

osqueryi是osquery中的交互式查询控制台。通过它,用户可以执行像下面这样的语句,从SQL表中获取操作系统中正在监听所有端口的进程的pid、名称和端口:

osquery> SELECT DISTINCT
    ...>   process.name,
    ...>   listening.port,
    ...>   process.pid
    ...> FROM processes AS process
    ...> JOIN listening_ports AS listening
    ...> ON process.pid = listening.pid
...> WHERE listening.address = '0.0.0.0';

osquery中已经存在许多表,用户可以在osquery命令行中使用“.table”命令列出所有表,而且还可以根据需要创建新表。有了这些表,用户可以:

  • 根据需要执行查询以查看操作系统的状态
  • 通过调度器执行查询以监控分布式主机操作系统
  • 使用osquery API从自定义应用程序中发起查询

除了上文提及的特性及易于安装外,osquery还具有如下特性:

osqueryd——这是osquery中的一个分布式主机监控守护进程,它性能高,内存占用小,允许用户在整个基础设施上执行查询。
跨平台——虽然osquery利用了非常底层的操作系统API,但它允许用户在Ubuntu、Cent OS和Mac OS X上构建并使用它。
详细的内部部署文档
此外,osquery代码库是由高性能的模块化组件构成,并且其公共API有清楚的文档记录。这些组件可以组合出新的、有趣的应用程序和工具。

安装以后可以使用sql语法去查询系统的信息,感觉以后可能会用的到,备份一下

phpstorm 配置

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_0">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_1">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_2">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<h1 id="toc_3">phpstorm 配置</h1>

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_4">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_5">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_6">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<p>View菜单<br/>
<br/>
</p>

<p>window菜单<br/>
</p>

<p>运行配置<br/>
</p>

phpstorm配置.zip

幕布 - 树形层级结构的跨平台笔记软件 (一键制作思维导图 / Outline 大纲总结工具)

可能很多人在做一件大项目时可能都有这样一种体会:我们花了很多时间去记笔记、写总结,但零散的笔记到头来反而让思绪更凌乱,事情似乎越做越复杂。

很多高效人士在用笔记应用时,他们都擅长用「层级缩进」的方式来记录,整理出一个树形的结构化内容,其实他们掌握的是一种思维方式。但事实上,很难让每个人靠自己来形成这样的思维。「幕布」是一款效仿 Workflowy 而来的 Outline (大纲) 形式的笔记软件,它将「思维概要整理」的方式标准化,弥补了传统笔记对整理和记录结构化内容的不足……

「更新:幕布 iOS / Android / Win / Mac 版客户端均已全线发布」


相对于大多数笔记类软件或者思维导图软件如 XMind 等,「幕布」更注重于记录内容的逻辑结构,让你学会结构化思维方式记录笔记和分析事务,概括性整理,带来的好处就是让内容印象更深刻,思路更清晰,让复杂事物变得简单。


幕布允许你通过无限的树形结构来组织和记录内容,可以让你的笔记更有条理,如下图,这是幕布以层级结构记录内容的样式,不仅能很好地给事务、项目做总结,而且 Outline 大纲结构也很适合用于长篇写作等用途。

请输入图片描述

官方地址:点击注册【送15天高级版体验】

觉得挺好用的,迅速制作思维导图的利器。所有就分享了出来。

Mongodb 新版配置文件详解

mongod.conf

$ vi /etc/mongod.conf

手册

https://docs.mongodb.com/manual/reference/configuration-options
https://docs.mongodb.com/manual/reference/parameters/

进程管理

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
名称 说明
fork 运行在后台
pidFilePath PID文件路径

网络

net:
  port: 27017
  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
名称 说明
port 端口
bindIp 绑定外网op 多个用逗号分隔
maxIncomingConnections 进程允许的最大连接数 默认值为65536
wireObjectCheck 当客户端写入数据时 检测数据的有效性(BSON) 默认值为true
ipv6 默认值为false

存储

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:
名称 说明
dbPath mongod进程存储数据目录,此配置仅对mongod进程有效
indexBuildRetry 当构建索引时mongod意外关闭,那么再次启动是否重新构建索引;索引构建失败,mongod重启后将会删除尚未完成的索引,但是否重建由此参数决定。默认值为true。
repairPath 配合--repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效。不建议在配置文件中配置,而是使用mongod启动命令指定。
engine 存储引擎类型,mongodb 3.0之后支持“mmapv1”、“wiredTiger”两种引擎,默认值为“mmapv1”;官方宣称wiredTiger引擎更加优秀。
journal 是否开启journal日志持久存储,journal日志用来数据恢复,是mongod最基础的特性,通常用于故障恢复。64位系统默认为true,32位默认为false,建议开启,仅对mongod进程有效。
directoryPerDB 是否将不同DB的数据存储在不同的目录中 默认值为false
syncPeriodSecs mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60(单位:秒)强烈建议不要修改此值 mongod将变更的数据写入journal后再写入内存,并间歇性的将内存数据flush到磁盘中,即延迟写入磁盘,有效提升磁盘效率
mmapv1 仅对MMAPV1引擎
quota:
enforced:false 配额管理,是否限制每个DB所能持有的最大文件数量 默认值为false
maxFilesPerDB:8 如果enforce开启,每个DB所持有的存储文件不会超过此阀值
smallFiles: false 是否使用小文件存储数据;如果此值为true mongod将会限定每个数据文件的大小为512M(默认最大为2G),journal降低到128M(默认为1G)。如果DB的数据量较大,将会导致每个DB创建大量的小文件,这对性能有一定的影响。在production环境下,不建议修改此值,在测试时可以设置为true,节约磁盘。
journal:
commitIntervalMs: 100 mongod进程提交journal日志的时间间隔,即fsync的间隔。单位:毫秒
nsSize: 每个database的namespace文件的大小,默认为16,单位:M;最大值可以设置为2048,即dbpath下“.ns”后缀文件的大小。16M基本上可以保存24000条命名条目,新建一个collection或者index信息,即会增加一个namespace条目;如果你的database下需要创建大量的collection(比如数据分析),则可以适度调大此值。
wiredTiger 如下配置仅对wiredTiger引擎生效(3.0以上版本)
engineConfig:
cacheSizeGB: 8 wiredTiger缓存工作集(working set)数据的内存大小,单位:GB,此值决定了wiredTiger与mmapv1的内存模型不同,它可以限制mongod对内存的使用量,而mmapv1则不能(依赖于系统级的mmap)。默认情况下,cacheSizeGB的值为假定当前节点只部署一个mongod实例,此值的大小为物理内存的一半;如果当前节点部署了多个mongod进程,那么需要合理配置此值。如果mongod部署在虚拟容器中(比如,lxc,cgroups,Docker)等,它将不能使用整个系统的物理内存,则需要适当调整此值。默认值为物理内存的一半。
journalCompressor: snappy journal日志的压缩算法,可选值为“none”、“snappy”、“zlib”。
directoryForIndexes: false 是否将索引和collections数据分别存储在dbPath单独的目录中。即index数据保存“index”子目录,collections数据保存在“collection”子目录。默认值为false,仅对mongod有效。
collectionConfig:
blockCompressor: snappy collection数据压缩算法,可选值“none”、“snappy”、“zlib”。开发者在创建collection时可以指定值,以覆盖此配置项。如果mongod中已经存在数据,修改此值不会带来问题,旧数据仍然使用原来的算法解压,新数据文件将会采用新的解压缩算法。
indexConfig:
prefixCompression: true 是否对索引数据使用“前缀压缩”(prefix compression,一种算法)。前缀压缩,对那些经过排序的值存储,有很大帮助,可以有效的减少索引数据的内存使用量。默认值为true。

性能分析器

operationProfiling:
名称 说明
slowOpThresholdMs: 100 数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒;mongod将会把慢查询记录到日志中,即使profiler被关闭。当profiler开启时,慢查询记录还会被写入“system.profile”这个系统级的collection中。请参看mongod profiler相关文档。默认值为100,此值只对mongod进程有效。
mode: off 数据库profiler级别,操作的性能信息将会被写入日志文件中,可选值:
1)off:关闭profiling
2)slowOp:on,只包含慢操作日志
3)all:on,记录所有操作
数据库profiling会影响性能,建议只在性能调试阶段开启。此参数仅对mongod有效。

主从复制

replication:
名称 说明
oplogSizeMB: 10240 replication操作日志的最大尺寸,单位:MB。mongod进程根据磁盘最大可用空间来创建oplog,比如64位系统,oplog为磁盘可用空间的5%,一旦mongod创建了oplog文件,此后再次修改oplogSizeMB将不会生效。此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;如果太小,secondary将不能通过oplog来同步数据,只能全量同步。
enableMajorityReadConcern: false 是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本)
replSetName: <无默认值> “复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName
secondaryIndexPrefetch: all 只对mmapv1存储引擎有效。复制集中的secondary,从oplog中运用变更操作之前,将会先把索引加载到内存中,默认情况下,secondaries首先将操作相关的索引加载到内存,然后再根据oplog应用操作。可选值:
1)none:secondaries不将索引数据加载到内容
2)all:sencondaries将此操作有关的索引数据加载到内存
3)_id_only:只加载_id索引
默认值为:all,此配置仅对mongod有效。
localPingThresholdMs: 15 ping时间,单位:毫秒,mongos用来判定将客户端read请求发给哪个secondary。仅对mongos有效。默认值为15,和客户端driver中的默认值一样。当mongos接收到客户端read请求,它将:
1、找出复制集中ping值最小的member。
2、将延迟值被此值允许的members,构建一个列表
3、从列表中随机选择一个member。
ping值是动态值,每10秒计算一次。mongos将客户端请求转发给延迟较小(与此值相比)的某个secondary节点。

sharding架构

sharding:
名称 说明
clusterRole: <无默认值> 在sharding集群中,此mongod实例的角色,可选值:
1、configsvr:此实例为config server,此实例默认侦听27019端口
2、shardsvr:此实例为shard(分片),侦听27018端口
此配置仅对mongod有效。通常config server和sharding server需要使用各自的配置文件。
archiveMovedChunks: true 当chunks因为“负载平衡”而迁移到其他节点时,mongod是否将这些chunks归档,并保存在dbPath下“moveChunk”目录下,mongod不会删除moveChunk下的文件。默认为true。
autoSplit: true 是否开启sharded collections的自动分裂,仅对mongos有效。如果所有的mongos都设定为false,那么collections数据增长但不能分裂成新的chunks。因为集群中任何一个mongos进程都可以触发split,所以此值需要在所有mongos行保持一致。仅对mongos有效。
configDB: <无默认值> 设定config server的地址列表,每个server地址之间以“,”分割,通常sharded集群中指定1或者3个config server。(生产环境,通常是3个config server,但1个也是可以的)。所有的mongos实例必须配置一样,否则可能带来不必要的问题。
chunkSize: 64 sharded集群中每个chunk的大小,单位:MB,默认为64,此值对于绝大多数应用而言都是比较理想的。chunkSize太大会导致分布不均,太小会导致分裂成大量的chunk而经常移动. 整个sharding集群中,此值需要保持一致,集群启动后修改此值将不再生效。

系统日志

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
名称 说明
verbosity: 0 日志级别,0:默认值,包含“info”信息,1~5,即大于0的值均会包含debug信息
quiet: true "安静",此时mongod/mongos将会尝试减少日志的输出量。不建议在production环境下开启,否则将会导致跟踪错误比较困难。
traceAllExceptions: true 打印异常详细信息。
path: logs/mongod.log 日志路径
logAppend: false 如果为true,当mongod/mongos重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为false。
logRotate: rename 日志“回转”,防止一个日志文件特别大,则使用logRotate指令将文件“回转”,可选值:
1)rename:重命名日志文件,默认值。
2)reopen:使用linux日志rotate特性,关闭并重新打开此日志文件,可以避免日志丢失,但是logAppend必须为true。
destination: file 日志输出目的地,可以指定为“ file”或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)

与安全有关的配置

security:  
    authorization: enabled  
    clusterAuthMode: keyFile  
    keyFile: /srv/mongodb/keyfile  
    javascriptEnabled: true  
setParameter:   
    enableLocalhostAuthBypass: true  
    authenticationMechanisms: SCRAM-SHA-1
名称 说明
authorization disabled或者enabled,仅对mongod有效;表示是否开启用户访问控制(Access Control),即客户端可以通过用户名和密码认证的方式访问系统的数据,默认为“disabled”,即客户端不需要密码即可访问数据库数据。(限定客户端与mongod、mongos的认证)
clusterAuthMode 集群中members之间的认证模式,可选值为“keyFile”、“sendKeyFile”、“sendX509”、“x509”,对mongod/mongos有效;默认值为“keyFile”,mongodb官方推荐使用x509,不过我个人觉得还是keyFile比较易于学习和使用。不过3.0版本中,mongodb增加了对TLS/SSL的支持,如果可以的话,建议使用SSL相关的配置来认证集群的member,此文将不再介绍。(限定集群中members之间的认证)
keyFile 当clusterAuthMode为“keyFile”时,此参数指定keyfile的位置,mongodb需要有访问此文件的权限。
javascriptEnabled true或者false,默认为true,仅对mongod有效;表示是否关闭server端的javascript功能,就是是否允许mongod上执行javascript脚本,如果为false,那么mapreduce、group命令等将无法使用,因为它们需要在mongod上执行javascript脚本方法。如果你的应用中没有mapreduce等操作的需求,为了安全起见,可以关闭javascript。
setParameter 允许指定一些的Server端参数,这些参数不依赖于存储引擎和交互机制,只是微调系统的运行状态,比如“认证机制”、“线程池参数”等。参见【parameter】
enableLocalhostAuthBypass true或者false,默认为true,对mongod/mongos有效;表示是否开启“localhost exception”,对于sharding cluster而言,我们倾向于在mongos上开启,在shard节点的mongod上关闭。
authenticationMechanisms 认证机制,可选值为“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建议为“SCRAM-SHA-1”,对mongod/mongos有效;一旦选定了认证机制,客户端访问databases时需要与其匹配才能有效。

性能有关的参数

setParameter:  
    connPoolMaxShardedConnsPerHost: 200  
    connPoolMaxConnsPerHost: 200  
    notablescan: 0
名称 说明
connPoolMaxShardedConnsPerHost 默认值为200,对mongod/mongos有效;表示当前mongos或者shard与集群中其他shards链接的链接池的最大容量,此值我们通常不会调整。连接池的容量不会阻止创建新的链接,但是从连接池中获取链接的个数不会超过此值。维护连接池需要一定的开支,保持一个链接也需要占用一定的系统资源。
connPoolMaxConnsPerHost 默认值为200,对mongod/mongos有效;同上,表示mongos或者mongod与其他mongod实例之间的连接池的容量,根据host限定。

配置样例

systemLog:
    quiet: false
    path: /data/mongodb/logs/mongod.log
    logAppend: false
    destination: file
processManagement:
    fork: true
    pidFilePath: /data/mongodb/mongod.pid
net:
    bindIp: 127.0.0.1
    port: 27017
    maxIncomingConnections: 65536
    wireObjectCheck: true
    ipv6: false    
storage:
    dbPath: /data/mongodb/db
    indexBuildRetry: true
    journal:
        enabled: true
    directoryPerDB: false
    engine: mmapv1
    syncPeriodSecs: 60 
    mmapv1:
        quota:
            enforced: false
            maxFilesPerDB: 8
        smallFiles: true    
        journal:
            commitIntervalMs: 100
    wiredTiger:
        engineConfig:
            cacheSizeGB: 8
            journalCompressor: snappy
            directoryForIndexes: false    
        collectionConfig:
            blockCompressor: snappy
        indexConfig:
            prefixCompression: true
operationProfiling:
    slowOpThresholdMs: 100
    mode: off

如果你的架构模式为replication Set,那么还需要在所有的“复制集”members上增加如下配置:

replication:
    oplogSizeMB: 10240
    replSetName: rs0
    secondaryIndexPrefetch: all

如果为sharding Cluster架构,则需要在shard节点增加如下配置:

sharding:
    clusterRole: shardsvr
    archiveMovedChunks: true
systemLog:
    quiet: false
    path: /data/mongodb/logs/mongod.log
    logAppend: false
    destination: file
processManagement:
    fork: true
    pidFilePath: /data/mongodb/mongod.pid
net:
    bindIp: 127.0.0.1
    port: 37017
    maxIncomingConnections: 65536
    wireObjectCheck: true
    ipv6: false    
replication:
    localPingThresholdMs: 15            
sharding:
    autoSplit: true
    configDB: m1.com:27018,m2.com:27018,m3.com:27018
    chunkSize: 64

mongos实例不需要存储实际的数据,对内存有一定的消耗,在sharding架构模式下使用;mongos需接收向客户端请求(后端的sharded和replication set则不需要让客户端知道),它可以将客户端请求转发到一个分片集群上(分片集群基于复制集)延迟相对较小的secondary上,同时还负责chunk的分裂和迁移工作。

repair修复

“修复”数据库,当mongodb运行一段时间之后,特别是经过大量删除、update操作之后,我们可以使用repair指令对数据存储进行“repair”,它将整理、压缩底层数据存储文件,重用磁盘空间,相当于数据重新整理了一遍,对数据优化有一定的作用。

$ ./mongod --dbpath=/data/mongodb/db --repair

mongodump与mongorestore

我们通常会使用到mongodb数据的备份功能,或者将一个备份导入到一个新的mongod实例中(数据冷处理),那么就需要借助这两个指令。

  • 备份
>./mongodump --host m1.com --port 27017 -u root -p pass --out /data/mongodb/backup/dump_2015_10_10
  • 还原
./mongorestore --db mydatabase /data/mongodb/backup/dump_2015_10_10

mongoimport和mongoexport

mongoexport将数据导出为JSON或者CSV格式,以便其他应用程序解析。

mongo shell

1)help:列出所有的function
2)show dbs:展示当前实例中所有的databases。
3)use :切换到指定的db,接下来的操作将会在此db中。
4)show collections:展示出当前db中所有的collections。
5)show users:展示当前db中已经添加的所有用户。
6)show roles:展示当前db中所有内置的或者自定义的用户角色。
7)show profile:这涉及到profile相关的配置,默认情况下展示出最近5个操作耗时超过1秒的操作,通常用于跟踪慢查询。
8)db.help():展示出可以在db上进行的操作function。
9)db..help():展示出可以在colleciton上进行的操作。

DockerFile 编写小记

## DockerFile命令指南

### 格式
Dockerfile 中所有的命令都是以下格式:

```
INSTRUCTION argument
```
指令(INSTRUCTION)不分大小写,但是推荐大写。
### FROM 命令
`FROM `,例如

```
FROM ubuntu
```

所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像;可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。

### MAINTAINER 命令
`MAINTAINER `用于指定镜像创建者和联系方式。
例如

```
MAINTAINER Victor Coisne victor.coisne@dotcloud.com
```
### RUN 命令

```
RUN
```
用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。
### ADD 命令

```
ADD
```

用于从将` `文件复制到` ` 文件:`` 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件 url,` `是容器中的绝对路径。

### CMD 命令
CMD 命令有三种格式:

- CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
- CMD ["param1","param2"]:无可执行程序形式
- CMD command param1 param2:shell 形式。

CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件:不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。

> 一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。

> CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。

> CMD命令会被 Docker 命令行传入的参数覆盖:

> ```
> docker run busybox /bin/echo Hello Docker
> ```
> 会把 CMD 里的命令覆盖。

### ENTRYPOINT 命令
ENTRYPOINT 命令的字面意思是进入点,而功能也恰如其意:他可以让你的容器表现得像一个可执行程序一样。

ENTRYPOINT 命令也有两种格式:

- ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 exec 形式
- ENTRYPOINT command param1 param2 :shell 形式

> 一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

关于 CMD 和 ENTRYPOINT 的联系请看下面的例子
仅仅使用 ENTRYPOINT:

```
FROM ubuntu
ENTRYPOINT ls -l
```
执行 `docker run 306cd7e8408b /etc/fstab `和 `docker run 306cd7e8408b` 结果并不会有什么差别:

```
命令 # docker run 306cd7e8408b /etc/fstab
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:52 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:52 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
……
```
但是我们通常使用 `ENTRYPOINT `作为容器的入口,使用` CMD` 给 `ENTRYPOINT `增加默认选项:

```
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["ls"]
```

然后执行这个容器:
不加参数便会默认有 `-l`参数:

```
命令 # docker run 89dc7e6d0ac1
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:47 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:47 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
drwxr-xr-x 12 root root 4096 Mar 20 05:21 lib
drwxr-xr-x 2 root root 4096 Mar 20 05:20 lib64
drwxr-xr-x 2 root root 4096 Mar 20 05:19 media
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt
drwxr-xr-x 2 root root 4096 Mar 20 05:19 opt
dr-xr-xr-x 386 root root 0 Apr 24 02:47 proc
drwx------ 2 root root 4096 Mar 20 05:22 root
drwxr-xr-x 7 root root 4096 Mar 20 05:21 run
drwxr-xr-x 2 root root 4096 Apr 21 22:18 sbin
drwxr-xr-x 2 root root 4096 Mar 20 05:19 srv
dr-xr-xr-x 13 root root 0 Apr 24 02:47 sys
drwxrwxrwt 2 root root 4096 Mar 20 05:22 tmp
drwxr-xr-x 11 root root 4096 Apr 21 22:18 usr
drwxr-xr-x 12 root root 4096 Apr 21 22:18 var
```

加了`/etc/fstab` 参数便会覆盖原有的 -l 参数:

```
命令 # docker run 89dc7e6d0ac1 /etc/fstab
/etc/fstab
```

### EXPOSE 命令

```
EXPOSE [...]
```
命令用来指定对外开放的端口。
例如 `EXPOSE 80 3306`,开放 80 和 3306 端口。

### WORKDIR命令

```
WORKDIR /path/to/work/dir
```
配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。
可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。

例如:

```
FROM ubuntu
WORKDIR /etc
WORKDIR ..
WORKDIR usr
WORKDIR lib
ENTRYPOINT pwd
```
docker run ID 得到的结果为:`/usr/lib`

### USER命令

```
USER
```
为容器内指定 `CMD`、 `RUN`、 `ENTRYPOINT` 命令运行时的用户名或UID。

### VLOUME 命令

```
VOLUME ['/data']
```
允许容器访问容器的目录、允许容器之间互相访问目录。
`VOLUME` 仅仅是允许将某一个目录暴露在外面,更多的操作还需要依赖 Docker 命令实现。
更多的内容可以参考 [深入理解 Docker Volume(一)](http://dockerone.com/article/128)

### ENV 命令
参考 export 的用法咧:

```
ENV LC_ALL en_US.UTF-8
```

实例
Dockerfile 的写法已经讲述完毕,这儿有一个示例的 Dockerfile:

```
#Dockerfile
FROM centos6-base
#指定centos6系统
MAINTAINER zhou_mfk
#我抄的他的 Dockerfile
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
#创建私钥
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
#修复SSH登录,否则登陆后的用户会被秒退。
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#创建root用户的ssh文件夹
EXPOSE 22
#开放端口
RUN echo 'root:redhat' | chpasswd
#root用户改密码为redhat
RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
RUN yum install tar gzip gcc vim wget screen -y
#安装epel和安装一些软件
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#系统环境变量
CMD ["/usr/sbin/sshd", "-D"]
#启动sshd
#End
```

## docker run
### 语法:

```
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```
### OPTIONS说明:

```
-a, --attach=[] 登录容器(以docker run -d启动的容器)
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d, --detach=false 指定容器运行于前台还是后台
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h, --hostname="" 指定容器的主机名
-i, --interactive=false 打开STDIN,用于控制台交互
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m, --memory="" 指定容器的内存上限
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置,待详述
-P, --publish-all=false 指定容器暴露的端口,待详述
-p, --publish=[] 指定容器暴露的端口,待详述
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="" 指定容器停止后的重启策略,待详述
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t, --tty=false 分配tty设备,该可以支持终端登录
-u, --user="" 指定容器的用户
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w, --workdir="" 指定容器的工作目录
```
详情见:http://blog.csdn.net/one_clouder/article/details/39224767

## docker Build
### 语法:

```
docker build [OPTIONS] PATH | URL | -
```

### OPTIONS说明:

```
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
-q :安静模式,成功后只输出镜像ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
```
## docker commit
### 语法:

```
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
```
### OPTIONS说明:

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