月度归档:2018年06月

# Docker swarm 学习

点击量:8

本文的学习过程主要是通过 Docker 官方文档

花了一段时间学习 Docker swarm,一个docker的容器集群服务,来应对即将到来的高并发项目需求。

Docker machine

Docker machine 是 Docker 官方编排的项目之一,可以理解成一个 Docker 宿主机器的统一管理CLI,自部署不是很好用:目前国内仅仅 aliyun 支持,其他的我在官方文档中没有找到。

Docker machine 的安装十分简单,通过官网提供的脚本即可,For Linux:

$ base=https://github.com/docker/machine/releases/download/v0.14.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

安装好以后,即可按照相关的操作进行运行。

比如,创建两个虚拟机:

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

进入虚拟机:

$ docker-machine ssh myvm1

显示虚拟机

NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.05.0-ce

然后即可在虚拟机的基础上进行相关的操作,十分方便。

Docker-swarm

Docker swarm 则是一个集群的东西,基本的概念是,每个宿主机器都是一个 worker ,然后大家都加入一个东西,叫做 stack ,stack 里面有许多的 container ,每个宿主机器,也分别是一个 node 。

这个 stack 是依据我们的 service 建立的,stack 中保存着 service 建立的名称,也可以通过 stack 查看相关的节点。

每个 node 都可以运行多个 container ,swarm 会进行 负载均衡 ,这个就很酷了。

图示

在官方的例子中,docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: svtter/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

复制的 app service 数量为 5。

大体上就是这个样子。

想法

行文至此,想到可以进一步学习,然后去一些相关的社区学习一波。(不过按照之前的经验,很多社区的质量都不高,讨论纯属浪费时间。)

学完这些东西,至少可以把自己的服务器升级一波,做成标准的DevOps,以及充分利用服务器资源了。

Code

GitHub – Svtter/Docker_Swarm_Test: a Docker swarm example project. Reference to official document.

# Python文件操作

点击量:11

Python的文件操作很多,为了方便以后查询使用,在此做下记录。

注:这些函数都可以在官网查询,这里做个cache。

遍历文件

遍历当前文件夹,并且

    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        print(file_path)

判断文件是否存在

判断文件是否存在,如果不存在,创建新文件夹

if not os.path.exists(path):
    os.mkdir(path)

删除文件

递归的删除文件

import shutil
shutil.rmtree(file)

shutil是一个high-level file operations,因此相对于其他的python接口,更加偏向于人们的习惯性思维。

Maven小记

点击量:9

发现maven与Java,别有一番乐趣

入门建议:

https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

现在很多文章其实写的都不如官方的文章,但是人们总是习惯性的从百度获取自己想要的某些资源。

maven编译依赖

一般情况下,maven不会把依赖的包编译到自己的jar包里面,我猜和dll的出发点是一样的,减少内存的占用(减少相同内容在内存中的冗余)。

但是有时候我们不能确保宿主的机器也有同样的东西,因此有时候需要把依赖编译进去。

我们可以这样做,在pom.xml中,添加字段:

  <!--构建依赖-->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

由此,就可以把需要的依赖包同时编译进去了。

针对mvn,我上传了一个二维码扫描的例程,可供参考:https://github.com/Svtter/zxing-example

Python拆包的好处

点击量:9

内容

在最近的一期 realpython 中,我阅读到了这样一段代码:

# Why Python Is Great:
# Function argument unpacking
def myfunc(x, y, z):
    print(x, y, z)
tuple_vec = (1, 0, 1)
dict_vec = {'x': 1, 'y': 0, 'z': 1}
>>> myfunc(*tuple_vec)
1, 0, 1
>>> myfunc(**dict_vec)
1, 0, 1

之前因为:

  1. 这个东西不是很直观
  2. 这个可能造成参数混乱

而不是很在意这段代码。现在想来,真是很方便的一个东西:我们可以通过这个特性,轻松的拆解response.json这个dict,从而直接使用参数。

注意一点,如果一个函数的参数超过三个,说明你需要拆解这个函数,而不是被参数的数量搞得焦头烂额。

具体例子

这个方法可以方便很多事情,比如说,我可以这样来重新构建输出的变量,而不是一个个print

def add_parameters(params, **kwargs):
    """add kwargs to dict
    Args:
        params: the dict need to add
        kwargs: variable
    """
    params.update(kwargs)
params = {}
add_parameters(params,
                   x_train=x_train.shape,
                   y_train=y_train.shape,
                   x_test=x_test.shape,
                   y_test=y_test.shape)
pretty(params)