分类目录系统

持续集成 jenkins

安装java环境及tomcat

下载jenkins war包,放在tomcat的app目录

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

启动tomcat

— 设置为后台运行并修改端口

nohup java -jar jenkins.war --httpPort=8888 >/dev/null 2>&1 &

官网

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

brew install jenkins-lts

dcoker

To use the latest LTS: docker pull jenkins/jenkins:lts
To use the latest weekly: docker pull jenkins/jenkins
docker run -itd --name jenkins -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

volume ls
docker volume inspect jenkins_home
"Mountpoint": "/var/lib/docker/volumes/jenkins_home/_data",

docker volume create my-vol

enkins配置文件备份:
docker cp focused_bhaskara:/var/jenkins_home ./jenkins_home
其中focused_bhaskara为当前运行的jenkins容器名字,通过docker ps查看names即可得到。

docker run \
--name jenkins \
  -itd \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(which git):/usr/bin/git \
  -v /apache-maven-3.5.4:/usr/bin/maven \
  -v $JAVA_HOME:/usr/bin/jdk \
  jenkinsci/blueocean
or
mkdir /opt/jenkins/jenkins_home
sudo chown -R 1000 /opt/jenkins/jenkins_home

docker run -itd --name my_jenkins -p 800:8080 -v /opt/jenkins/jenkins_home:/var/jenkins_home -v /opt/jenkins/war:/usr/local/tomcat/webapps/ -v /usr/bin/git:/usr/bin/git -v /opt/java/jdk1.8.0_231:/opt/java/jdk1.8.0_231 -v /opt/maven/maven3:/opt/maven/maven3 -v /var/lib/docker:/var/lib/docker tomcat:9.0.30-jdk8

安装插件:SSH /Publish Over SSH /Git Parameter/Maven Integration/Rebuilder/Safe Restart/Generic Webhook Trigger/Gitlab Plugin/Docker Compose Build Step/Docker

配制全局安全属性-配制管理员,

系统管理-添加用户,同上授权

echo $JAVA_HOME

which git

echo $M2_HOME

应用部署服务器配制:内网测试环境可以关闭防火墙

service iptables stop

service iptables status

设置jenkins到K8s master ssh 免密登陆

ssh-keygen -t rsa 生成密钥 ssh-genkey -t rsa

ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.10.45

插件安装不成功

jenkins->系统管理->管理插件->高级 替换最下方【升级站点】中的URL

将http://updates.jenkins-ci.org/update-center.json
https://updates.jenkins.io/update-center.json

替换为http://mirror.esuni.jp/jenkins/updates/update-center.json

或手动安装,下载Jenkins的插件的地址:https://plugins.jenkins.io/
进入Jenkins,进入系统管理,进入管理插件,进入高级,上传插件文件,开始上传

自动化构建

  1. 丢弃旧的构建 保持构建的天数2 保持构建的最大个数 2
  2. 参数化构建过程 name:Branch Parameter Type:Branch or tag Default Value:origin/master
  3. Repository URL: Credentials:
  4. 构建触发器
    1. 设置GitLab的webhook
    2. jenkins中,在 系统管理 -> 全局安全管理中, 勾选 匿名用户具有可读权限
    3. 在工程中,点击 构建触发器中选中的Build When a change is pushed右下角的高级选项,有一个Secret token,点击 Generate,会生成一个安全代码,复制到GitLab webhook中的url下面
  5. Build
    1. Root POM: pom.xml
    2. Goals and options:
  6. Post Steps
    1. Run regardless of build result
    2. 执行shell code

ERROR

  1. valid crumb -> 在安全设置中,不勾选 CSRF
  2. 找不到docker-compose -> sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  3. 无docker权限 Got permission denied while trying to connect to the Docker daemon socket at unix://var…
    sudo gpasswd -a jenkins docker #将用户加入到docker用户组中
    sudo newgrp – docker #更新用户组
    sudo service jenkins restart #重启Jenkins服务

备份恢复

FYI

Kubernetes K8s

Service 服务信息

kubectl get service –all-namespaces

Deployment 部署信息

kubectl create -f test.yml

kubectl delete -f test.yml

kubectl get deployment –all-namespaces

K8S文档

使用阿里的安装 k8s安装

