一、裸机部署
以BI可视化为例,如果我们要部署一个Node服务,还需要在机器上手动安装 Node、Mysql、Redis、MongoDB、Nginx,对linux环境不熟悉的话,很容易遇到问题卡半天也解决不了。
二、容器化部署
为什么我们需要Docker
隔离环境。
假设你有三个后端服务,分别用 Java、Go、Node 编写,你需要在服务器分别安装三者的环境,才能运行所有语言编写的代码。
假设你有三个 Node 服务,分别用 node10、node12、node14 编写,你需要在服务器分别安装三个版本 nodejs 才能运行各个版本 nodejs 编写的代码。
而有了 Docker,就没有这种问题,它可单独提供某种语言的运行环境,并同时与宿主机隔离起来。
对于前端而言,此时你可以通过由自己在项目中单独维护 nginx.conf 进行一些 nginx 的配置,大大提升前端的自由性和灵活度,而无需通过运维或者后端来进行。
镜像与容器
你应该在其他地方听到过镜像这个词。
比如最常见的光盘镜像,重装电脑时使用的硬盘镜像等。
它们有一些相同点:只读,不允许修改,以标准格式存储了一系列的文件,然后在需要的时候再从中提取出数据运行起来。
容器技术里的镜像也是同样的道理。因为容器是由操作系统动态创建的,那么可以用一种办法把它的初始环境给固化下来,保存成一个静态的文件,相当于是把容器给扁平化,这样就可以非常方便地存放、传输、版本化管理。
镜像把运行进程所需要的文件系统、依赖库、环境变量、启动参数等所有信息打包整合到了一起。之后镜像文件无论放在哪里,操作系统都能根据这个“样本”快速重建容器。
镜像里面不仅有基本的可执行文件,还有应用运行时的整个系统环境。这就让镜像具有了非常好的跨平台便携性和兼容性,完全不需要考虑环境依赖的问题。
镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。
Dockerfile
那镜像是怎么创建出来的?如何制作镜像?
如果把容器想象成一个房子,镜像就是“样板间”。那么,要造出这个“样板间”,就必然要有一个“施工图纸”,由它来规定如何建造地基、如何铺设水电线路等动作。这个“施工图纸”就是“Dockerfile”。
Dockerfile 就是一个纯文本,里面记录了一系列的构建指令。
# 所有的 Dockerfile 都要从它开始,表示选择构建使用的基础镜像,相当于“打地基”
FROM nginx
# 把当前目录下dist文件夹下的所有内容复制到目标路径下
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
构建镜像
如果说Dockerfile
是图纸的话,那么docker build
命令就是施工队。
使用 docker build
命令可基于 Dockerfile 构建镜像。
docker build -t harbor.ctyun.cn/{project}/web:{version} .
docker push harbor.ctyun.cn/{project}/web:{version}
Yaml:K8S世界里的通用语
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: {{DEPLOYMENT_NAME}}
name: {{DEPLOYMENT_NAME}}
namespace: {{NAMESPACE}}
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
run: {{DEPLOYMENT_NAME}}
template:
metadata:
labels:
run: {{DEPLOYMENT_NAME}}
spec:
imagePullSecrets:
- name: harboreg
containers:
- image: {{imageUrl}}
imagePullPolicy: IfNotPresent
name: {{DEPLOYMENT_NAME}}
restartPolicy: Always
kind: Service
apiVersion: v1
metadata:
name: {{DEPLOYMENT_NAME}}
namespace: {{NAMESPACE}}
spec:
selector:
run: {{DEPLOYMENT_NAME}}
ports:
- protocol: TCP
port: 80
targetPort: {{SERVICE_TARGET_PORT}}
kubectl apply -f k8s.yaml
三、实用技能
1. 免密登录
1.1 登录服务器:ssh
ssh,secure shell protocol
,以更加安全的方式连接远程服务器。
ssh root@192.168.31.1
但是记住ip地址是一个反人类的操作,如果你有很多个服务器呢?
1.2 配置别名快速登录:ssh-config
Mac电脑的ssh-config在~/.ssh/config
# 修改 ssh 配置文件 ~/.ssh/config
Host yyc
HostName 192.168.31.1
User root
# 模板
Host <hostname>
HostName <ip>
User <user>
Port <port>
配置成功之后直接 ssh <hostname> 就可以直接登录了,再也不用记住ip了。
ssh yyc
1.3 免密登录:public-key 与 ssh-copy-id
虽然不需要记住ip了,但是每次登录都需要输入密码,为了进一步解放生产力,我们可以配置免密登录,彻底解放双手。原理就是把本地文件~/.ssh/id_rsa.pub
中的内容复制粘贴到远程服务器~/.ssh/authorized_keys
。
总结成一句话,把自己的公钥放在远程服务器的 authorized_keys
中。
我们可以通过ssh-copy-id
来快速实现这一步骤。
# 第一次会提示输入密码
ssh-copy-id yyc
# 后续登录无需密码
ssh yyc
2. ProxyJump
你一定听到过一些名词,公网堡垒机
或者4A内网堡垒机
。没有接触机器前,我根本弄不明白这玩意儿干什么用的。
堡垒机,又称跳板机或者中转机。由于安全风险,公司的服务器不允许被公网 IP 直接访问,而只能通过堡垒机来访问。目前我们公司每个组都有组内专用的中转机。
以BI可视化为例,我们登录息壤的测试环境,中间经过了两次中转,如下图所示。
如果不配置ProxyJump
,那么我每次登录机器就会是下面这个步骤。
ssh fe_jump
ssh cb_jump
ssh xirang
配置ProxyJump
,可直接登录目标主机,在传输文件时能极大的提升效率。
# 目标机器
Host xirang
HostName 10.0.0.30
User root
ProxyJump cb_jump
# 城市大脑项目组中转机
Host cb_jump
HostName 180.1.0.1
User root
ProxyJump fe_jump
# 前端组中转机
Host fe_jump
HostName 192.168.31.1
User user
# 可跨过中转机,直接登录到目标主机
ssh xirang
3. rsync
是一个快速高效,支持断点续传、按需复制的文件拷贝工具,并支持远程服务器拷贝。
强烈建议使用rsync
替换cp
# 将本地的 dist 拷贝到服务器的 /opt/fe 目录
# -l:--links,拷贝符号链接
# -a:--archive,归档模式
# -h:--human-readable,可读化格式进行输出
# -z:--compress,压缩传输
# -v:--verbose,详细输出
# yyc: 远程服务器别名
$ rsync -lahzv dist yyc:/opt/fe
rsync
归档模式最大的好处是可以拷贝元属性,如 ctime/mtime/mode 等等。
结合ProxyJump
,可以跳过多个中转机,直接把文件传到目标服务器上。在需要传输大文件的时候,简直就是强强联手,天下无敌了。
rsync -lahzv dist xirang:/opt/fe