存档12月 2019

Ubuntu安装NFS,实现网络文件共享

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

嵌入式应用中就是用网线将主机与开发板连接起来。在主机开启nfs服务后,就可以像ftp一样传文件到开发板了,有的人会问,不如直接用ftp好了,但是nfs还可以挂载根文件系统啊!这样开发板直接可以用PC上的文件系统去启动了。

以下配置主要思路是在PC的Linux端开启NFS服务器端,共享一个文件夹,通过配置文件允许网络上的其他设备去挂载使用。

  1. 安装:sudo apt-get install nfs-kernel-server

  2. 启动:sudo /etc/init.d/nfs-kernel-server restart 或 sudo service nfs-kernel-server start

  3. 查看状态:sudo service nfs-kernel-server status

状态/启动/关闭/重启:sudo service nfs-kernel-server status|start|stop|restart

  1. 建立共享网络文件夹:sudo mkdir /home/nfs

  2. 设置目录和权限:

打开/etc/exports文件,在末尾添加:

/home/nfs *(rw,sync,no_root_squash)

/home/nfs 表示 nfs 共享目录,它可以作为开发板的根文件系统通过 nfs 挂接
* 表示所有的客户机都可以挂接此目录
rw 表示挂接此目录的客户机对该目录有读写的权力
no_root_squash 表示允许挂接此目录的客户机享有该主机的 root 身份

  1. 重启NFS:sudo service nfs-kernel-server restart

  2. 测试NFS:将共享文件夹挂在到本机的一个文件/home/test下:

sudo mount -t nfs -o nolock localhost:/home/nfs /home/test

如果test下目录变得和nfs目录下一致则说明挂载成功。

  1. ARM开发板挂载本机文件夹

串口登陆ARM,挂载: mount -t nfs -o nolock 192.168.15.124:/home/nfs /mnt

192.168.15.124是本机的IP地址,ARM开发板的IP地址是192.168.15.95。进入/mnt下查看,成功挂载本机下的文件夹。

如果报错,出现:mount: wrong fs type, bad option, bad superblock on 125.64.41.244

是因为没有安装 mount.nfs了,我们只要安装mount.nfs就不会有wrong fs type, bad option, bad superblock错误提示了哦。

apt-get update

apt-get install nfs-common

  1. umount卸载

在不需要挂载的时候需要umount卸载掉,比如sudo umont /mnt。卸载的时候有时候会因为进程在运行,提示无法卸载“umount: /mnt: device is busy”,这时需要sudo umount -l /mnt在空闲的时候卸载。或查找到进程,强制删除进程后卸载fuser -km /mnt,详情参考fuser用法,在查询文件或套接字被占用和杀死进程的时候经常会用到。

  1. 说明:ARM开发板可以将根文件系统挂载到网络文件系统(NFS)上,启动的时候从NFS上启动。这样在开发调试阶段就很方便,不需要用SD卡或其他方式启动。而且ARM的存储空间也变得大得多,因为存储挂载到其他大容量的设备上了,比如PC。此功能没有实际运行,后期再尝试应用。

k8s web管理 dashboard

确保kubernetes环境正常
官网说明
在GitHub官网中获取dashboard的资源清单:https://github.com/kubernetes/dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

或手动下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
修改配置文件:
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort ##增加此字段
ports:
– port: 443
targetPort: 8443
nodePort: 30443 #增加
selector:
k8s-app: kubernetes-dashboard

#因为自动生成的证书很多浏览器无法使用,所以我们自己创建,注释掉kubernetes-dashboard-certs对象声明
#apiVersion: v1
#kind: Secret
#metadata:
#  labels:
#    k8s-app: kubernetes-dashboard
#  name: kubernetes-dashboard-certs
#  namespace: kubernetes-dashboard
#type: Opaque
===================================
创建证书
mkdir dashboard-certs
cd dashboard-certs/
#创建命名空间
kubectl create namespace kubernetes-dashboard    #yaml里会自动创建,可以不用单独创建
#创建key文件
openssl genrsa -out dashboard.key 2048
#证书请求
openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
#自签证书
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#创建kubernetes-dashboard-certs对象
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

master上传所需的软件包,可以先下载
kubernetesui/dashboard:v2.0.0-beta8
kubernetesui/metrics-scraper:v1.0.2
安装
kubectl apply -f recommended.yaml
#检查结果
kubectl get pods -A -o wide
kubectl get service -n kubernetes-dashboard -o wide