swapoff -a 禁用虚拟内存 直接永久关闭 swap ,修改 /etc/fstab 文件,注释掉 swap那行。
apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
#docker源
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add –
add-apt-repository “deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable”

#kubeadm源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add –
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

#安装docker、kubeadm以及k8s中不会通过docker容器部署的组件
apt update
apt install -y docker-ce kubeadm kubelet kubectl

开始初始化k8s

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
成功后按提示操作并记住join信息

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看k8s状态

kubectl --namespace kube-system get pod

(sysctl net.bridge.bridge-nf-call-iptables=1)
,对于 k8s 来说,安装一个插件其实就是应用一个插件的配置文件, kubectl apply 就是应用配置文件的命令。另外这个命令还支持 http 协议。 flannel 的配置文件我们可以直接在 githubflannel 的官方仓库拿到 url ,是 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

(

curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

增加:
tolerations:
下面的
– key: node.kubernetes.io/not-ready
operator: Exists
effect: NoSchedule

再执行
kubectl apply -f kube-flannel.yml

)

插件只在master中执行安装,安装完成以后我们等个几分钟再来看看组件的状态,都是running才正常

join 命令有三个参数,第一个是 masterip 和端口,第二个是 token ,第三个是证书的 hash 值。
join24小时之后 token 就过期,重新生成脚本

<

div>

#!/bin/bash

if [ $EUID -ne 0 ];then
    echo "You must be root (or sudo) to run this script"
    exit 1
fi

