使用bash关联数组统计单词

 

从bash 4开始支持关联数组,使用前需要声明,即

declare -A map
map[key1]=value1
map[key2]=value2
map=([key1]=value1 [key2]=value2)
# 获取keys
keys=${!map[@]}
# 获取values
values=${map[@]}

利用关联数组,很容易实现单词统计,源码文件wordCount.sh

#!/bin/bash
if [[ $# -lt 1 ]]
then
    echo "Usage: $0 <filename>"
    exit 1
fi
file=$1
declare -A count
for word in $(grep -P -o '\b\w+\b' $file)
do
    let count[$word]++
done
for word in ${!count[@]}
do
    printf "%-14s%s\n" $word ${count[$word]}
done

使用方法

./wordCount.sh filename

或者从标准流中使用,如

echo "Hello World! GoodBye World!" | ./wordCount.sh -

输出为

Hello         1
World         2
GoodBye       1
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

制作windows puppet Openstack镜像过程

 

由于电信需要远程部署软件,拟使用puppet进行远程服务管理

前提

  1. windows系统已经安装
  2. windows已经安装virtio driver
  3. 远程桌面开启,最好关闭防火墙

设置MTU

在没有安装cloudinit情况下需要手动配置mtu大小为1454,否则无法上网,仅在使用neutron并且使用gre隧道情况下需要设置。

设置hosts文件

把一些常用的host放到C:/windows/system32/driver/etc/host,尤其是master的,务必设置!!

设置时间同步

agent需要和master保持时间同步,因此需要设置windows更新时间服务器为master

安装win32-dir

需要安装win32-dir 版本大于0.43, 安装方法为管理员start command prompt with puppet, run:

gem install win32-dir

修改puppet facter下的timezone

timezone默认输出中文,会出现编码错误,设置setcode 为英文字符,最好是世界时区标准格式

安装clouinit

下载地址:官网

关机

在这前清空puppet ssl目录,位于C:/programdata,并根据实际情况可以设置puppet.conf 。为了减少磁盘文件大小,最好运行下磁盘 清理,并删除掉一些无用文件。

格式转化

把格式转化,一方面为了合并base image,另一方面也可以起到重新整理磁盘文件,减少文件大小,run:

qemu-img convert -O qcow2 origin.qcow2 new.qcow2

上传镜像

把镜像上传到glance下,记得设置os_type = windows否则,会出现RTC时间问题

启动主机

启动云主机,记得设置os_type = windows, 原因同上!

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

中文版本windows系统安装puppet agent问题

 

1. How to install

windows pupppet只能安装agent,安装过程,在这里. 安装过程比较简单,但在运行agent时会遇到几个问题。

2. Error: Could not run: ”\xB2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE

这是win32-dir库bug,需要升级,使用管理员身份运行start command prompt with puppet,然后运行:

gem install win32-dir
gem list

确保运行gem list后win32-dir版本大于0.4.3。

3. could not intern from pson XXXX

这是由于编码问题造成的,master在获取facter变量时不能有中文(或者保证传输的编码和master一致),运行facter后发现timezone 输出中文。简单的解决办法是,修改facter的timezone,位于

安装路径:C:\Program Files\Puppet Labs\Puppet\facter\lib\facter.

根据实际情况修改setcode值,我是直接硬编码为"UTC+8",或者可以参照世界时区标准记法。

certificate verify failed: [CRL is not yet valid for /CN controller

这是由于agent和master clock不同步造成的,openstack中创建windows云主机时需要指os_type为windows,才能社会之RTC为localtime,否则使用UTC时间,差了8个小时,与master时间对不上。

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

配置spark-streaming读取flume数据

1.依赖配置

由于我们使用sbt构建项目,因此所有依赖库写入build.sbtlibraryDependencies即可,格式 为groupId % artifactId % version,具体字段含义建议参考maven.

我们这次代码除了需要spark-core外,还需要第三方库spark-streaming-flume,因此build.sbt 大致内容为:

name := "FlumeEventCount"

version := "1.0"

scalaVersion := "2.10.4"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0"

libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.4.0"

libraryDependencies += "org.apache.spark" % "spark-streaming-flume_2.10" % "1.4.0"

注意build.sbt行与行之间要有空行,这是语法要求!

2.测试代码

通过调用FlumeUtils.createStream()方法创建flume流,本次测试仅仅统计每次(每隔2秒)获取 的数据行数(事件数),代码为:

package com.huawei.test

import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming._
import org.apache.spark.streaming.flume._
import org.apache.spark.util.IntParam

/**
 *  Produces a count of events received from Flume.
 *
 *  This should be used in conjunction with an AvroSink in Flume. It will start
 *  an Avro server on at the request host:port address and listen for requests.
 *  Your Flume AvroSink should be pointed to this address.
 *
 *  Usage: FlumeEventCount <host> <port>
 *    <host> is the host the Flume receiver will be started on - a receiver
 *           creates a server and listens for flume events.
 *    <port> is the port the Flume receiver will listen on.
 *
 *  To run this example:
 *    `$ bin/run-example org.apache.spark.examples.streaming.FlumeEventCount <host> <port> `
 */
object FlumeEventCount{
  def main(args: Array[String]) {
    if (args.length < 2) {
      System.err.println(
        "Usage: FlumeEventCount <host> <port>")
      System.exit(1)
    }

    val host = args(0)
    val port = args(1).toInt

    val batchInterval = Milliseconds(2000)

    // Create the context and set the batch size
    val sparkConf = new SparkConf().setAppName("FlumeEventCount")
    val ssc = new StreamingContext(sparkConf, batchInterval)

    // Create a flume stream
    val stream = FlumeUtils.createStream(ssc, host, port, StorageLevel.MEMORY_ONLY_SER_2)

    // Print out the count of events received from this server in each batch
    stream.count().map(cnt => "Received " + cnt + " flume events." ).print()

    ssc.start()
    ssc.awaitTermination()
  }
}

3.配置flume

只需要把sink配置成SparkSink即可

agent.sinks = spark
agent.sinks.spark.type = org.apache.spark.streaming.flume.sink.SparkSink
agent.sinks.spark.hostname = <hostname of the local machine>
agent.sinks.spark.port = <port to listen on for connection from Spark>
agent.sinks.spark.channel = memoryChannel

## 4.打包程序

cd $PROJECT_ROOT # PROJECT_ROOT为项目根路径,即build.sbt的位置
ant package

## 5.运行

注意:除了spark-core依赖包会由spark-submit自动引入,其他依赖包比如 spark-streaming-flume必须手动引入:

  • 设置CLASSPATH,把依赖包放入CLASSPATH中
  • 使用--jars参数手动加入

此次测试采用后种方法,即使用--jars参数。这个工程只差spark-streaming-flume包,sbt编译 时已经自动下载到本地,位于~/.ivy2/cache/org.apache.spark/spark-streaming-flume_2.10/jars, 把所有的jar包复制到工程的lib目录下.

cp ~/.ivy2/cache/org.apache.spark/spark-streaming-flume_2.10/jars/*.jar lib

使用spark-submit 提交程序,为了避免每次重复输入命令,写一个脚本用于提交:

#!/bin/sh
spark-submit --master local[*] --class com.huawei.test.FlumeEventCount\
--jars lib/*.jar\
target/scala-2.10/flumeeventcount_2.10-1.0.jar localhost 50000

其中localhost表示flume写入的主机名,50000表示flume写入端口

6.运行结果

当flume有数据流时,程序会捕捉事件,统计每次的事件总数。

6.运行结果

当flume有数据流时,程序会捕捉事件,统计每次的事件总数。

-------------------------------------------
Time: 1436942874000 ms
-------------------------------------------
Received 1345 flume events.

-------------------------------------------
Time: 1436942876000 ms
-------------------------------------------
Received 2132 flume events.

-------------------------------------------
Time: 1436942878000 ms
-------------------------------------------
Received 0 flume events.
 
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

nutch集成solr和中文分词

一、构建nutch环境

1. 设置代理

由于nutch使用ant构建,ant调用ivy,会从maven仓库中下载依赖包,因此若公司需要代理才能上网,需要设置代理,如果公司不需要代理即可上网,此步骤直接省略.

总结设置代理遇到的几个坑:

  • 强制使用系统代理,即 ant -autoproxy , 结果失败!
  • 修改 build.xml , 增加 setproxy ,设置代理,结果失败!
  • 设置 ANT_OPTS ,添加选项
  • -Dhttp.proxyHost=http://proxy.xxx.com
  • -Dhttp.proxyPort=xxx , 结果失败!
  • 传递 http_proxy ,结果失败!

失败原因: proxyHost只需要包括主机名,而不需要指定协议

成功编译为修改build.xml文件,设置代理,内容如下:

<target name="myproxy">
      <setproxy proxyhost="proxy.xxx.com" proxyport="913" />
</target>

并修改ivy-init指令,如下:

<target name="ivy-init" depends="ivy-probe-antlib, ivy-init-antlib,myproxy" description="--> initialise Ivy settings">
    <ivy:settings file="${ivy.dir}/ivysettings.xml" />
</target>

2. 设置hadoop环境

若只是构建单机模式,此步骤省略!

否则需要设置并export HADOOP_HOME环境变量:

export HADOOP_HOME=${HADOOP_HOME:-/opt/hadoop}
echo $HADOOP_HOME

3. nutch配置

在编译之前首先需要配置nutch,每次更新配置文件,都需要重新编译! 配置文件位于$NUTCH_HOME/conf下,务必设置http.agent.name,否则编译后不能运行, 编辑conf/nutch-site.xml, 内容为:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>http.agent.name</name>
        <value>My Spider</value>
    </property>
</configuration>

如果需要设置nutch运行时代理,需要配置代理,修改文件$NUTCH_HOME/conf/nutch-default.xml, 修改http.proxyHosthttp.proxyPort值,内容如下:

<property>
  <name>http.proxy.host</name>
  <value>proxy.xxx.com</value>
  <description>The proxy hostname.  If empty, no proxy is used.</description>
</property>

<property>
  <name>http.proxy.port</name>
  <value>xxx</value>
  <description>The proxy port.</description>
</property>

4.编译构建nutch

在此之前,请确保以上步骤已经正确完成,否则会导致编译失败或者运行失败! 编译:

ant -v runtime

构建开始,大约需要30分钟的时间

二、集成solr

目前solr的版本是5.x,但好像5.x版本差别较大,nutch没有集成支持!因此我们使用当前的4.x版本,目前该版本的latest是4.10.4,点击此处下载.

1.初始化

解压缩,复制example/solr/collection1下的core collection1nutch:

cp -rf collection1 nutch

并修改$SOLR_HOME/example/solr/nutch/core.properties文件,设置name为nutch:

name=nutch

$NUTCH_HOME/conf/schema-solr4.xml复制到$SOLR_HOME/example/solr/nutch/conf下,并重命名为schema.xml:

cp $NUTCH_HOME/conf/schema-solr4.xml  $SOLR_HOME/example/solr/nutch/conf/schema.xml

2. 修改配置

此时启动solr会出现以下错误:

org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: copyField dest :'location' is not an explicit field and doesn't match a dynamicField

应该是配置文件schema.xml的一个bug, 修复办法为在<fields>下增加一个location field, 内容为:

  <field name="location" type="location" stored="false" indexed="true" multiValued="true"/>

若没有_version属性,则增加_version_属性:

<field name="_version_" type="long" indexed="true" stored="true"/>

3. 增加中文分词

首先从google code上下载IKAnalyzer,下载版本为IK Analyzer 2012FF_hf1.zip,如果被GFW, 点击此处下载. 解压缩文件,把IKAnalyzer2012FF_u1.jar文件复制到$SOLR_HOME/example/solr-webapp/webapp/WEB-INF/lib,把IKAnalyzer.cfg.xml和stopword.dic复制到$SOLR_HOME/example/solr/nutch/conf,与schema.xml一个目录下:

cp IKAnalyzer2012FF_u1.jar $SOLR_HOME/example/solr-webapp/webapp/WEB-INF/lib
cp IKAnalyzer.cfg.xml stopword.dic $SOLR_HOME/example/solr/nutch/conf

修改core的schema.xml,在配置项间加一段如下配置:

<fieldType name="text_cn" class="solr.TextField">   
     <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
</fieldType>

在这个core的schema.xml里面配置field类型的时候就可以使用text_cn

<field name="name"      type="text_cn"   indexed="true"  stored="true"  multiValued="true" /> 

启动solr服务

cd $SOLR_HOME/example
java -jar start.jar

浏览器访问http://172.16.182.23:8983/solr/#/nutch,在左下边点击Analysis连接,选择Analyse Fieldname / FieldTypetext_cn,在Field Value (Index)下输入:

我喜欢solr

然后点击蓝色按钮Analyse Values,查看效果,看是否正确分词!

三、单机运行测试

具体过程可以查看官方教程 。

总结过程如下:

1. 创建种子列表

mkdir urls
cd urls
touch seeds.txt
echo "http://nutch.apache.org/" >> seeds.txt # 每行一个URL

2.使用crawl脚本运行

bin/crawl -i -D solr.server.url=http://localhost:8983/solr/nutch urls/ TestCrawl/  2

3. 验证结果

打开http://localhost:8983/solr/,点击solr admin, 在Querty String输入nutch, 点击Search查看效果

四、分布式运行

与单机过程类型,首先创建urls目录作为种子url,然后上传到hdfs上:

mkdir urls
cd urls
echo "http://apache.org" >>seeds.txt
hdfs dfs -put urls

假定solr已经配置完成,url为localhost:8983

运行以下命令运行:

cd $NUTCH_HOME/runtime/runtime/deploy/
bin/crawl -i -D solr.server.url=http://localhost:8983/solr/nutch urls/ TestCrawl/  2

 

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

sqoop2安装

 

1. 下载解压缩

此次安装版本为1.99.6

# Decompress Sqoop distribution tarball
tar -xvf sqoop-<version>-bin-hadoop<hadoop-version>.tar.gz


ln -s sqoop-<version>-bin-hadoop<hadoop version>.tar.gz sqoop

export SQOOP_HOME=`pwd`/sqoop
# Change working directory
cd $SQOOP_HOME

2. 配置服务

配置文件在$SQOOP_HOME/server/conf下,大多数默认配置即可。需要注意的配置是catalina.properties文件下common_loader需要正确配置hadoop库文件,包括hdfs、mapreduce、hive等所有jar包. 我的配置为:

common.loader=${catalina.base}/lib,\ 
${catalina.base}/lib/*.jar,\ 
${catalina.home}/lib,\ 
${catalina.home}/lib/*.jar,\ 
${catalina.home}/../lib/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop/lib/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop-hdfs/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop-hdfs/lib/*.jar,\ /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/lib/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop-yarn/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hadoop-yarn/lib/*.jar,\ 
/opt/cloudera/parcels/CDH/lib/hive/lib/*.jar

sqoop.properties文件的org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/etc/hadoop/conf/配置hadoop 配置文件路径,默认为/etc/hadoop/conf

3. 测试配置是否正确

运行

sqoop2-tool verify

若正确,则输出为:

Verification was successful.
Tool class org.apache.sqoop.tools.tool.VerifyTool has finished correctly

4. 下载derby 包

自带derby版本过低运行时会由于不兼容而出现以下错误:

org.apache.sqoop.common.SqoopException: JDBCREPO_0007:Unable to lease link
at org.apache.sqoop.repository.JdbcRepositoryTransaction.begin(JdbcRepositoryTransaction.java:63)
    at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:85)
    at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:61)
    at org.apache.sqoop.repository.JdbcRepository.createOrUpgradeRepository(JdbcRepository.java:127)
    at org.apache.sqoop.repository.RepositoryManager.initialize(RepositoryManager.java:123)
    at org.apache.sqoop.tools.tool.UpgradeTool.runToolWithConfiguration(UpgradeTool.java:39)
    at org.apache.sqoop.tools.ConfiguredTool.runTool(ConfiguredTool.java:35)
    at org.apache.sqoop.tools.ToolRunner.main(ToolRunner.java:75)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.sqoop.tomcat.TomcatToolRunner.main(TomcatToolRunner.java:77)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Tool.main(Tool.java:225)
Caused by: java.sql.SQLException: No suitable driver found for 

解决办法为下载derby最新版本,先删除/sqoop-1.99.6-bin-hadoop200/server/webapps/sqoop/WEB-INF/lib下的derby旧包,然后把新下载的derby目录下的lib下的jar包拷贝到/sqoop-1.99.6-bin-hadoop200/server/webapps/sqoop/WEB-INF/lib

5. 验证

运行bin/sqoop2-shell,进入sqoop shell模式, 运行show version --all,若能正确输出server版本,则安装成功:

sqoop:000> show version --all
client version:
  Sqoop 1.99.6 source revision 07244c3915975f26f03d9e1edf09ab7d06619bb8
  Compiled by root on Wed Apr 29 10:40:43 CST 2015
server version:
  Sqoop 1.99.6 source revision 07244c3915975f26f03d9e1edf09ab7d06619bb8
  Compiled by root on Wed Apr 29 10:40:43 CST 2015
API versions:
  [v1]
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

配置kafka集群

 

虽然很简单,但会遇到很多奇怪的坑,而且网上解决方法搜不到。 首先下载kafka包,解压缩后,修改conf/server.properties文件,基本配置项如下(省略了部分默认配置项 :

broker.id=0
advertised.host.name=master
zookeeper.connect=master:2181,node1:2181,node2:2181

以上需要注意的是advertised.host.name必须修改为主机名,否则会导致很多问题。 每个主机的broker.id必须不一样。zookeeper.connect需要填写所有的zookeeper服务器地址端口,并且以上的主机名对应的node1,node2,...必须和/etc/hosts一致,并且集群外可以ping通(集群内可以使用内部ip,集群外使用外部ip,但主机名对应的机器必须一一对应,否则会出现Leader not local for partition错误,这是其中一个坑,搞了很久没有搞清楚.

配置修改后,创建一个topic(topic一旦创建不能删除?只能标记为已删除?):

bin/kafka-topics.sh --create --partitions 5 --replication-factor 3 --topic test3 --zookeeper master,node1,node2

获取主题信息

bin/kafka/bin$ ./kafka-topics.sh --describe --topic test3 --zookeeper master,node1

输出:

Topic:test3     PartitionCount:5        ReplicationFactor:3     Configs:
        Topic: test3    Partition: 0    Leader: 4       Replicas: 4,2,3 Isr: 4,2,3
        Topic: test3    Partition: 1    Leader: 5       Replicas: 5,3,4 Isr: 5,3,4
        Topic: test3    Partition: 2    Leader: 6       Replicas: 6,4,5 Isr: 6,4,5
        Topic: test3    Partition: 3    Leader: 7       Replicas: 7,5,6 Isr: 7,5,6
        Topic: test3    Partition: 4    Leader: 0       Replicas: 0,6,7 Isr: 0,6,7

以上的Replicas和lsr必须一样,否则说明对应的broker down掉了。

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

docker网络原理

以下内容引用Docker —— 从入门到实践

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。 同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。 当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。如图 

docker network

 

下面以自定义的容器方式,一步步配置网络, 达到以下目标:

  • 容器间能够通信
  • 容器能够联外网

首先创建一个容器,但不使用默认网络配置,使用--net=none选项:

docker run -t -i --net=none ubuntu:14.04 bash
docker ps # 获取容器id=d344e6e05a99

获取容器pid:

docker inspect d344e6e05a99 | grep -i "\<pid\""
#  "Pid": 27383,
pid=27383

创建netns,并把容器放入新建的netns中,好像不能使用ip netns命令创建,使用以下方法创建:

sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

验证是否创建成功:

sudo ip netns show
# 27383
# ns1
# test

可见命名为27383的netns已经成功创建!

接下来创建一个veth对,其中一个设置为容器所在的netns

sudo ip link add name veth_d344 type veth peer name veth_d344_peer
sudo ip link set veth_d344_peer netns $pid

进入$pid netns设置网卡名称和ip:

sudo ip netns exec  27383 bash
sudo ip link set veth_d344_peer name eth0
sudo ifconfig  eth0 10.0.0.2/24 # 设置ip为10.0.0.2
ping 10.0.0.2 # 能ping通
exit

在容器中ping 10.0.0.2也能ping通,说明设置正确

ping 10.0.0.2 # 应该不通
docker exec d344e6e05a99 ping 10.0.0.2 # 成功ping通

创建网桥,并把veth另一端的虚拟网卡加入新创建的网桥中:

sudo brctl addbr br0 # 创建新网桥br0
sudo brctl addif br0 veth_d344 # 把虚拟网卡加入网桥br0中
sudo ifconfig br0 10.0.0.1/24 # 设置网桥ip
sudo ip link set veth_d344 up # 启动虚拟网卡

测试下:

ping 10.0.0.2 # 成功ping通
docker exec d344e6e05a99 ping 10.0.0.1 # 成功ping通

若以上两个都能ping通说明配置成功!

最后,我们需要使得容器能够联外网,需要设置NAT,使用iptables设置:

sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o em1 -j MASQUERADE

设置容器默认路由为网桥ip(注意在容器内使用route add 添加, 会出现SIOCADDRT: Operation not permitted错误), 因此只能使用ip netns exec设置:

sudo ip netns exec 27383 route add default gw 10.0.0.1

测试,此时请确保宿主机能够联外网,进入容器内部:

ping baidu.com # 成功ping通,确保icmp没有被禁

 

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

docker安装和使用

安装docker

测试环境: ubuntu14.04 64位

一命令式安装

wget -qO- https://get.docker.com/ | sh

把用户加入docker组

默认只有root用户能进行操作,不过docker组也具有权限,因此若需要当前用户不需要root 也能访问docker,需要把用户加入到docker组:

sudo usermod -a -G docker username

启动docker服务

sudo service docker start

测试是否安装好

docker info

若输出以下则说明安装成功

Containers: 0
Images: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.16.0-41-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 4
Total Memory: 7.707 GiB
Name: Alibaba-fgp
ID: GA2K:3OV2:GNVU:PETS:DBZR:OYYP:FHWE:3QM5:QZPW:XNCM:IHP6:U2KN

启动第一个实例

docker run -t -i --rm busybox

此时应该会先从docker hub中拉取镜像,然后启动容器实例

其他命令

docker images #查看本地镜像
docker search hadoop #搜索hadoop相关镜像
docker pull krystism/openstackclient # 下载krystism/openstackclient镜像到本地
docker ps # 查看运行实例
docker ps -a # 查看所有实例,包括没有运行的
docker run -t -i ubuntu:14.04 # 运行ubuntu 14.04镜像
docker start id # 启动指定id实例(开机)
docker stop id # 停止指定id实例(关机)
docker rm id # 删除指定id实例(移除)
docker rmi id # 删除指定i镜像

 

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

使用Docker部署Gitlab

1. 下载gitlab镜像

docker pull gitlab/gitlab-ce

2. 运行gitlab实例

GITLAB_HOME=`pwd`/data/gitlab
docker run -d \
    --hostname gitlab \
    --publish 8443:443 --publish 80:80 --publish 2222:22 \
    --name gitlab \
    --restart always \
    --volume $GITLAB_HOME/config:/etc/gitlab \
    --volume $GITLAB_HOME/logs:/var/log/gitlab \
    --volume $GITLAB_HOME/data:/var/opt/gitlab \
    gitlab/gitlab-ce

3. 配置gitlab实例

3.1 配置邮箱:

docker exec -t -i gitlab vim /etc/gitlab/gitlab.rb

下面以网易163邮箱为例配置邮箱:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xxxx@163.com"
gitlab_rails['smtp_password'] = "xxxxpassword"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_openssl_verify_mode'] = "peer"

gitlab_rails['gitlab_email_from'] = "xxxx@163.com"
user["git_user_email"] = "xxxx@163.com"

注意以上的xxxx@163.com代表用户名,即邮箱地址,而xxxxpassword不是邮箱的登陆密码而是网易邮箱的客户端授权密码, 再网易邮箱web页面的设置-POP3/SMTP/IMAP-客户端授权密码查看。

3.2 配置外部访问URL

这个必须配置,否则默认以容器的主机名作为URL,刚开始由于做了端口映射80->8080, 因此设置为

external_url "http://10.103.240.36:8080"

后来发现external_url只能配置ip或者域名,不能有端口,否则不能启动。 于是只能把端口设置为80->80,然后external_url设置为:

external_url "http://10.103.240.36"

4. 重启gitlab

docker restart gitlab

 

转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!