晨曦's Blog

This is a window to the soul

查看 docker 磁盘使用情况

1
docker system df

kill 掉所有容器

1
docker kill $(docker ps -a -q)

删除所有停止容器

1
docker rm $(docker ps -a -q)

删除所有镜像

1
docker rmi $(docker images -q)

强制删除镜像

当同一镜像被多个储存库引用时,就需要强制删除镜像

1
docker rmi -f 镜像ID

删除 tag 为 <none> 的所有镜像

1
2
3
docker images|grep none|awk '{print $3}'|xargs docker rmi

docker rmi $(docker images -f "dangling=true" -q)

删除已经 PUSH 带有 DIGEST 参数镜像

1
2
3
4
5
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
localhost:5000/nodeservice <none> sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB

$ docker rmi localhost:5000/nodeservice@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf

参考:[Docker 命令](https://docs.docker.com/engine/reference/commandline/cli/)

前记

公司部分业务使用的是阿里的 docker swarm 服务,在配置 nodejs 应用时发现时区不对。

处理

记录下自己所选择的方式。

我选择在 Dockerfile 文件中做处理,这样利于以后所有引用此镜像的容器时区的正确性。

1
2
RUN echo "Asia/Shanghai" > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata

我们不生产 k8s 管理平台,我们只是开源项目的搬运工

Rancher

Rancher 是一个开源的企业级容器管理平台。通过 Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher 提供了在生产环境中使用的管理 Docker 和 Kubernetes 的全栈化容器部署与管理平台。

Kubernetes Dashboard

Kubernetes Dashboard 是 Kubernetes 集群的基于 Web 的通用 UI。它允许用户管理在群集中运行的应用程序并对其进行故障排除,以及管理群集本身。

Wayne

Wayne 是一个通用的、基于 Web 的 Kubernetes 多集群管理平台。通过可视化 Kubernetes 对象模板编辑的方式,降低业务接入成本, 拥有完整的权限管理系统,适应多租户场景,是一款适合企业级集群使用的发布平台。

Naftis

Naftis 是一个基于 web 的 Istio dashboard,通过任务模板的方式来帮助用户更方便地执行 Istio 任务。 用户可以在 Naftis 中定义自己的任务模板,并填充变量来构造单个或多个构造任务实例,从而完成各种服务治理功能。

Breeze

Breeze 是睿云智合提供的图形化 Kubernetes 部署工具。

Nacos

Nacos 是阿里巴巴的新开源项目,其核心定位是 “一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”。

Nacos 可能更多的是为了支持一整套微服务。包括 DubboSpring Cloud 以及 Kubernetes 等。


最后相对来说,我还是比较喜欢用 Rancher

前记

毫无疑问,Mybatis-Plus 是优秀的。
Mybatis-Plus 官网的文档中,自定义分页只能只支持 xml 方式,但是鉴于本人对 xml 并不是太喜欢,而是喜欢用注解的方式。

于是,记录了在 Mybatis-Plus 中注解分页方式实现。

实现

首先讲一下我的请求:

1
controller->service->mapper->entity

UserService.java

1
2
3
4
5
6
7
8
9
10
public Object getAll() {
Page userList = new Page<>(1, 5);
Map<String, Object> param = new HashMap<>();
param.put("name", "测试788");
param.put("page", userList);
List<Map<String, Object>> userListArr = mapper.getAllUserGoodsSQLPage(param);
userList.setRecords(userListArr);

return userList;
}

UserMapper.java

1
2
3
4
5
6
7
8
9
@Select("<script>SELECT u.id,u.name from " + TABLE + " as u " +
"left join " + G_TABLE + " as g " +
"on u.id = g.uid " +
"where u.name = #{name}" +
"<if test = 'id != null'>" +
" and u.id = #{id}" +
"</if>" +
"</script>")
List<Map<String, Object>> getAllUserGoodsSQLPage(Map<String, Object> param);

JSON

1、查询数组中对象

JSON_CONTAINS 用法

1
2
3
4
5
select * from circulation
where JSON_CONTAINS(goods->'$[*].name', '["海带结(香辣味)150克/袋"]', '$')

select * from circulation
where JSON_CONTAINS(goods->'$[*].gid', '[20]', '$')

2、Json 字符串转化为 Json 对象

CONVERT 用法

1
select CONVERT('{"mail": "amy@gmail.com", "name": "Amy"}',JSON)

3、元素转化为数组

JSON_ARRAY 用法

1
SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME())

4、数组中查询元素

JSON_CONTAINS + JSON_ARRAY 用法

1
select JSON_CONTAINS(JSON_ARRAY(1,2,3,4,5,6),'6')

5、数组模糊查询

JSON_SEARCH用法

1
select * from table where JSON_SEARCH(profiles, 'all', 'sales%') is not null

常规

1、查询重复记录

1
2
select * from merchant
where num in (select num from synk.merchant group by num having count(num) > 1)

前记

很久都没有写博客了,不是没时间,可能就是纯粹的懒吧。

背景

公司内部版本管理一直以来都是用的 Gitlab,而系统早在前年的时候就已经全部上了 Dockergitlab-runner 发布过后就一直想利用 gitlab-runner 进行 CI/CD 自动化的部署。

Gitlab && Gitlab-Runner

基于原生原方案

关于 gitlab && gitlab-runner 的安装我这边就不赘述了,不会的可以看官方的文档。