创建dashboard管理员

cat >> dashboard-admin.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard
EOF

kubectl create -f dashboard-admin.yaml

为用户分配权限:

cat >>dashboard-admin-bind-cluster-role.yaml<<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-bind-cluster-role
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
EOF

kubectl create -f dashboard-admin-bind-cluster-role.yaml

访问地址:http://NodeIP:30443

创建service account并绑定默认cluster-admin管理员集群角色:

$ kubectl create serviceaccount dashboard-admin -n kube-system
$ kubectl create clusterrolebinding dashboard-admin –clusterrole=cluster-admin –serviceaccount=kube-system:dashboard-admin
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk ‘/dashboard-admin/{print $1}’)
使用输出的token登录Dashboard。

Name:         dashboard-admin-token-nlhcc
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: 392bdc7a-4032-4ef1-b5b7-f8d8a816b3b2

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Im9IXzlYU1d0Ukhsc194aWk5R29TV2h3WGRkaF9LMEVOVWxpRW1IYXBUNUEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbmxoY2MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzkyYmRjN2EtNDAzMi00ZWYxLWI1YjctZjhkOGE4MTZiM2IyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Jd8vxPSJWvA8vwxgMZ-uSMGPHh7lY2U91Ui5mAZXH25ThSbbbHJotK1A5h6vu4XreGESBiGMKrI1sZViI4ZhaSFt2e25KrwhliYRxEZaJ5hRsBFdxc8sU16UJX9ctHMQ9RbnZyhY8gL7s2Fmz18Keowa5e-bJL7dAyeqH9WtUi_liDZHIKLtf1EtnmOE-NFxGJ7NwZYS6ZsMUXu0e0XkuhkQRE8gVof1QxuJGxtVCw0V8dNCIgzBbbpkSEWXqzHVM5Cceaf888GXqjryvIHJ-UGvKoVc2m_MRpIqLRqjmsHCFGDTFdrWk0XQDT1NcS5jAK6YJ6WW6lhrj5c65puSDQ

.安装metrics-server

在Node上下载镜像文件:

docker pull bluersw/metrics-server-amd64:v0.3.6
docker tag bluersw/metrics-server-amd64:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6

在Master上执行安装:

git clone https://github.com/kubernetes-incubator/metrics-server.git
cd metrics-server/deploy/1.8+/
修改metrics-server-deployment.yaml
image: k8s.gcr.io/metrics-server-amd64  #在image下添加一下内容
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP

查找runAsNonRoot: true  修改为runAsNonRoot: false

kubectl create -f .

如果不能获取不到镜像可以更改image: mirrorgooglecontainers/metrics-server-amd64:v0.3.6

说明:service的三种端口
port:service暴露在集群ip上的端口,提供给集群内部客户访问service入口
odePort:是k8s提供给集群外部客户访问service入口的一种方式
targetPort:targetPort是pod中容器实例上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetport上进入容器

vim /etc/kubernetes/dashboard-deployment.yaml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    # Keep the name in sync with image version and
    # gce/coreos/kube-manifests/addons/dashboard counterparts
      name: kubernetes-dashboard-latest
      namespace: kube-system
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            k8s-app: kubernetes-dashboard
            version: latest
            kubernetes.io/cluster-service: "true"
        spec:
          containers:
          - name: kubernetes-dashboard
            image: docker.io/bestwu/kubernetes-dashboard-amd64:v1.6.3
            imagePullPolicy: IfNotPresent
            resources:
              # keep request = limit to keep this container in guaranteed class
              limits:
                cpu: 100m
                memory: 50Mi
              requests:
                cpu: 100m
                memory: 50Mi
            ports:
            - containerPort: 9090
            args:
            - --apiserver-host=http://10.3.20.100:8080
            livenessProbe:
              httpGet:
                path: /
                port: 9090
              initialDelaySeconds: 30
              timeoutSeconds: 30

[root@master-ldy ~]# vim /etc/kubernetes/dashboard-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        kubernetes.io/cluster-service: "true"
    spec:
      selector:
        k8s-app: kubernetes-dashboard
      ports:
      - port: 80
        targetPort: 9090

FYI1
FYI2

k8s 管理平台 Rancher