if [ $# != 1 ] ; then
    echo "Usage: $0 [master-hostname | master-ip-address]"
    echo " e.g.: $0 api.k8s.hiko.im"
    exit 1;
fi

token=`kubeadm token create`
cert_hash=`openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'`

echo "Refer the following command to join kubernetes cluster:"
echo "kubeadm join $1:6443 --token ${token} --discovery-token-ca-cert-hash sha256:${cert_hash}"
 代码复制到 mster主机 的新文件中,命名 join.sh ,然后执行他:./join.sh ipordom

kubernetes: 如何自动生成join master的命令

kubeadm token

在客户机输入joih命令

查看节点

kubectl get nodes

kubectl get po –all-namespaces / kubectl get po –all-namespaces -o wide
FYI google安装

apt-get update && apt-get install -y apt-transport-https curl

科学上网,设置代理

export http_proxy=10.10.10.99:1087 && export https_proxy=10.10.10.99:1087

echo $http_proxy

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-kkey add –
cat </etc/apt/sources/list.d/kubernetes.list
deb http://apt.kubernetes.io/kubernetes-xenial main
EOF

apt-get update && apt-get install -y kubelet kubeadm kubectl

or apt-get install -c apt-poxy-config -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl 禁止更新
手动下载两个依赖镜像。 k8s 需要的镜像并没有保存在 dockerhub 上,而是保存在 google 的服务器上。好在使用 kubeadm 部署 k8s 时可以指定其他的镜像仓库,而 dockerhub 上有另一个镜像仓库,里面是 k8s 组件的镜像。这个镜像仓库叫做 mirrorgooglecontainers 。有两个依赖镜像没有被放到这个镜像仓库中:coredns/coredns 和 coreos/flannel 。我们先把这两个镜像下载下来。命令如下:
docker pull mirrorgooglecontainers/coredns:1.2.6

docker pull coredns/coredns:1.2.6
docker tag coredns/coredns:1.2.6 mirrorgooglecontainers/coredns:1.2.6

wget https://github.com/coreos/flannel/releases/download/v0.11.0/flanneld-v0.11.0-amd64.dockerdocker load < flanneld-v0.11.0-amd64.docker

第一个镜像是 k8s 内部使用的DNS和服务发现服务镜像,第二个镜像是网络插件 flannel 的镜像。第一个镜像需要改名与 mirrorgooglecontainers 一致, k8s 在安装开始的时候就会需要它,第二个镜像不用改名之后会用到。
开始部署 k8s ,命令如下:

kubeadm init –image-repository=mirrorgooglecontainers –pod-network-cidr=10.244.0.0/16

kubectl get pods –namespace=kube-system

插件所有 pod

是否都是 running

状态。如果不是 running

状态就需要查看 pod 描述

或者 pod 日志

来排查错误,这两条命令分别是:

查看pod描述,主要看最下面的events

kubectl -n kube-system describe pod xxxxxxx #pod名称

查看pod日志

kubectl -n kube-system logs xxxxxxx # pod名称#删除kubectl -n kube-system delete pod xxxxxxx # pod名称

忽略报错继续执行
在 init 时加上参数 –ignore-preflight-errors 后面跟错误的名称。

在重新执行 init 时,请先执行

重启 kubeadm reset

systemctl daemon-reload
systemctl restart docker

重启相关的服务

$systemctl restart kube-apiserver
$systemctl restart kube-controller-manager
$systemctl restart kube-scheduler

节点 服务
master etcd、kube-apiserver、kube-controller-manager和kube-scheduler组件
node flannel 、kubelet、kube-proxy

#让配置生效
systemctl daemon-reload

#启动服务
systemctl start etcd kube-apiserver.service kube-controller-manager kube-scheduler

#重启服务
systemctl restart etcd kube-apiserver.service kube-controller-manager kube-scheduler

#设定开机启动
systemctl enable etcd kube-apiserver.service kube-controller-manager kube-scheduler

#通过systemctl status 来验证服务启动的状态。

#日志查看
cat /var/log/messages |grep kube

#启动服务
systemctl start kubelet kube-proxy

#设定开机启动
systemctl enable kubelet kube-proxy

===================================================

安装 kubeadm

安装 kubectl

kubectl 是一个用于管理 Kubernetes 的命令行工具。

Linux安装kubectl(使用如下其中一种方式):

使用国内阿里云源安装

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

使用谷歌源安装(国内网路会很慢)
~ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl

MacOS安装kubectl(使用如下其中一种方式):

通过brew方式安装
~ brew install kubectl

通过国内阿里云源安装
~ curl -LO http://kubernetes.oss-cn-hangzhou.aliyuncs.com/kubernetes-release/release/curl -s http://kubernetes.oss-cn-hangzhou.aliyuncs.com/kubernetes-release/release/stable.txt/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl

通过谷歌源安装(国内网路会很慢)
~ curl -LO https://storage.googleapis.com/kubernetes-release/release/curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl

安装完成后,查看版本:
~ kubectl version

经常Pull失败的文件

docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
docker rmi quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.1 gcr.io/kubernetes-helm/tiller:v2.14.1
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.25.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.25.1 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.25.1

docker pull googlecontainer/defaultbackend-amd64:1.5
docker tag googlecontainer/defaultbackend-amd64:1.5 k8s.gcr.io/defaultbackend-amd64:1.5
docker rmi googlecontainer/defaultbackend-amd64:1.5

docker pull sacred02/kubernetes-dashboard-amd64:v1.10.1
docker tag sacred02/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
docker rmi sacred02/kubernetes-dashboard-amd64:v1.10.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.2 gcr.io/google_containers/metrics-server-amd64:v0.3.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.2

docker pull registry.cn-hangzhou.aliyuncs.com/jaxzhai/k8szk:v3
docker tag registry.cn-hangzhou.aliyuncs.com/jaxzhai/k8szk:v3 gcr.io/google_samples/k8szk:v3
docker rmi registry.cn-hangzhou.aliyuncs.com/jaxzhai/k8szk:v3

k8s:

MY_REGISTRY=gcr.azk8s.cn/google-containers

拉取镜像

docker pull {MY_REGISTRY}/kube-apiserver:v1.15.1
docker pull {MY_REGISTRY}/kube-controller-manager:v1.15.1
docker pull {MY_REGISTRY}/kube-scheduler:v1.15.1
docker pull {MY_REGISTRY}/kube-proxy:v1.15.1
docker pull {MY_REGISTRY}/pause:3.1
docker pull {MY_REGISTRY}/etcd:3.3.10
docker pull ${MY_REGISTRY}/coredns:1.3.1

添加Tag

docker tag {MY_REGISTRY}/kube-apiserver:v1.15.1 k8s.gcr.io/kube-apiserver:v1.15.1
docker tag {MY_REGISTRY}/kube-controller-manager:v1.15.1 k8s.gcr.io/kube-controller-manager:v1.15.1
docker tag {MY_REGISTRY}/kube-scheduler:v1.15.1 k8s.gcr.io/kube-scheduler:v1.15.1
docker tag {MY_REGISTRY}/kube-proxy:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1
docker tag {MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag {MY_REGISTRY}/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag ${MY_REGISTRY}/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

#删除无用的镜像
docker images | grep {MY_REGISTRY} | awk ‘{print “docker rmi “ 1“:”$2}’ | sh -x
echo “end”

节点卸载

使用kubeadm 命令 删除节点 。

kubectl drain –delete-local-data –force –ignore-daemonsets
kubectl delete node
kubeadm reset

开启IPV4转发
在/etc/sysctl.conf新添加如下参数
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0

生效命令:
sysctl -p
查看
sysctl -a|grep “ip_forward”

Mysql

sudo docker pull mysql:5.6

sudo docker run -itd -p 3306:3306 --name mysql -v ~/mysql/data:/var/lib/mysql -v ~/mysql/conf:/etc/mysqll/conf.d -v ~/mysql/logs:/var/log/mysql  -e MYSQL_ROOT_PASSWORD=PW123456 --restart always mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
PS:The default configuration for MySQL can be found in /etc/mysql/my.cnf, which may !includedir additional directories such as /etc/mysql/conf.d or /etc/mysql/mysql.conf.d. Please inspect the relevant files and directories within the mysql image itself for more details.

远程不能访问时需要进入docker本地客户端设置远程访问账号

$ sudo docker exec -it mysql bash
$ mysql -u root -p PW123456
mysql> grant all privileges on *.* to root@'%' identified by "password";

修改MySQL配置文件有两种方法:
一是进入容器,修改容器里的MySQL的配置文件,然后重新启动容器:
docker exec -it mysqlserver /usr/bin/bash
然后可以进入容器的命令行模式,接着修改 /etc/mysql/my.cnf 文件即可
二是挂载主机的mysql配置文件 -v /my/custom:/etc/mysql/conf.d

查看编码

show variables like 'character%';
show variables like 'collation_%';

SSH

  • SERVER
    sudo apt -y install openssh-server
    sudo vi /etc/ssh/sshd_config
    在行”#PermitRootLogin prohibit-password”后
    添加行”PermitRootLogin yes”并保存。
    sudo update-rc.d ssh defaults”开启ssh服务开机自启动
    输入命令”sudo service sshd start”启动服务
    输入命令”sudo service sshd status”查看服务运行状态

  • CLIENT
    sudo apt -y install openssh-client

统一配制中心 Config

/{name}-{profiles}.yml

/{lable}/{name}-{profiles}.yml

label 分支(bracndh)

name 服务名

profiles 环境

order-dev(XXX).yml启动时会与order.yml合并下发,可以将通用的配制信息写入order.yml,差异的写在不同的环境文件中,

将eureka的注册地址写在代码配制文件中

SERVER

““ org.springframework.cloud spring-cloud-config-server ““ SpringCloud Bus 自动刷新配制 ““ org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-config-client ““ 客户端配制文件 ““ bootstrap.yml spring: application: name: product cloud: config: profile: master discovery: enabled: true service-id: CONFIG ““ RabbitMQ消息队列 ““ WebHooks :post www.xxx.com:8080/actuator/bus-refresh github www.xxx.com/monitor(不是actuator/bus-refresh) josn ““ ***微服务先访问eureka,再读取配制中心,注意eureka端口不是8761时,配制内容的顺序*** Webhook 报错在接收json数据时置空,详情见代码仓库 ““ JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 452] (through reference chain: java.util.LinkedHashMap[“project”])] ““