Gitlab

Runner 的安装和注册

我们在物理机或云上部署的时候一个流程图如下:

从上图我们可以看出,当我们的服务器多了之后每个服务器都需要安装 runner 服务,这对于我这样懒的人感觉好麻烦的;受不了。

当然也有可以解决的方案,如:单独用一服务器挂载共享磁盘。

基于 Docker 新方案

今天我们重点来谈谈,gitlab 如何和 docker 完美结合

先看看看架构图,如下:

接下来我们来说明一哈上面这张图的一个工作流程。

1、开发人员通过本地 push 代码到 gitlab
2、gitlab-runner 会根据代码根目录下的 gitlab-ci.yml 文件执行 CIgitlab-ci.yml 使用说明请移步:gitlab-ci 使用说明
3、在 CI 过程中会去读取你在代码下 Dockerfile 文件构建镜像。docker 的使用我们这里不做过多赘述
4、将镜像推送到镜像仓库,可以自建,也可以用像阿里云的仓库
5、docker 拉去镜像对服务进行部署。

你飘飘荡荡,轻歌曼舞在宛丘之上,是多么令人神往啊。我想着你爱着你,确实有着深深的感情啊,可是只是一厢情愿而没有什么希望啊!

冬冬冬冬,鼓声响了,那是你在宛丘之下唱歌跳舞。你手持鹭毛伞一年到头歌舞不停,不管是寒冷的冬天还是炎热的盛夏。

乒乒乓乓,瓦盆响了,那是你在宛丘道上跳舞歌唱。你手持鹭毛伞一年到头歌舞不停,不管是寒冷的冬天还是炎热的盛夏。

子之汤兮,宛丘之上兮。洵有情兮,而无望兮。
坎其击鼓,宛丘之下。无冬无夏,值其鹭羽。
坎其击缶,宛丘之道。无冬无夏,值其鹭翿。


既见君子,云胡不喜

Consolas 是一套等宽的字体,属无衬线字体,由 Lucas de Groot 设计。这个字体使用了微软的 ClearType 字型平滑技术,并随同 Windows Vista、Office 2007 及 Microsoft Visual Studio 中发行,或可在微软的网站下载。

不说了上面的都是废话,哈哈。

下载

YaHei.Consolas

安装

将上面下载的字体包解压,并按如下操作:

1
2
3
4
5
sudo mkdir -p /usr/share/fonts/consolas
sudo cp YaHei.Consolas.1.12.ttf /usr/share/fonts/consolas/
sudo chmod 644 /usr/share/fonts/consolas/YaHei.Consolas.1.12.ttf
cd /usr/share/fonts/consolas
sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv

题外话

在这里再给两款编程常用的字体:(个人爱好罢了)
Monaco:https://github.com/cstrap/monaco-font

1
curl -kL https://raw.github.com/cstrap/monaco-font/master/install-font-ubuntu.sh | bash

Source Code Pro:https://github.com/adobe-fonts/source-code-pro

1
2
3
sudo mkdir -p /usr/share/fonts/adobe-fonts/source-code-pro
sudo git clone https://github.com/adobe-fonts/source-code-pro.git /usr/share/fonts/adobe-fonts/source-code-pro
sudo fc-cache -f -v /usr/share/fonts/adobe-fonts/source-code-pro

提笔为青春,人生正当年

对 Ubuntu 的折腾也有几年了吧,但是一直都是双系统或是虚拟机,最近将 windows 彻底的抛弃了。
接下来说我们今天的主角 Dropbox,一直以来都是利用 Dropbox 进行资料同步。转入 Ubuntu 也不例外,在安装的时候由于 Dropbox 已经被墙了所以想到了走代理。

Shadowsocks

这里也就不多说了,Shadowsocks-Qt5

proxychains

在使用 3 版本中的时候遇到了一些问题,所以我建议直接使用 4 版本。

1
2
3
4
5
6
7
8
9
10
11
12
# 安装
git clone https://github.com/rofl0r/proxychains-ng.git
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install
sudo make install-config

# 配置 socks4 127.0.0.1 9050改为socks5 127.0.0.1 1080
vi /usr/local/etc/proxychains.conf

# 使用
proxychains4 telnet google.com 80

Dropbox

1
proxychains4 dropbox start -i

Dropbox 启动后就会自动下载并安装,登录过后可以通过配置选项走代理。

题外话:

解决 Ubuntu 下 Sublime Text 3 无法输入中文

网络配置

在安装 minimal 版系统之后 Centos 系统的网卡默认是没有被开启的,我们可以用下面的命令编辑网络配置:

1
vi /etc/sysconfig/network-scripts/ifcfg-eth0

如果使用 DHCP 则需要按以下格式设置:

1
2
3
4
5
6
7
DEVICE=eth0
HWADDR=08:00:27:0F:5C:17
TYPE=Ethernet
UUID=64ea57af-9329-40c4-90da-bf239cecea4f
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

如果是固定 IP 则需要按以下格式设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
DEVICE=eth0
HWADDR=08:00:27:0F:5C:17
TYPE=Ethernet
UUID=64ea57af-9329-40c4-90da-bf239cecea4f
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=61.128.128.68
DNS2=61.128.128.69
IPV6INIT=no

设置完成后需要运行以下命令重启网络服务:

1
service network restart

最后可以用以下命令来查看 IP 地址:

1
ifconfig
阅读全文 »