rancher
rancher CN

什么版本的Docker才能适配Rancher和Kubernetes
请参考:(http://rancher.com/docs/rancher/v1.6/zh/hosts/#docker)

https://rancher.com/ 新版 V2.X

swapoff -a

docker run  --name rancher --privileged -d --restart=unless-stopped -p 8080:80 -p 8443:443 -v ~/rancher/data:/var/lib/rancher/ rancher/rancher:v2.5.7

docker run -d --name rancher \
-v ~/rancher/data:/var/lib/rancher/ \
--restart=unless-stopped \
--privileged \
-p 8080:80 -p 8443:443 \
-e CATTLE_SYSTEM_CATALOG=bundled \
rancher/rancher:stable \

-v ~/rancher/certs:/container/certs \
-e SSL_CERT_DIR="/container/certs" \
--no-cacerts

-v ~/rancher/certs/sercert.pem:/etc/rancher/ssl/cert.pem \
-v ~/rancher/certs/serprivkey.pem:/etc/rancher/ssl/key.pem \
-v ~/rancher/certs/cacert.pem:/etc/rancher/ssl/cacerts.pem \
--no-cacerts

scp -r D:/Desktop/temp/ ubuntu@119.29.57.229:~/rancher/certs/

证书过期
docker exec c -ti 5b4b6e274b31 mv /var/lib/rancher/management-state/certs/bundle.json /var/lib/rancher/management-state/certs/bundle.json-bak

直接把/var/lib/rancher/k3s/server/tls/下已过期的证书(.crt和.key)删掉,大概有14个,也可以生成新的证书,解决过期问题

重新升级部署前
sudo rm -rf /var/lib/etcd/member/
安装完成后可以通过http://ip:8080 访问Rancher的管理平台

K8S中国区镜像模板配置
打开环境管理页面,点击添加环境模板。命名模板并进入配置页,配置阿里巴巴镜像仓库
私有仓库地址:registry.cn-shenzhen.aliyuncs.com
AAONS组件命名空间:rancher_cn
kubernetes-helm命名空间:rancher_cn
Pod Infra Container Image: rancher_cn/pause-amd64:3.0
保存模板,创建一个Kubernetes环境并添加主机.

部署前或部署时,请使用以下命令将环境的各类信息清理干净:
docker rm -f `docker ps -a -q`
docker system prune -f
docker volume rm $(docker volume ls -q)

for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done

sudo rm -rf /etc/ceph \
       /etc/cni/* \
       /opt/cni/* \
       /opt/rke \
      /etc/kubernetes \
       /run/secrets/kubernetes.io \
       /run/calico/* \
       /run/flannel/* \
       /var/lib/calico/* \
       /var/lib/cni/* \
       /var/lib/kubelet/* \
       /var/lib/rancher/rke/log \
       /var/log/containers/* \
       /var/log/pods/* \
       /var/run/calico/* \
       /var/lib/rancher/* \
       /var/lib/docker/* \
       /var/lib/etcd/* \
      /var/lib/kubelet/* \
  ~/rancher/*

ip link del flannel.1
ip link del cni0

sudo rm -f /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
sudo systemctl restart containerd
sudo systemctl restart docker

iptables -F && iptables -t nat -F

.rke remove
重启

k8s集群管理平台 wayne

### wayne
https://github.com/Qihoo360/wayne.git
架构

说明文档

开发版项目依赖
Golang 1.12+(installation manual)
Docker 17.05+ (installation manual)
Bee (installation manual) (请务必使用链接版本,不要使用 beego 官方版本,存在一些定制)
Node.js 8+ and npm 5+ (installation with nvm)
MySQL 5.6+ (Wayne 主要数据都存在 MySQL 中)
RabbitMQ (可选,如需扩展审计功能,例如操作审计和 Webhooks 等,则需部署)

快速启动
克隆代码仓库
$ go get github.com/Qihoo360/wayne
启动服务
在 Wayne 的根目录下,通过 docker-compose 创建服务
$ docker-compose -f ./hack/docker-compose/docker-compose.yaml up
通过上述命令,您可以从通过 http://127.0.0.1:4200 访问本地 Wayne, 默认管理员账号 admin:admin。
注意:项目启动后还需要配置集群和Namespace等信息才可正常使用。详见 集群配置

由于前后端使用 JWT Token 通信,生产环境一定要重新生成 RSA 文件,确保安全。生成 RSA 加密对命令如下:
$ ssh-keygen -t rsa -b 2048 -f jwtRS256.key
$ # Don’t add passphrase
$ openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub

harbor 镜像仓库

代码仓库
项目网站
离线包下载

安装

  1. 安装 docker
  2. 安装 docker-compose
  3. 下载 harbor
    wget https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz
  4. 解压
  5. 创建数据目录
    /data/harbor
  6. 创建CA证书
    /data/harbor/cert

    • 创建CA的证书
      openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
    • 生成CA证书签名请求
      openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.xxx.com.key -out harbor.xxx.com.csr
    • 生成注册主机的证书
    1. 使用域名生成注册主机证书
      openssl x509 -req -days 365 -in harbor.xxx.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.xxx.com.crt
    2. 使用IP生成注册主机证书
      echo subjectAltName = IP:192.168.88.88 > extfile.cnf
      openssl x509 -req -days 365 -in harbor.xxx.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out harbor.xxx.com.crt
  7. 配制 配置文件 harbor.cfg or harbor.yml

#配置访问的地址
hostname = 198.168.88.88
#使用http方式访问管理界面
ui_url_protocol = http
#配置admin的密码,默认是Harbor12345
harbor_admin_password = 12345
#更改harbor存储路径,默认是/data
secretkey_path = /data/harbor
certificate: /data/harbor/cert/harbor.xxx.com.crt
private_key: /data/harbor/cert/harbor.xxx.com.key
  1. 配置文件docker-compose.yml
  /compose_location/docker-compose.yml
  1. 检测并创建harbor需要文件
    ./prepare
  2. 安装Harbor
    ./install.sh

  3. 保存数据重新安装 (先进入harbor目录)
    docker-compose up -d
    docker-compose down -v
    ./install.sh可以重新安装

默认安装管理Harbor的生命周期

ocker-compose ps 查看
开始、停止、重启
您可以使用docker-compose来管理Harbor的生命周期。一些有用的命令列出如下(必须与docker-compose.yml在同一目录中运行)。
sudo docker-compose start/stop/restart
更新配置
要更改Harbour的配置,请先停止现有的Harbor实例并进行更新harbor.cfg。然后运行prepare脚本以填充配置。最后重新创建并启动Harbor的实例:
sudo docker-compose down -v
sudo vim harbor.cfg
sudo prepare
sudo docker-compose up -d
删除Harbor的容器,同时将镜像数据和Harbor的数据库文件保存在文件系统上
sudo docker-compose down -v
删除Harbor的数据库和镜像数据(用于干净的重新安装)
rm -r /data/database
rm -r /data/registry

  1. 管理界面
    注:默认的用户名admin,密码Harbor12345。

  2. 错误

    • Error response from daemon: Get https://harbor.xxx.com/v1/users/: x509: certificate signed by unknown authority
      centos7系统以上报错的原因是因为自签的证书没有加入到系统级别信任,只需要将harbor.xxx.com.crt拷贝到/etc/pki/ca-trust/source/anchors/reg.你的域名.crt,然后需要执行命令update-ca-trust,最后重启harbor和docker即可!
      ubunt16.04系统以上报错的原因是因为自签的证书没有加入到系统级别信任,只需要将harbor.xxx.com.crt拷贝到/usr/local/share/ca-certificates/reg.你的域名.crt,然后执行命令update-ca-certificates,最后重启harbor和docker即可!
      /usr/share/ca-certificates/reg.你的域名.crt
      图形化配制 dpkg-reconfigure ca-certificates
      client:
      确认证书是 crt 结尾的,不是按照如下命令转换
      $ openssl x509 -inform PEM -in root-ca.cer -out root-ca.crt
      拷贝证书文件到 /usr/local/share/ca-certificates
      $ sudo cp root-ca.crt /usr/local/share/ca-certificates/
      修改ca 配置文件
      编辑 /etc/ca-certificates.conf。文件最后加入 ‘root-ca.crt’。里面文件的位置是相对 /usr/local/share/ca-certificates/
      更新本机的ca 文件
      $ sudo update-ca-certificates
      Mac OS X
      添加证书:
      sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/new-root-certificate.crt
      移除证书:
      sudo security delete-certificate -c “”
  • Error response from daemon: Get https://192.168.88.88/v2/: dial tcp 192.168.88.88:443: connect: connection refused
    在docker启动文件中添加–insecure-registry信任关系!
    cat /usr/lib/systemd/system/docker.service -> –insecure-registry=harbor仓库IP地址+端口号
    修改docker客户端配置/etc/default/docker
    备注:增加harbor私有仓库地址,告知客户端要连接http的端口
    DOCKER_OPTS=”–selinux-enabled –log-driver=journald –signature-verification=false –insecure-registry=192.168.88.98″
    Server DOCKER_OPTS=”–insecure-registry 192.168.88.98″
    vi /etc/systemd/system/multi-user.target.wants/docker.service
    ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
  • denied: requested access to the resource is denied
    vi /etc/docker/daemon.json
    {
    "insecure-registries":["192.168.88.98:5000"],
    "registry-mirrors":["https://cuzn52f3.mirror.aliyuncs.com","https://registry.docker-cn.com","https://reg-mirror.qiniu.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
    }
    vi /etc/default/docker
    DOCKER_OPTS="--insecure-registry 192.168.88.98"
    vi /etc/systemd/system/multi-user.target.wants/docker.service
    可以在systemctl status docker 中查看具体配制文件路径
    ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

    删除证书
    $sudo rm -f /usr/local/share/ca-certificates/xinmu.crt
    $sudo update-ca-certificates
    或编辑 /etc/ca-certificates.conf 文件,把证书对应的行删除或注释掉。然后用命令 update-ca-certificates 使之生效。

    1. FYI
      (https://blog.51cto.com/13043516/2287267)
      (http://blog.itpub.net/28624388/viewspace-2153546/)

Docker Compose

Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

安装 Docker Compose

官网
1. 安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

使用工具安装 pip install docker-compose

  1. 查看安装是否成功
    docker-compose -v

快速入门

  1. 打包项目,获得 jar 包 docker-demo-0.0.1-SNAPSHOT.jar
    mvn clean package
  2. 在 jar 包所在路径创建 Dockerfile 文件,添加以下内容
    FROM java:8
    VOLUME /tmp
    ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
    RUN bash -c ‘touch /app.jar’
    EXPOSE 9000
    ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-jar”,”app.jar”]
  3. 在 jar 包所在路径创建文件 docker-compose.yml,添加以下内容
version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
  docker-demo:  # 指定服务名称
    build: .  # 指定 Dockerfile 所在路径
    ports:    # 指定端口映射
      - "9000:8761"

在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器
docker-compose up
docker-compose up -d // 后台启动并运行容器
访问 http://localhost:9000/hello 即可访问微服务接口

工程、服务、容器

Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
Docker Compose 常用命令与配置

常见命令

ps:列出所有运行容器
docker-compose ps
logs:查看服务日志输出
docker-compose logs
port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
docker-compose port eureka 8761
build:构建或者重新构建服务
docker-compose build
start:启动指定服务已存在的容器
docker-compose start eureka
stop:停止已运行的服务的容器
docker-compose stop eureka
rm:删除指定服务的容器
docker-compose rm eureka
up:构建、启动容器
docker-compose up
kill:通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka
pull:下载服务镜像
scale:设置指定服务运气容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3
run:在一个服务上执行一个命令
docker-compose run web bash
docker-compose.yml 属性

version:指定 docker-compose.yml 文件的写法格式
services:多个容器集合
build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数

““

build: ./dir

build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
command:覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000

command: [bundle,exec,thin,-p,3000]
dns:配置 dns 服务器,可以是一个值或列表

dns: 8.8.8.8

dns:
– 8.8.8.8
– 9.9.9.9
dns_search:配置 DNS 搜索域,可以是一个值或列表

dns_search: example.com

dns_search:
– dc1.example.com
– dc2.example.com
environment:环境变量配置,可以用数组或字典两种方式
environment:
RACK_ENV: development

SHOW: ‘ture’

environment:
– RACK_ENV=development
– SHOW=ture
env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量

env_file: .env

env_file:
– ./common.env
expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
expose:
– “3000”
– “8000”
image:指定服务所使用的镜像
image: java
network_mode:设置网络模式
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”
ports:对外暴露的端口定义,和 expose 对应
ports: # 暴露端口信息 – “宿主机端口:容器暴露端口”
– “8763:8763”
– “8763:8763”
links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links: # 指定服务名称:别名
– docker-compose-eureka-server:compose-eureka
volumes:卷挂载路径
volumes:
– /lib
– /var
logs:日志输出信息
–no-color 单色输出,不显示其他颜.
-f, –follow 跟踪日志输出,就是可以实时查看日志
-t, –timestamps 显示时间戳
–tail 从日志的结尾显示,–tail=200
Docker Compose 其它

更新容器

当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去
links

服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务

version: ‘2’
services:
web:
build: .
links:
– “db:database”
db:
image: postgres
这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了

使用xrdp远程桌面连接

安装服务

sudo apt-get -y install xfce4 xrdp vnc4server

配置xfce4桌面会话文件

echo xfce4-session>.xsession

cat .xsession

ls -all

mstsc,输入ubuntu ip地址,默认端口:3350确定

使用远程桌面连接,如果输入正确的用户名和密码链接出错

apt-get purge tightvnc xrdp

apt-get install tightvncserver xrdp

sudo /etc/init.d/xrdp restart

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

 安装tigervnc-server

apt -y install tightvncserver

vncserver命令启动vnc服务,设置输入秘钥

设置vnc参数编辑/etc/sysconfig/vncservers,参考最后面的参数设置。

1024×768是分辨率,后面的IP是vnc服务器的IP

重启vnc服务,/etc/init.d/vncserver restart

下载vnc客户端VNC客户端

netstat查看服务器的端口,然后设置客户端连接

 

ubuntu防火墙ufw

sudo apt-get install ufw
sudo ufw enable
sudo ufw default deny 

sudo ufw disable 
sudo ufw status 

sudo ufw allow 80 允许外部访问80端口

sudo ufw delete allow 80 禁止外部访问80 端口

sudo ufw allow from 192.168.1.1 允许此IP访问所有的本机端口

sudo ufw deny smtp 禁止外部访问smtp服务

sudo ufw delete allow smtp 删除上面建立的某条规则

sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22 要拒绝所有的TCP流量从10.0.0.0/8 到192.168.0.1地址的22端口

可以允许所有RFC1918网络(局域网/无线局域网的)访问这个主机(/8,/16,/12是一种网络分级):
sudo ufw allow from 10.0.0.0/8

sudo ufw allow from 172.16.0.0/12

sudo ufw allow from 192.168.0.0/16

FRP

FRP 项目地址:https://github.com/fatedier/frp
https://www.cnblogs.com/sanduzxcvbnm/p/8508741.html

一键安装脚本项目地址:https://github.com/clangcn/onekey-install-shell/

下载一键部署脚本
$ wget –no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh

$ chmod 700 ./install-frps.sh 授权
这个一键部署脚本比较好用,为了提高国内用户下载安装包速度还提供了阿里云节点的安装源。整个脚本使用起来也比较简单,对一些常用的 FRP 服务端配置参数都做了交互式选择让用户可以方便的根据自己实际情况进行选择。脚本比较贴心的一点是对默认的公网地址进行了检测,省去了手动输入的麻烦。

install-frps.sh {install|uninstall|update|config}
配置 FRP $ ./install-frps.sh config
更新 FRP 服务端$ ./install-frps.sh update
卸载 FRP 服务端$ ./install-frps.sh uninstall

FRP 服务端安装完成后,一键部署脚本还提供了一个日常管理 FRP 服务端的管理脚本来进行日常的启动、重启、停止等操作,非常的方便。
frps status manage : frps {start|stop|restart|status|config|version}
新版可以直接使用不用以下配制

Usage: /etc/init.d/frps {start|stop|restart|status|config|version}

手动安装后配制成为服务启动 /etc/systemd/system# vi frps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
# User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
# /root/frp_0.20.0_linux_amd64
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

#启动 frp 并设置开机启动
systemctl enable frpc
systemctl start frpc
systemctl status frpc

===

客户端下载 https://diannaobos.com/frp/
nohup ./frpc -c ./frpc.ini & 启用
jobs -l
ps -aux|grep frpc

2、修改配置文件    frpc.ini

[common]
server_addr = xxx.com
server_port = 5443

### console or real logFile path like ./frpc.log
log_file = ./frpc.log

### trace, debug, info, warn, error
log_level = info
log_max_days = 3

### for authentication
token = yourToken

### your proxy name will be changed to {user}.{proxy}
user = ser28

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 822

[http]
type = http
local_ip = 127.0.0.1
local_port = 80
subdomain = web28

[https]
type = https
local_ip = 127.0.0.1
local_port = 443
subdomain = web28

注意:访问服务端的80端口就相当于访问你本地的8080端口

3、启动

windows cmd里边进入frp客户端相应目录,启动frps.exe or frps.exe -c frpc.ini
注意保持与服务器版本一致和token的变化
# 0.17.0以前的版本 #privilege_token = yourToken
# 0.17.0以后的版本 token = yourToken
开启子域名,先设置*.xxx.com的解析,在frps.ini增加以下

subdomain_host = xxx.com

搭建ngrok服务器

apt-get install build-essential golang mercurial git     安装git 和Golang

git clone https://github.com/tutumcloud/ngrok.git ngrok

生成签名或申请SSL证书

cd ngrok

NGROK_DOMAIN=”ngrok.xxx.com”

openssl genrsa -out base.key 2048

openssl req -new -x509 -nodes -key base.key -days 10000 -subj “/CN=$NGROK_DOMAIN” -out base.pem

openssl genrsa -out server.key 2048

openssl req -new -key server.key -subj “/CN=$NGROK_DOMAIN” -out server.csr

openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

替换证书

cp base.pem assets/client/tls/ngrokroot.crt  

cp server.crt assets/server/tls/snakeoil.crt

cp server.key assets/server/tls/snakeoil.key

编译

make release-server release-client

编译成功后会在bin目录下找到ngrokd和ngrok这两个文件。其中ngrokd 就是服务端程序。

启动服务端

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=“ngrok.xxx.com” -httpAddr=“:880” -httpsAddr=“:8443”

httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定)。

服务端配置

设置为系统程序,并后台运行,在/etc/systemd/system/目录下创建服务ngrok.service,内容为

[Unit]
Description=ngrok server
After=network.target

[Service]

Type=simple
ExecStart=/opt/ngrok/ngrok/bin/ngrokd -tlsKey=/myweb/ngrok/server.key -tlsCrt=/myweb/ngrok/server.crt -domain=”ngrok.xxx.com” -httpAddr=”:80″ -httpsAddr=”:443″ -log "/var/log/ngrokd.log"

Restart=on-failure

[Install]
WantedBy=multi-user.target

systemctl start ngrok.service启动服务

使用服务

sudo systemctl enable ngrokd
sudo systemctl start ngrokd
sudo systemctl status ngrokd

编译客户端

(1)windows

GOOS=windows GOARCH=amd64 make release-client

(2)mac

GOOS=darwin GOARCH=amd64 make release-client

#linux客户端
GOOS=linux GOARCH=amd64(386) make release-client
#linux服务端
GOOS=linux GOARCH=386 make release-server

客户端配置

执行对应的命令会在bin目录下生成相对应的windows、mac目录,ngrok.exe就存放在对应目录下。将对应的ngrok.exe下载到本地。

在同级目录下新建一个配置文件ngrok.cfg

server_addr: “ngrok.xxx.com:4443”

trust_host_root_certs: false

同级目录下新建一个启动脚本startup.bat

@echo on

cd %cd%

#ngrok -proto=tcp 22

#ngrok start web

ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=yjc 8080

 

客户端服务添加到 systemd 自启动服务中,保存下面内容到文件 /lib/systemd/system/ngrok.service

[Unit]
Description=ngrok client
After=network.target

[Service]
Type=simple
ExecStart=/opt/ngrok/ngrok -config "/opt/ngrok/ngrok.yml" -log "/var/log/ngrok.log" start transmission ssh
Restart=on-failure

[Install]
WantedBy=multi-user.target

ExecStart 加载了配置文件 /opt/ngrok/ngrok.ym
server_addr: ngrok.xxx.com:4443
trust_host_root_certs: false
tunnels:
  transmission:
    remote_port: 9091
    proto:
      tcp: 9091
  ssh:
    remote_port: 23333
    proto:
      tcp: 22

FYI:

Can’t load /root/.rnd into RNG

cd /root
openssl rand -writerand .rnd

ping ngrok.xxx.com 提示找不到 host, 直接把域名和 IP 写到内服务器的 /etc/hosts 文件上