1. docker配置

在mac osx中,docker deamon运行在virtualbox虚拟机中,docker client和虚拟机中的docker deamon交互。

1.1 环境配置

1
2
3
4
5
6
#配置docker环境变量
eval "$(docker-machine env default)"
#配置docker启动alias	
alias docker-start='docker-machine start default'
#配置docker关闭alias
alias docker-stop="docker-machine stop default"

启动命令如下:

1
2
docker-start
docker-stop

1.2 配置镜像私服

测试环境中私服提供服务如下:

1
2
3
4
#docker registry ui
http://192.168.46.21:10005/
#docker registry restful api
http://192.168.46.21:5000/v2/_catalog

下面配置docker registry私服为192.168.46.21:

1
2
3
4
5
6
#登陆到server
docker-machine ssh default

#修改/var/lib/boot2docker/profile
--insecure-registry 192.168.46.21:5000
--registry-mirror http://192.168.46.21:5000

国内docker mirror:

1
2
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
http://0b929cdf.m.daocloud.io

2. docker 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#拉取镜像
docker pull yiji/java8:1.0

#查看镜像历史,能看到docker镜像层的细节
docker history  yiji/java8:1.0

#删除镜像
docker rmi -f yiji/centos7:latest

#删除容器
docker rm

#执行命令	
docker run yiji/centos7 /bin/echo 'hello world'

#交互运行:
docker run -it yiji/centos7 /bin/bash

#查看容器运行状态
docker ps -a
	
#查看指定容器状态
docker inspect f46935242662

#查看端口隐射,通过inspect结果过滤
docker inspect --format='' 8f4a179a0647

#查看容器资源占用
docker stats 92202cc1c3f0

#查看docker deamon运行ip
echo $DOCKER_HOST

#清理后台停止的容器
docker rm $( docker ps -a -q)

#查看镜像的环境变量
docker run  yiji/java8:2.0  env

3. F.A.Q

3.1. docker文件系统

docker镜像的文件系统采用多层存储,镜像中全是只读层,便于分发和共享(pull镜像时,会在本地拉已经存在的层)。运行时建立读写层,对于应用来说,需要把文件系统mount到docker中(这样性能最好),device mapper对性能有影响。

Data volumes provide the best and most predictable performance. This is because they bypass the storage driver and do not incur any of the potential overheads introduced by thin provisioning and copy-on-write. For this reason, you may want to place heavy write workloads on data volumes.

3.2. 关于基础镜像

制作基础镜像时权衡镜像大小(虽然可以在主机上缓存基础镜像,也需要考虑首次分发的大小)。我们最开始使用centos7来制作基础镜像,发现镜像300多M,如果在加上java8,基础镜像有600多M了。

可以参考frolvlad/alpine-oraclejdk8来制作基础镜像。

1
2
	REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
	yiji/java8          2.0                 1d58b31d19a0        4 days ago          166.5 MB

java8的基础镜像只有不到200m。

3.3. 制作docker镜像并运行

  1. 编写Dockerfile

    1
    2
    3
    4
     FROM yiji/java8:2.0
     COPY  yiji-boot-test-1.1-SNAPSHOT.jar /opt/yiji-boot-test-1.1-SNAPSHOT.jar
     WORKDIR /opt
     ENTRYPOINT java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=4004 -jar /opt/yiji-boot-test-1.1-SNAPSHOT.jar
    
  2. build

    1
     docker build -t  yiji-boot-test:1.0 .
    
  3. run

    1
     docker run -p 8081:8081 -p 4004:4004  yiji-boot-test:1.0
    

    其中8081是应用web端口,4004端口是远程调试端口

  4. 在容器内执行命令

    在容器运行起来后,我们需要去容器内check下情况。

    1
     docker exec -it 92202cc1c3f0  sh
    

3.4 docker本地存储

docker 容器运行的文件存储在本地。下面来看看这些文件:

查看docker container id

