Lei's Blog

SubTitle


  • 首页

  • 归档

  • 标签

Mongo Docker 安装及用户配置

发表于 2017-03-21   |  
  1. 下载mongo 3.4版本
1
docker pull mongo:3.4
  1. 跑一个mongo容器。 —auth表示开启验证模式,mongo默认是不开启验证模式的
1
docker run -p 27017:27017 --name mongo1 -v $PWD/db:/data/db -v $PWD/configdb:/data/configdb -d mongo:3.4 --auth
  1. 进入mongo1容器进行初始用户设置
1
docker exec -it mongo1 mongo admin
  1. 建立超级用户.
1
db.createUser({user:"bird521",pwd:"xxx",roles:["__system"]})

有了这个超级用户之后就可以这个用户登陆,还可以再建其它user. 一般项目中用一个readWriteAnyDatabase就够了。

1
2
3
mongo -u bird512 -p xxx -authenticationDatabase admin
use admi
db.createUser({user:"projectUser",pwd:"xxx",roles:[{role:"readWriteAnyDatabase",db:"admin"}]})

​

could not install *smartsocket* listener Address already in use错误解决

发表于 2017-01-23   |  

使用Genymotion模拟器调试react-native时如果碰到error: could not install smartsocket listener: Address already in use错误,这个错误应该就是你的Genymotion使用的Android SDK 跟你本机上的Android SDK路径不一致。解决方法:

  1. 命令行输入 android,打开Android SDK Manager,找到你当前的SDK Path。eg: /usr/local/Cellar/android-sdk/24.4.1_1

  2. 设置你的Genmontion的Android SDK路径为1里找到的路径。

    Genymontion->Settings->ADB->Use custom Android SDK tools

1
2
3
4
error: could not install *smartsocket* listener: Address already in use
ADB server didn't ACK
* failed to start daemon *
error: cannot connect to daemon

Docker 容器内time zone与主机的time zone不一致的解决方法

发表于 2017-01-05   |  

暂时找到了两种方法,这里备忘一下, 两个一起用确保

  1. 以volume的形式把主机的/etc/localtime共享到容器里,亲测可行。

    1
    docker run -v /etc/localtime:/etc/localtime xxx

    ​

  2. 在DockerFile里把time_zone echo到镜像里. 如果服务器只在国内的就按下面第一种直接写死好了

    1
    RUN echo "Asia/shanghai" > /etc/time

    or

    1
    RUN echo "$TIME_ZONE" > /etc/time

    ​

跑了tomcat的docker容器诡异137退出分析

发表于 2016-12-13   |  

继上篇,最近发生的一件诡异的事,跑在一台测试服务器上的一个tomcat的docker容器隔几天都会ExitCode:137退出。最近几天一直很平稳没有一个容器退出过,直到今天早上10点左右这台机上所有在tomcat容器都一起停掉了(除了两个加了restart=always已经自启了)。分析:

  1. 分析ExitCode。 137 = 128+9. 表明这是被kill -9结果掉的。
    http://tldp.org/LDP/abs/html/exitcodes.html
    ​

  2. inspect这个容器查看具体信息。OOMKilled:false 表明它不是因为out of memory被kill的。难道是被其它什么进程kill的?

    1
    docker inspect <container_id>

    输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    "State": {
    "Status": "exited",
    "Running": false,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 0,
    "ExitCode": 137,
    "Error": "",
    "StartedAt": "2016-12-12T02:06:08.243092091Z",
    "FinishedAt": "2016-12-13T01:57:59.927017549Z"
    },

    ​

    ​

  3. 查看容器log。--没发现出错信息

    1
    docker logs <container_id>

    ​

  4. 查看docker deamon log。--没发现出错信息

    1
    journalctl -u docker.service

    不同系统版本有不同查看命令:

    https://www.loggly.com/blog/what-does-the-docker-daemon-log-contain/

分析到现在为止貌似已经没辙了,如果还有其它方法请下面留言。

真相:

最后我只能想到一个可能性了:我公司有一个同事因个人原因在云南远程办公,有可能是被他手动kill掉的。 确认后果然是他干的(粗暴的把所有java进程都kill -9了:()

在docker容器运行时更改restart策略

发表于 2016-12-08   |  

前几天配了一个tomcat容器用来跑UAT,但是这个容器有时候会死掉(原因下次再分析)从而影响了测试人员的测试工作。当初docker run这个容器的时候没有考滤到这个问题没有加—restart=always。google后发现一个可以运行中的容器加restart策略:

  1. 查看当前容器restart 策略

    1
    docker inspect -f "{{ .HostConfig.RestartPolicy }}" <container_id>

    ​

  2. 设置restart策略

    1
    docker update --restart=always <container_id>

    ​

自己备忘

发表于 2016-12-08   |  

react-native init richer

1
2
3
4
5
6
7
8
9
10
11
To run your app on iOS:
cd /Users/fenglei108/git/richer
react-native run-ios
- or -
Open /Users/fenglei108/git/richer/ios/richer.xcodeproj in Xcode
Hit the Run button
To run your app on Android:
Have an Android emulator running (quickest way to get started), or a device connected
cd /Users/fenglei108/git/richer
react-native run-android
setUploadThirdPartyDocuments

Git服务器SSH配置

发表于 2016-12-08   |  

用户端

设置本地git用户配置

1
2
$ git config --global user.name "username"
$ git config --global user.email "user@email.com"

创建SSH Key,私钥和公钥

把邮件地址换成自己的邮件地址,然后一路回车,使用默认值即可,无需设置密码。

1
$ ssh-keygen -t rsa -C "user@email.com"

上传公钥到服务器(默认git用户已创建并且没有被禁ssh,不然就用其它user)

1
$ scp -r ~/.ssh/id_rsa.pub git@server:~/

服务器端

创建一个git用户,用来运行git服务.

1
略过...

把用户上传的公钥添加到authorized_keys

1
2
3
4
5
6
$ cd ~
$ mkdir .ssh
$ cd .ssh
$ touch authorized_keys
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub

最后记得加上权限

1
2
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh

授权登陆

1
2
3
4
5
$ sudo vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

###然后重启SSH服务

1
$ service sshd restart

禁用git用户shell登录

出于安全考虑,前面创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

1
git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

1
git:x:1001:1001:,,,:/home/git:/usr/local/bin/git-shell

其它用户追加

客户端

1
2
$ ssh-keygen -t rsa -C "user@email.com"
$ scp -r ~/.ssh/id_rsa.pub root@server:~/

服务器端

1
2
3
$ cat ~/id_rsa.pub >> /home/git/.ssh/authorized_keys
$ rm ~/id_rsa.pub
$ service sshd restart

自己备忘的URL

发表于 2016-12-08   |  

docker中文文档:
http://docker-doc.readthedocs.io/zh_CN/latest/index.html

docker英文文档:
https://docs.docker.com

一些博客:
http://www.alauda.cn/2015/07/17/dockerfileinstructions/
http://www.runoob.com/docker/docker-tutorial.html
http://www.open-open.com/lib/tag/Docker

http://www.cnblogs.com/jytx/p/5438747.html
http://beijgh.blog.51cto.com/8272564/1590783

aliyun:
http://oss.aliyuncs.com/aliyun_portal_storage/help/ecs/ECS%20Docker实践.pdf?spm=5176.7740559.0.0.DWttBA&file=ECS%20Docker实践.pdf
https://help.aliyun.com/knowledge_detail/40557.html

daocloud:
http://docs.daocloud.io/ci-image-build/dockerfile

unix Log:
https://www.cyberciti.biz/faq/linux-log-files-location-and-how-do-i-view-logs-files/

老服务器空间清理

发表于 2016-12-08   |  

公司的一堆老服务器及一些阿里云服务器经常会报空间不足的警告,需要手动清理。

有效命令

  1. 查看硬盘使用情况

    1
    df

    ​

  2. 查找文件夹使用容量

    1
    du -h --max-depth=1

    ​

  3. 一般占据空间最大的都是一些log文件,如appach以及其它nohup log。对于已经在运行中的服务的log直接rm掉可能会导致服务出错,所以可以选用以下命令来清空。

    1
    cat /dev/null > xxx
  4. mysql的binlog如果已经开启,可以用以reset master清除没有主从备份的数据库.

    1
    reset master;

    设置binlog的过期时间

    1
    2
    show variables like '%expire%';
    set global expire_logs_days=30;

    ​

安卓下实现下拉菜单及菜单项style定制

发表于 2016-10-09   |  

今天接到一个需求,要在一个原生安卓APP的list renderer里加一个下拉菜单,并且不同的下拉项要根据内容显示不同颜色的字体。自从用过react native之后再接触安卓原生感觉一下子好不习惯,在RN里短短几行就能搞定的事在原生里得改好多代码。安卓里下拉菜单控件是Spinner。直接上代码:

实现list renderer里的下拉菜单

关于Spinner的实现网上已经能找到很多,这里就列一下跟list renderer相关的。先list所在的xml相应位置添加Spinner的定义:

1
<Spinner android:id="@+id/spinner1" />

在list adapter类里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
MySpinerClick mySpinerClick = null;
if (null == convertView) {
mySpinerClick = new MySpinerClick();
viewHolder.spinner=(Spinner)convertView.findViewById(R.id.spinner1);
viewHolder.spinner.setAdapter(dropdownAdapter);
viewHolder.spinner.setSelection(dropdownAdapter.getPosition("lastValue")); //确保默认选择项
} else {
...
}
viewHolder.spinner.setOnItemSelectedListener(mySpinerClick); //添加OnItemSelected事件
if(null != mySpinerClick){
mySpinerClick.setPosition(position); //postion是什么了确保在OnItemSelect的时候能跟据这个postion找到对应的项
}
return convertView;
}
private final class ViewHolder {
private Spinner spinner;
}

实现不同值显示不同样式

在Spinner的Adapter时重写getDropDownView(),这样确保了下拉弹出框里样式改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
final List<String> list = new ArrayList<String>();
dropdownAdapter=new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item,items){
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent){
View v = super.getDropDownView(position,convertView,parent);
if (v != null) {
TextView tv = (TextView) v;
//改变样式
if(shouldDispalyRed(list.get(position))) {
tv.setTextColor(Color.RED);
}else{
tv.setTextColor(Color.BLACK);
}
}
return v;
}
};
dropdownAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

重写Spinner的OnItemSelectedListener的onItemSelected()方法,确定在未展开状态下默认选中值的样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
SampleBag sampleBag = sampleBags.get(position);
sampleBag.setBagType(""+parent.getItemAtPosition(pos));
TextView tv = ((TextView) parent.getChildAt(0));
////改变样式
if(shouldDispalyRed(sampleBag.getBagType())){
tv.setTextColor(Color.RED);
}else{
tv.setTextColor(Color.BLACK);
}
}

小窍门:

消除spinner的下拉箭头.

1
2
3
4
<Spinner
...
android:background="@null"
/>

12
Feng Lei

Feng Lei

desc

19 日志
17 标签
© 2017 Feng Lei
由 Hexo 强力驱动
主题 - NexT.Pisces