/{name}-{profiles}.yml

/{lable}/{name}-{profiles}.yml

label 分支(bracndh)

name 服务名

profiles 环境

order-dev(XXX).yml启动时会与order.yml合并下发,可以将通用的配制信息写入order.yml,差异的写在不同的环境文件中,

将eureka的注册地址写在代码配制文件中

SERVER

““ org.springframework.cloud spring-cloud-config-server ““ SpringCloud Bus 自动刷新配制 ““ org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-config-client ““ 客户端配制文件 ““ bootstrap.yml spring: application: name: product cloud: config: profile: master discovery: enabled: true service-id: CONFIG ““ RabbitMQ消息队列 ““ WebHooks :post www.xxx.com:8080/actuator/bus-refresh github www.xxx.com/monitor(不是actuator/bus-refresh) josn ““ ***微服务先访问eureka,再读取配制中心,注意eureka端口不是8761时,配制内容的顺序*** Webhook 报错在接收json数据时置空,详情见代码仓库 ““ JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 452] (through reference chain: java.util.LinkedHashMap[“project”])] ““

Docker

官网 https://www.docker.com/
安装 https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/#docker-ee-customers
镜像市场 http://hub.docker.com
教程 https://www.runoob.com/docker/docker-tutorial.html
国内高速下载Docker 以及 docker-compose 地址
http://get.daocloud.io
https://blog.csdn.net/nklinsirui/article/details/80610058