1
2
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                   PORTS                                            NAMES
8f4a179a0647        yiji-boot-test:1.0   "/bin/sh -c 'java -ag"   2 hours ago         Up 2 hours               0.0.0.0:4004->4004/tcp, 0.0.0.0:8081->8081/tcp   silly_northcutt

登陆到虚拟机,在mac和windows下,docker在虚拟机中运行

1
docker-machine ssh default

切换到docker运行目录

1
2
sudo su -
cd /var/lib/docker/aufs/mnt/

1
ls |grep 8f4a179a0647
发现两个目录

1
2
8f4a179a064737658b4055fb785c432c843f473a9d5fc40fba445017bd5b7e2e
8f4a179a064737658b4055fb785c432c843f473a9d5fc40fba445017bd5b7e2e-init

进入到第一个目录的opt子目录下,会找到我们打包的jar文件(chroot的魔力所在)

1
2
3
root@default:/mnt/sda1/var/lib/docker/aufs/mnt/8f4a179a064737658b4055fb785c432c843f473a9d5fc40fba445017bd5b7e2e/opt# ls -l
total 67168
-rw-r--r--    1 root     root      68777433 Dec 28 08:26 yiji-boot-test-1.1-SNAPSHOT.jar

3.5 关于docker的安全

Docker, Linux Containers (LXC), and security from Jérôme Petazzoni

我们需要做两件事情,

  1. 不要使用root in docker

    参考Running app inside Docker as non-root user

  2. 经常升级内核

做安全的同学可以看看更多关于docker 安全的文章:

docker-bench-security

Security CheatSheet

CIS Docker 1.6 Benchmark

最后引用David Mortman在2015年Defcon的一句话:

a year ago, [docker and security] was pretty horrible,six months ago it wasn’t so bad, and now it’s pretty usable.

3.6 docker run vm?

一些观点:

2016年六大OpenStack & Docker发展趋势预测

由原本的虚拟机管理程序为核心转变为容器加裸机组合模式

Hypernetes实现多租户CaaS,且无需客户操作系统

OpenStack是一个用于构建和管理云的IaaS框架,Hypernetes使用了它的部分组件。它使用OpenStack的身份和服务目录提供程序Keystone进行身份验证和授权。它还使用了其他的OpenStack组件,如用于存储的Cinder和Ceph,用于网络管理的Neutron。对于OpenStack而言,这是一个独特的用法,因为其组件通常都不在OpenStack部署之外使用。

3.7 docker api

3.7.1 unix-socket api

查看docker信息:

1
curl --unix-socket /var/run/docker.sock http:/info |jq

api文档:

1
https://docs.docker.com/engine/reference/api/docker_remote_api/
3.7.2 java api

依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependency>
        <groupId>com.github.docker-java</groupId>
        <artifactId>docker-java</artifactId>
        <version>3.0.1</version>
        <exclusions>
            <exclusion>
                <groupId>de.gesellix</groupId>
                <artifactId>unix-socket-factory</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.kohlschutter.junixsocket</groupId>
        <artifactId>junixsocket-common</artifactId>
        <version>2.0.4</version>
    </dependency>
    <dependency>
        <groupId>com.kohlschutter.junixsocket</groupId>
        <artifactId>junixsocket-native-common</artifactId>
        <version>2.0.4</version>
    </dependency>

使用:

DockerClient dockerClient = DockerClientBuilder.getInstance(“unix:///var/run/docker.sock”).build();
1
2
Info info = dockerClient.infoCmd().exec();
System.out.print(info);

api文档:

1
https://github.com/docker-java/docker-java/

3.8 docker on centos7配置

centos7使用systemd来管理服务,docker配置文件

1
/lib/systemd/system/docker.service
。比如增加tcp api端口,修改

1
2
ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry catalog.shurenyun.com

昨天给朋友推荐了

1
React
,但心里还真没有底,这里整理下资料,如果不考虑浏览器兼容性的问题,这东东真不错😄。

1. 虚拟dom是什么?

虚拟DOM是HTML DOM的抽象,它和浏览器的实现分离。

2. 为什么虚拟dom快?

DOM拖慢JavaScript。所有的DOM操作都是同步的,会堵塞浏览器。JavaScript操作DOM时,必须等前一个操作结束,才能执行后一个操作。只要一个操作有卡顿,整个网页就会短暂失去响应。浏览器重绘网页的频率是60FPS(即16毫秒/帧),JavaScript做不到在16毫秒内完成DOM操作,因此产生了跳帧。虚拟dom的改变并不会引起浏览器dom的改变,而是由React在合适的时机比较差异并渲染,保证

1
FPS

3. Why is React’s concept of Virtual DOM said to be more performant than dirty model checking?

React knows when to re-render the scene because it is able to observe when this data changes. Dirty checking is slower than observables because you must poll the data at a regular interval and check all of the values in the data structure recursively. By comparison, setting a value on the state will signal to a listener that some state has changed, so React can simply listen for change events on the state and queue up re-rendering.(这点随着es6的

1
Proxy
到来,
1
AngularJS
会越来越强大😄)

4. What makes React fast ?

  • Batched DOM read/write operations.
  • Efficient update of sub-tree only.

Compared to dirty-check, the key differences IMO are:

Model dirty-checking: React component is explicitly set as dirty whenever setState is called, so there’s no comparison (of the data) needed here. For dirty-checking, the comparison (of the models) always happen each digest loop.

DOM updating: DOM operations are very expensive because modifying the DOM will also apply and calculate CSS styles, layouts. The saved time from unnecessary DOM modification can be longer than the time spent diffing the virtual DOM.

4. What’s the problem of template engine?

Template languages express the initial render of your application, and you’re responsible for manually mutating the state of the UI when your backing data changes and events occur.

5. how to run ?

上面部分是用户触发的,下面部分是定时触发的。

首先说上面部分:

  1. 用户点击某dom
  2. 1
    top-level event handler
    
    分发事件到指定的
    1
    event handler
    

    1
    top-level event handler
    
    指的是
    1
    document
    
    上的
    1
    event handler
    
    ,这种方式能够提高性能(因为在每个真实的dom上面绑定事件是非常慢的)并且跨浏览器(浏览器中的事件本身就没有统一)

  3. 用户代码调用setState()

    1
    AngularJS
    
    双向绑定,不需要用户调用状态变更。所以,必须要去做大量的
    1
    dirty check
    
    。虽然是一种倒退,但是为了性能忍了,等ES6吧。

下面部分的逻辑:

1
event loop
周期性的检查有状态组件是否
1
dirty
,然后通过
1
diff
算法批量更新浏览器dom树。

情绪地雷区避雷方案:

  1. 安排B计划 (比如等人吃饭,提前准备点事做,别人没到就做自己的事)
  2. 公开自己的情绪死穴 (比如提前给人说哪些是不喜欢的,如果你这样做了,我也避免不了我不发脾气)

情绪管理在生活与工作中的应用

  1. 正向思考

    凡事往正面的角度去想,选取对自己最有利的注解

  2. 转移注意力

    去做能带来好情绪的活动或事情。比如吃自己最喜爱的食物

  3. 让开放的肢体动作带动情绪

    比如去爬山,去跑步,去旅游。

  4. 透过问句引导自己改变认知

    1
    2
    3
    4
    5
     a.对方是故意的还是无心的?
     b.这件事还有没有其他角度与意义可以让我感觉更好?
     c.如果我希望自己的情绪变好,现在我应该做什么?
     d.这样做是真的会让情绪变好还是会有后遗症?
     e.我可以寻求谁的帮助来改善自己的情绪?
    
  5. 发现自己情绪有失控的感觉或倾向,必要时离开现场
  6. 把不满、愤怒、失意等负面情绪写在纸上,然后烧掉、冲掉、寄出或者收藏
  7. 了解自身的有点,积极表现自己,但求尽心尽力
  8. 多看别人的好,适度予以宽容的对待
  9. 接近拥有心灵智慧的良师益友

    智慧不起烦恼,慈悲没有敌人

  10. 提醒自己:世间事都只是过程而非结果

    每件事最终都会过去,包括我自己(凡人必有一死)

  11. 全力以赴后,放下得失心,因为你没有办法决定所有的事一定如你所愿

    战胜对手只是人生的赢家,战胜自己才是命运的强者

哈佛大学推荐20个快乐的习惯

  1. be grateful (学会感恩)

    让自己变慢脚步,看看你的四周,关注生活中的细微之处:人行道上淡紫色的花,美丽的日落,洗去你一天疲惫的淋浴,伴侣眼中的笑容。当你的感恩之心能够欣赏生活的美,思考和祝福,你自然就充满了幸福感。

  2. choose your friedns wisely

    如果你想变得开心的话,要选择和乐观的朋友在一起,他们能欣赏你真实的自己,让你的生活变得更丰富,快乐,有意义。

  3. cultivate compassion (培养同情心)

    当我们代替别人,站在另一个角度看问题,我们更能用同情心,客观和有效的处理问题。生活中就会少一些冲突,多一点快乐。

  4. keep leaning

    学习让我们保持年轻,梦想让我们充满活力。我们运用大脑,进行运作的时候,我们就不大会想不开心心的事情,我们会变得更开心和满足。

  5. become a problem solver (学会解决问题)
  6. do what you love
  7. live in the present

    你感到沮丧,是因为你活在过去。你会感到担忧和焦虑,是因为你活在未来。但是当你感到满足,开心和平和时,你才是活在当下。

  8. laugh often

     笑是对抗生气或沮丧最有力的的东西。不要把生活看的太严肃。要学会在每日的奋斗中寻找幽默感和笑声。  

  9. practice forgiveness

    憎恨和生气是对自我的惩罚。当你释怀的时候,事实上你是在对自己施以善意。最重要的是,学会原谅自己。每个人都犯错。只有通过我们的错误,我们才慢慢学会如何成为一个更强大,更好的人。

  10. say thanks often

    对生活中的祝福要学会欣赏。向那些让你生活变好的人,无论或大或小,表达出你的欣赏之情也同样重要。

  11. create deeper connections (学会深交)

    我们的幸福感会在和另一个人的深交中不断猛增。专注聆听是加强这种关系纽带和把幸福感带给自己和别人的两个最重要的方面。

  12. keep you agreement

    我们的自尊是建立在我们对自己守承诺的情况下。高度的自尊和幸福感有直接关联。所以要对自己和别人遵守承诺。

  13. meditate (冥想)
  14. focus on what you’re doing

    当你全身心投入一件事的时候,你就会处于一个开心的状态。当我们处于这种状态,你就不大会关心别人对你怎么看,不大会被不大重要的事情干扰。结果呢?更幸福,当然啦!

  15. be optimistic

    对于开心的人来说,玻璃都一直是半满的。每当你面对一个挑战时,如果你倾向于想象最坏的想法,那就自我转换这种情况。告诉你自己一个状况中的好处或者你从中学到的东西。乐观肯定能驱动成功和幸福感。

  16. love unconditionally

    没人是完美的,接受你自己所有的不完美,也要这样对待别人。无条件的爱一个人并不意味着你要花所有的时间和他们在一起,或者帮助他们解决问题。无条件的爱意味着接受真实的他们,以他们自己的步伐,让他们自己摸索。

  17. don’t give up

    没有完成的方案和不断的失败不可避免的会削弱你的自尊。如果你决定做某事,做完它。

  18. do you best and then let go

    每个人都有局限性。而且有时候尽管我们很努力做一件事情,但是总会事与愿违。所以做最好的自己,然后放手。当你尽了全力,你就没有遗憾了。

  19. take care of yourself

    一个健康的身体是幸福的关键。如果你身体不好,你无论如何努力,都很难快乐。确信自己吃得好,做锻炼,找点时间休息。好好照顾你的身体,大脑和精神。

  20. give back (学会给予)

    做好事是最能确保你心情好的方法之一。根据哈佛,人们做好事,他们的大脑变得活跃,就好像当你经历别的奖励时,大脑所受的刺激。所以,那些关心别人的人要比不大关心别人的人更开心。