Docker Command

Docker Command

实际使用中,docker的命令还是很多的,这里单列出来方便查询。

docker run

docker run 选项详解

–rm 容器关闭时自动删除容器, 通常用于运行一次性命令
-d, —detach 在后台运行(detached模式)并打印容器ID, 如果不指定,容器运行日志会打印到终端
-p : 建立宿主机到容器的端口映射
-v <hostDirectory/volume>: 建立宿主机到容器的文件目录映射, 如果不指定,则不能持久化保存变更

上面的docker volume如果不存在会自动创建, 也可以手动创建:
docker volume create my-container-data

# 指定网络
docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

docker 网络

docker port <CONTAINER>
docker network ls
# 创建新的bridge 网络
docker network create net-demo
docker network create --subnet=172.18.0.0/16 mynet123

docker 数据卷

docker 其他

# 显示所有exited的容器ID
docker ps -a -q -f status=exited
# 显示标准输出日志
docker logs

制作镜像

docker build

-t 版本标签

Dockerfile

例子

# 基础镜像
FROM  python:3-onbuild
# 对外暴露端口
EXPOSE 5000
# 执行命令
CMD: ["python",".app.py"]


# 其他
# 运行命令
RUN apt -yqq update

# 把应用添加到容器卷
ADD flask-app /opt/flask-app
# 设置工作目录
WORKDIR /opt/flask-app

docker-compose

定义及运行多个容器应用,Python写的一个工具
PS. 原来docker-compose最初也是收购来的

# 停止服务
docker-compose stop
# 停止并删除container及数据卷
docker-compose down -v
# 创建,启动并在后台运行container
docker-compose up -d

docker-compose.yml

version:
services:
    <service_name>:
        image:
        command:
        ports:
        volumes:
Docker最佳实践

Docker最佳实践

这里主要针对制作Docker镜像,汇总常见的正确使用方式:

制作镜像

使用继承镜像

如果要制作包含Tomcat和Java运行环境的镜像, 建议先基于CentOS制作Java镜像,接着基于它做Tomcat镜像。
centos7-java8 > centos7-java8-tomcat8

在一个容器最好只运行一个进程

制作合适层数的镜像

避免只包含一层,也避免太多层。常用的方式例如:

  • 基于操作系统的定制基础镜像
  • 新用户创建准备
  • 安装运行时
  • 配置
  • 应用层

定义.dockerignore

使用WORKDIR

注意顺序,依照构建过程(不变的在前)

缩减镜像尺寸

镜像的选择:
Ubuntu > openjdk:8-alpine > tomcat:8.5-alpine

常用清除命令