Aliyun Ubuntu 14.04/16.04(使用 apt-get 进行安装)

# step 1: 安装必要的一些系统工具
sudo apt-get update
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
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1ce-0ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages#   docker-ce | 17.03.0ce-0ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1ce-0ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.

#使用快速安装ubuntu 18
sudo apt install docker.io

增加配制:自己的仓库地址,镜像仓库地址X需更改,使用systemd与K8s同样配制

增加配制:3自己的仓库地址,镜像仓库地址X需更改,使用systemd与K8s同样配制 /etc/docker/daemon.json
{
 "insecure-registries":["harbor.com","192.168.88.128:5000"],
 "registry-mirrors":["https://cuzn52fX.mirror.aliyuncs.com","https://reg-mirror.qiniu.com","https://registry.docker-cn.com"],
 "exec-opts": ["native.cgroupdriver=systemd"],
 "storage-driver": "overlay2",
 "storage-opts": ["overlay2.override_kernel_check=true"],
 "log-driver": "json-file",
 "log-opts": {
    "max-size": "100m",
    "max-file": "3"
    },
 "max-concurrent-downloads": 5,
  "max-concurrent-uploads": 5
}

# 将Docker加入开启启动
$ sudo systemctl enable docker
# 启动Docker
$ sudo systemctl start docker
systemctl daemon-reload 重新加载
systemctl restart docker 重启docker

建立Docker用户组
默认情况下,docker命令会使用Unix Socket与Docker引擎通信,只有root用户和docker组的用户才可以访问Docker引擎的Unix Socket。出于安全考虑,一般不会直接使用root用户,所以需要先建立docker组,并将当前用户添加到docker组中。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER

docker info

docker version

docker ps -a

docker images

docker exec -it container-id /bin/bash       exit

docker logs -f container-id

docker stop -f container-id

docker rmi Image-file

docker rm container-id

docker login

bocker build -t coustName:tag .

bocker build -t coustName:tag -f path

docker tag mysql:5.6 myreg/mysql:1.0

docker push myreg/mysql:1.0

Dockerfile

常用其它镜像地址:

七牛 quay-mirror.qiniu.com

卸载旧版本:

sudo systemctl stop docker
sudo apt-get purge docker-ce

sudo apt-get remove docker docker-ce docker-io

mediasoup安装

下载

git clone https://github.com/versatica/mediasoup-demo.git

cd mediasoup-demo

git checkout v3

 app客户端
broadcasters广播推流
server服务器端,媒体服务(管道通信)与信令服务

配置服务器

cd server

npm install

cp config.example.js config.js

// Listening hostname (just for gulp live task).
domain : process.env.DOMAIN || ‘localhost‘,
// Signaling settings (protoo WebSocket server and HTTP API server).
https :
{
listenIp : ‘0.0.0.0’,
// NOTE: Don’t change listenPort (client app assumes 4443).
listenPort : process.env.PROTOO_LISTEN_PORT || 4443,
// NOTE: Set your own valid certificate files.
tls :
{
cert : process.env.HTTPS_CERT_FULLCHAIN || ${__dirname}/certs/<strong><span style="color: #ff0000;">fullchain.pem</span></strong>,//证书
key : process.env.HTTPS_CERT_PRIVKEY || ${__dirname}/certs/<span style="color: #ff0000;"><strong>privkey.key</strong></span> //证书
}
},

// See https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
webRtcTransportOptions :
{
listenIps :
[
{
ip : process.env.MEDIASOUP_LISTEN_IP || ‘1.2.3.4′,  //服务器IP或0.0.0.0,浏览器的传输
announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
}
],
initialAvailableOutgoingBitrate : 1000000,
minimumAvailableOutgoingBitrate : 600000,
maxSctpMessageSize : 262144,
// Additional options that are not part of WebRtcTransportOptions.
maxIncomingBitrate : 1500000
},

// See https://mediasoup.org/documentation/v3/mediasoup/api/#PlainRtpTransportOptions
plainRtpTransportOptions :
{
listenIp :
{
ip : process.env.MEDIASOUP_LISTEN_IP || ‘1.2.3.4‘, //普通的传输
announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
},
maxSctpMessageSize : 262144
}

/启动server
npm start

//客户端安装 app目录
npm install
npm install -g gulp-cli
gulp live //客户端
gulp dist //生成发布目录/server/public

启动nodejs服务
node app.js
nohup node app.js &
forever start app.js 推荐此方式

调试
node –inspect-brk server.js
chrome://inspect
再根据需要设置断点

ubuntu重启、关机命令

重启命令 :
1、reboot
2、shutdown -r now 立刻重启
3、shutdown -r 10 过10分钟自动重启
4、shutdown -r 20:35 在时间为20:35时候重启

如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启

关机命令 :
1、halt 立刻关机(一般加-p 关闭电源)
2、poweroff 立刻关机
3、shutdown -h now 立刻关机
4、shutdown -h 10 10分钟后自动关机

如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消关机

 

1.shutdown

shutdown命令安全地将系统关机。
有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。

shutdown 参数说明:

[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r] 重启计算器。
[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h] 关机后关闭电源〔halt〕。
[-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。
[-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。
[-f] 在重启计算器〔reboot〕时忽略fsck。
[-F] 在重启计算器〔reboot〕时强迫fsck。
[-time] 设定关机〔shutdown〕前的时间。

例如:

/sbin/shutdown -h now-----立即关机;
/sbin/shutdown -h 20:49----20:49分关机
/sbin/shutdown -h +10-----10分钟后关机
/sbin/shutdown -r now -----立即重启
/sbin/shutdown -r +10 ‘The system will reboot’----10分钟后系统重启并给每个登录用户发通知
/sbin/shutdown -k now ‘The system will reboot’----仅给每个登录用户发通知并不真关机

2.halt—-最简单的关机命令

其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。

参数说明:

[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。

[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。

3.reboot

reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。

4.init

init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机﹐init1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。

5.poweroff

关机,在多用户方式下(Runlevel 3)不建议使用.

profile与bashrc

在一般的 linux 或者 unix 系统中, 都可以通过编辑 bashrc 和 profile 来设置用户的工作环境, 很多文章对于 profile 和 bashrc 也都有使用, 但究竟每个文件都有什么作用和该如何使用呢?

常见操作系统中的bashrc和profile

我们先来看一下常见的Linux系统中的bashrc和profile:

在CentOs中:

/etc/profile /etc/bashrc

~/.bashrc ~/.bash_profile

在Ubuntu,Debian中:

/etc/profile /etc/bash.bashrc

~/.bashrc ~/.profile

Shell的种类

在理解这些文件之前还需要了解Shell的 login(登入) 和 interactive(交互式) 模式.

login shell 和 no-login shell

Linux系统中shell分为很多种,比如bash,sh,zsh之类的,如果想要查看一个用户使用的是什么shell,可以通过finger [username]命令来查看。我们这里只说shell是bash的情况,因为如果是sh或者其他shell,显然不会运行bashrc的。

“login shell” 代表用户登入, 比如使用 “su -” 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式,该模式下的shell会去自动执行 /etc/profile 和 ~/.profile 文件,但不会执行任何的bashrc文件,所以一般在 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件。

而 no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell,该模式下是不会自动去运行任何的 profile 文件。

interactive shell 和 non-interactive shell

interactive shell 是交互式shell,顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令,该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件。
non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash,该模式下不会执行任何的 rc 文件, 不过还存在一种特殊情况