# Alpine
apk add --no-cache curl
# CentOS
yum clean all
# Ubuntu
rm -rf /var/lib/apt/lists/*

使用Health Check

HEALTHCHECK CMD curl --fail http://localhost  || exit 1
--interval=10s
--timeout=10s
--start-period=30s

# 检查状态
docker ps response

Java应用性能优化

JVM

应该指定 -Xmx
默认使用宿主机的25%或1G(取较小值)

使用docker资源限制

–memory
–memory-reservation
–cpus

如果CPU被限制,需要同时设置 -XX:ParallelGCThreads

日志处理

不建议写到容器的RW层,应该发送到数据卷(NAS/SAN)或使用 Docker Log Drivers.

问题诊断

JVM命令:
GC Stats: jstat –gcutil
Heap Dump/直方图: jmap

Docker命令:
docker stats
ctop

一些镜像资源

参考

在Windows10运行增强版Ubuntu,支持复制粘贴和本地磁盘映射

在Windows10运行增强版Ubuntu,支持复制粘贴和本地磁盘映射

使用Win10自带的Hyper-V运行Ubuntu虚拟机确实资源使用很小,Ubuntu虚拟机开个全屏,用起来和双系统没有区别。

前提

由于这是最新版Windows 10发布版才支持的特性(增强Linux支持),需要确保Windows已升级至1803. 升级使用官方的Windows10易升就可以。

同时Hyper-V需要专业版和企业版才支持(家庭版不行)。

主要步骤

1.下载Ubuntu 18.04(或16.04)镜像
2.在Hyper-V创建新虚拟机,可以选择”Generation 2″/2代。 创建完成之后,在虚拟机[设置]-[硬件]-[安全],把”Enable Secure Boot”前的勾选去掉。
3.虚拟机安装完成之后,进入Ubuntu系统,在终端执行下列命令:

sudo apt-get update
sudo apt install git
git clone https://github.com/jterry75/xrdp-init.git ~/xrdp-init
cd ~/xrdp-init/ubuntu/18.04/
vi install.sh

# 把以下两行注释掉并保存,如下
#rmmod vmw_vsock_vmci_transport
#rmmod vsock

# 运行
sudo chmod +x install.sh
sudo ./install.sh
sudo reboot
# 重启后,进入该目录再次运行
sudo ./install.sh
# 之后关闭Ubuntu

4.以管理员打开powershell,运行

Set-VM -VMName Ubuntu -EnhancedSessionTransportType HvSocket

5.进入Ubuntu虚拟机,以默认的Xorg方式登录系统。

如果登录失败,进入[Hyper-V Settings]-[User]-[Enhanced Session Mode]设置项,把”Use enhanced session mode”前的勾选去掉,重新登录Ubuntu并检查日志/var/log/xrdp.log最后的错误。如果是因为私钥读失败,可执行

# 这里修改为你的用户名
sudo chown xulz /etc/xrdp/key.pem

参考

Kubernetes控制命令kubectl汇总

Kubernetes控制命令kubectl汇总

kubectl 作为Kubernetes集群管理的命令行工具,经常用到的几个子命令包括:

  • kubectl get – list resources
  • kubectl describe – show detailed information about a resource
  • kubectl logs – print the logs from a container in a pod
  • kubectl exec – execute a command on a container in a pod

按类型分

集群状态

kubectl cluster-info

get 获取信息

kubectl get nodes
kubectl get deployments
kubectl get pods
# 更详细的信息
kubectl get pods -o wide
kubectl get componentstatuses

logs 获取容器日志

POD_NAME=$(kubectl get pods -l run=nginx -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME

exec 在容器执行命令

kubectl exec -ti -- $POD_NAME <command>

配置

# 基于配置文件创建pod
kubectl create -f <config.yaml>
# 创建其他资源
kubectl create secret generic kubernetes-bootcamp --from-literal="mykey=mydata"

按使用场景

部署容器镜像

## 部署
kubectl run <deployment name>  —image=<full url>  —port=8080
# 例如
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
kubectl run busybox --image=busybox

# 检查
kubectl get deployments
# 使用标签过滤
kubectl get pods -l run=busybox

## 升级
kubectl set image ...

暴露服务

# 使API Server监听本地的8001端口
kubectl proxy
# 使用NodePort服务方式暴露部署
kubectl expose deployment nginx --port 80 --type NodePort
# 标签标记
kubectl label
# 检查
kubectl get services

自动扩容

kubectl scale <deployment>  —replicas=5

升级及回滚

kubectl rollout status …
kubectl rollout undo <deployment>

电音欣赏

电音欣赏

去年下半年玩王者荣耀(年前已出坑)的收获之一就是接触了电音,当时找一些攻略视频看,背景音乐都很带劲,于是通过网易云音乐的歌单发现了电音的广阔天地.

从个人爱好说,超喜欢铁托,那首BOOM就很魔性. 其他DJ有Deorro(Five Hours必听),Timmy Trumpet,Zedd.

欢迎收听我的歌单: http://music.163.com/#/playlist?id=969925767

Kubernetes生产环境部署

Kubernetes生产环境部署

众所周知Kubernetes集群的部署比较繁琐复杂,这里列出常见的几种部署方式及过程.

官方现在提供2种主要的部署方式:

  • Kubespray : 基于Ansible的集群自动化部署,支持的平台更广泛,部署更灵活
  • Kubernetes Operations (kops): 生产环境集群自动化部署工具, 目前只支持AWS, GCE云环境.

Kubespray部署实战

说明

由于国内网络访问docker.com及镜像, kubernates, gcr.io等相关镜像极不稳定,替换了相关安装源.
这里使用的是我的Kubespray fork版本

部署节点前提

  1. 需要关闭swap
    > sudo swapoff -a
  2. 根据自己的节点信息修改inventory/mycluster/hosts.ini
    我的例子
moon1 ansible_ssh_host=10.20.30.101  
moon2 ansible_ssh_host=10.20.30.102 
moon3 ansible_ssh_host=10.20.30.103
moon4 ansible_ssh_host=10.20.30.104 
moon5 ansible_ssh_host=10.20.30.105 
moon6 ansible_ssh_host=10.20.30.106 

[kube-master]
moon1
moon2


[etcd]
moon1
moon2
moon3

[kube-node]
moon2
moon3
moon4
moon5
moon6

[kube-ingress]
moon2
moon3

[k8s-cluster:children]
kube-master
kube-node
kube-ingress

国内镜像及加速的常见步骤

docker 阿里云镜像

# step 1: 安装必要的一些系统工具
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
# 查找Docker-CE的版本: apt-cache madison docker-ce
# 安装指定版本的Docker-CE
 sudo apt-get -y install docker-ce=17.03.2~ce-0~ubuntu-xenial

docker镜像 阿里云加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://nz4awhki.mirror.aliyuncs.com"]
}
EOF
# 重启以生效
sudo service docker restart

kubernetes镜像

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF

gcr.io/google-containers镜像

将相关镜像URL里的 gcr.io/google-containers部分替换为anjia0532 .

运行Ansible Playbook命令

首次运行,建议:
1. 开启详情日志: -v
2. 如果非root,切换sudo用户: -u xulz -b
3. 建议先运行其中一台节点: –limit moon1

ansible-playbook -u xulz -b -i inventory/mycluster/hosts.ini cluster.yml –limit moon1

问题排查

如果ansible运行失败,根据最后的控制台错误做相应的修正并重试.
日志的存放位置为节点主机的: /var/log/containers/

注: 如果以–check的Dry Run方式运行,会造成运行错误(因为脚本依赖于某些步骤的实际运行结果为环境变量),所以不要使用这种模式.

登录Kubernetes Dashboard

### 创建管理员账号
kubectl create -f admin-role.yaml
# 找到admin-token开头的token名字
kubectl  -n kube-system get secret
# 获取相应的token
kubectl -n kube-system get secret admin-token-tmh9v -o jsonpath={.data.token}|base64 -d
# 也可以直接运行 kubectl -n kube-system describe secret admin-token-tmh9v 获取token

# 访问网址: https://<first_master>:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
# 选择以token方式登录, 输入上一步获取的token
# 登录成功

admin-role.yaml的具体内容见这里

关于Dashboard的说明

Dashborad支持token和kubeconfig两种认证登录方式,而kubeconfig的方式也需要token字段。
默认命名空间有: default, kube-public, kube-system

扩展阅读

Web测试及工具

Web测试及工具

整理下测试相关的东西在这里。

说到Web网页自动化测试,事实上的唯一标准就是基于WebDriver/Selenium的实现了。

说明: WebDriver 等同于Selenium2

WebDriver 介绍

WebDriver 是一个跨浏览器的网站自动化测试API,主要包含以下几方面

  • Browser Control: navigation, snapshotting, window control, override geolocation
  • User input simulation: mouse, keyborad, file uploads, altert handling
  • Web stuff: find/query elements, evaluate JavaScript, manipulate cookies

    Read More Read More

接口测试及工具

接口测试及工具

接口(API)测试随着REST的流行有个越来越多的应用,而基于测试金字塔理论,偏底层的接口测试是投入产出最高的。

接口测试基本操作:

  • 生成符合协议格式的请求数据
  • 向指定接口发送数据并接受响应
  • 验证响应码并解析响应内容,确保符合预期数据

接口测试的用例分以下两类:

  • 单接口用例: 主要测试不同参数数据组合得到的响应符合期望值
  • 多接口业务用例 : 更偏向业务的实际应用场景,尽量提高覆盖

通常情况下,接口测试自动化实现会基于单元测试框架作为测试脚本的运行驱动, 为减少数据依赖通常会引入Mock数据. 最终部署形式通常与CI系统(Jenkins)整合.

以下为接口测试的相关工具/框架:

基础库

Java的生态相对成熟丰富, 牵涉到几个常用库:

  • rest-assured: 更友好的DSL测试语法
  • Hamcrest : 灵活的匹配表达式(matchers),新版JUnit已内置;支持多语言
  • WireMock: HTTP服务Mock工具

流行工具

Diffy : Twitter开源的回归测试工具, 通过代理的形式比较响应内容,验证新代码是否引入缺陷

扩展阅读

相关链接

其他

有些项目已不再维护,供学习参考。

  • WeTest:微博开源的基于JUnit4的轻量级接口自动化测试框架
  • zato-apitest: python实现,略显繁琐
用Makefile简化重复的多个命令

用Makefile简化重复的多个命令

经常会通过编译安装一些Linux包,最熟悉的就是make test, make install 这类命令了,以为make只适用于编译安装.
实际上发现Makefile/makefile在简化一些常用命令(多行命令或长命令)时也非常方便.

# Makefile
install:
    @go get github.com/revel/cmd/revel
    @dep ensure
server:
    revel run github.com/xulz/webapp

Makefile规则

<目标>:<执行的前提条件,即有文件更新才执行>
(tab) 具体的命令

  • 默认执行第一个目标.
  • 在命令前添加@ 表示不打印正在执行的命令

Makefile的一些语法

# 定义变量, 使用 $(LDIR) 引用
LDIR =../lib

自动化变量:
* $< 表示所有的依赖目标集
* $@ 表示目标集

调试

带参数 -n或–just-print, 只显示命令而不执行.

扩展阅读