linux zong
OSI七层网络模型
应用层:协议 如:FTP、DNS。。。。
表示层:解密加密,图片解码
会话层:访问验证 会话管理
传输层:提供进程之间的逻辑通信
网络层:提供路由,转发数据
数据链路层:建立数据链路连接
物理层:提供物理设备
三次握手
1.客户端发送请求给服务器建立连接SYN=1
2.服务端确认建立连接ACK=1
3.客户端也确认建立连接ACK=1
双发达成共识(握手完毕)
四次挥手
1.服务器发送数据包(FIN)请求断开连接
2.客户端确认要断开连接 回复ACK数据包
3.客户端也发出FIN终止tcp连接
4.服务端收到FIN,发出ACK确认
双发达成共识(挥手完毕)
服务篇
存储类型
DAS:直连存储(直接连接)(物理层)
SAN:自己管理磁盘(物理层)
NAS:通过网络共享访问文件夹(三层)
FTP文件传输协议
ftp工作原理介绍
文件传输协议:ftp早期的三个应用协议之一,基于C/S结构
数据传输格式:二进制(默认)和文本
双通道协议:命令和数据连接
两种模式:从服务器角度
主动模式:客户端给服务端的21控制端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的某个端口,你就从这里把东西给我吧,服务器知道后就会连接客户端已打开的那个数据端口把东西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件。

被动模式:客户端给服务器端的21端口发命令说,我要下载什么什么,服务端知道后,就打开一个空闲的端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧。于是客户端就从那个端口进去拿文件了,这就是被动模式,可以理解为服务端被客户端拿走了东西。 (常用)

主配置文件:
/etc/vsftpd/vsftpd.conf
NFS网络文件系统
什么是网络文件系统?
通过网络实现不同主机之间文件或者目录共享
NFS实现过程
NFS通过rpc服务来实现文件目录共享
配置文件以及格式
/etc/ecports
共享的目录。 ip地址(rw,sync)
rw读写
ro只读
sync数据同步
SSH远程登录服务
什么是SSH?
是一种 安全通道协议 通过口令登陆服务器,ssh建立在应用层和传输层的基础上的安全协议。
配置文件
服务端主程序/usr/sbin/sshd
服务端配置文件:/etc/ssh/sshd_config
scp使用方法
scp -rp 文件 root@192.168.1.1:/root
DNS域名解析服务
概念
ip和域名相互进行转换
域名分层的结构
根域(.)
一级域名:.com .net
二级域名:baidu google
字域名:www
完整:www.baidu.com.
dns解析过程
递归查询
如果主机所查询的 本地域名服务器 不知道被查询域名的IP地址,那么本地域名服务器 就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果只有两种,一是所查询的IP地址,二是报错,表示无法查询到所需的IP地址
递归查询相当于你问别人借钱,别人没钱也要想办法借到钱给你
客户端需要查询域名发送请求给本地域名服务器,本地域名服务器,也没有找到客户端想要的域名,本地服务器就会向根域名服务器发送请求,结果返回给库护短
迭代查询
当根域名服务器收到本地域名服务器 发出的迭代查询的请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。根域名服务器通常把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询;顶级域名收到请求后,要么给出所查询的IP地址,要么告诉本地域名服务器下一步应该向哪一个权威域名服务器查询,本地域名服务器就这样进行迭代查询,最后把结果返回给主机
迭代查询相当于你问别人借钱,别人没钱,告诉你应该找谁借
根域名服务器收到本地域名服务器的请求,要不给出所查询的ip,要不就告诉本地域名服务器下一步去哪一个域名服务器上找,找到了先返回给本地域名服务器,再返回给客户端。
DNS记录类型
AAAA ipv6地址使用
MX 邮件
查询域名对应的ip地址
host + 域名
nslookup + 域名
nginx
概念
高性能的http服务器,高性能的反向代理服务器
nginx的运行架构
nginx运行后有多少干活的工人,多进程,调用多个cpu解析用户的请求
在linux系统中进行多进程开发,开发多个进程,调用多个cpu,当然也会消耗计算机的资源,内存,cpu,给服务器带来更大的有压力
不是干活的越多就越快,而是要合理的分配进程,才能是能更有效率
====
有一个屋子要装修,一个人干活,五个人干活,500个人干活,那个效率更高?
显而易见是:五个人干活效率最高
====
总结:
nginx多个进程架构,当启动nginx时root会启动master进程,由master进程创建多个worker进程
master进程
1.启动时候会见检查nginx.conf配置问价是否错误(nginx -t 命令给masert进程发送信号,去检查配置文件)
2.根据配置文件,决定创建多少工人进程(worker)
3.master监听sorket,被动的等待用户发来请求
4.接受运维人员像nginx发送的管理信号,并将信号通知到几worker进程
5.如果运维人员发送reload,则会重新创建新的worker进程
worker进程
1.实际处理client网络请求的是worker
2.masert根据nginx.conf决定worker数量
3.有client用户请求到达时候。worker之间进行竞争,获胜者和clinent建立连接且处理用户请求
4.接受用户请求后,若需要代理转发给后段,则后端处理完毕后接受处理结果,在响应给用户
5.接受并处理master发来的进程信号吧,如启动、重启、重载、停止
nginx 正向代理 反向代理的区别]
1、Nginx代理
(1)Nginx出现的早期就是作为一个高性能的http、反向代理的web服务器。
(2)同时它也提供了IMAP/POP3/SMTP服务,也就是电子邮件代理服务器。
(3)它的特点就是占用内存少,并发能力强。
(4)代理:就是代替管理,也可以理解为一个中转站。
2、Nginx正向代理(代理客户端)
(1)理解:客户发送请求给代理服务器,代理服务器代替客户把请求发送给服务器。
(2)特点:服务端收到的请求全部来自于代理服务器,如此一来起到了隐藏客户端的效果,和服务端进行信息交流的全部都是正向代理服务器。
(3)应用:翻qiang
3、Nginx反向代理(代理服务端)
(1)理解:代理服务器将收集到的请求发给服务器,服务器处理完请求将结果返回给代理服务器,再由代理服务器将结果返回给客户端。
(2)特点:客户端收到的信息全部来自于代理服务器,如此一来达到了隐藏服务端的效果,如此一来客户端解析服务器域名时得到的将是反向代理服务器(也可以称作负载均衡服务器)的IP。
(3)应用:代理服务器可以根据某些策略对请求做一个合理的分发,比如分发给相对空闲的服务器,如此一来达到了负载均衡的效果。
4、正向代理和反向代理的区别
(1)正向代理中,客户端知道真正的服务端IP是什么,而服务端并不知真正的道客户端IP是什么;
(2)反向代理中,客户端不知道真正的服务端IP是什么,服务端也不知道真正的道客户端IP是什么;
(3)正向代理一般用来解决访问限制问题;
(4)反向代理一般用来提供负载均衡、安全防护等作用;
Nginx 安装配置
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
Nginx 安装
系统平台:CentOS release 6.6 (Final) 64位。
一、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
二、首先要安装 PCRE
PCRE 作用是让 Nginx 支持 Rewrite 功能。
1、下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
2、解压安装包:
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
3、进入安装包目录
[root@bogon src]# cd pcre-8.35
4、编译安装
[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install
5、查看pcre版本
[root@bogon pcre-8.35]# pcre-config --version
安装 Nginx
1、下载 Nginx,下载地址:https://nginx.org/en/download.html
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
2、解压安装包
[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
3、进入安装包目录
[root@bogon src]# cd nginx-1.6.2
4、编译安装
[root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
[root@bogon nginx-1.6.2]# make
[root@bogon nginx-1.6.2]# make install
5、查看nginx版本
[root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
到此,nginx安装完成。
Nginx 配置
创建 Nginx 运行使用的用户 www:
[root@bogon conf]# /usr/sbin/groupadd www
[root@bogon conf]# /usr/sbin/useradd -g www www
配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容
[root@bogon conf]# cat /usr/local/webserver/nginx/conf/nginx.conf
user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
#下面是server虚拟主机的配置
server
{
listen 80;#监听端口
server_name localhost;#域名
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html;#站点目录
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}
}
检查配置文件nginx.conf的正确性命令:
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t
启动 Nginx
Nginx 启动命令如下:
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
访问站点
从浏览器访问我们配置的站点ip
Nginx 其他命令
以下包含了 Nginx 常用的几个命令:
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
tomcat
重要目录
bin(启动关闭)
conf(conf \ server.xml)(修改端口配置文件)
lib
logs
temp
webapps(项目文件目录)
work
端口
默认端口8080 (改中间端口即可)
启动方式
./startup.sh
关闭方式
./shutdown.sh
sed
选项
-i 直接修改
-e 可视化结果但不修改
替换
sed 's/被替换的/替换成的/g' + 文件
删除指定行数
sed '2,3d' + 文件
AWK
截取第一行第二列
awk 'NR==1{print $2}' + 文件
grep
查找配置文件指定的字符
grep -R '需要找的字符单词'+ 配置文件 grep -R 'lihong' lihong
查找以。。。开头
grep ^... + 文件
查找以。。。结尾
grep ...$. + 文件
docker
1.容器简介
什么是linux容器
就是 本身系统中的 镜像,镜像与本身系统隔离端口,镜像与系本身统互不影响,最主要的就是可以可移植
例如:开发软件,软件依赖系统环境,在docker就可以保持配置及环境一致
容器发展简史
最早出现2000年
2.什么是docker
轻重型,模块化,灵活性,从而实现对容器的高效创建,部署及复制,并将其从一个环境顺利迁移到另外一个环境。
docker如何工作的
内核和内核功能来分隔进程,以便各进程相互独立运行。
docker的目标
构建:做一个docker镜像
运输:docker pull 拉取镜像
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs
3.安装docker
准备两个节点操作以下:
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
docker1配置
# 修改启动文件,监听远程端口
vim /usr/lib/systemd/system/docker.service
ExecStart\=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.100:2375
systemctl daemon\-reload
systemctl enable docker.service
systemctl restart docker.service
# ps -ef检查进行,是否启动
docker2配置
[root@docker02 ~]# docker -H 10.0.0.100 info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: devicemapper
···
docker基础命令操作
查看docker相关信息
[root@docker01 ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 2720:10:142017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 2720:12:462017
OS/Arch: linux/amd64
Experimental: false
配置docker镜像加速器
vi /etc/docker/daemon.json
{ "registry-mirrors": ["https://registry.docker-cn.com"]
}
启动第一个容器
[root@docker01 ~]# docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
e7bb522d92ff: Pull complete
6edc05228666: Pull complete
cd866a17e81f: Pull complete
Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d
Status: Downloaded newer image for nginx:latest
8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d
# 容器启动后,在浏览器进行访问测试
参数说明
| 参数 | 说明 |
|---|---|
| run | 创建并运行一个容器 |
| -d | 放入后台 |
| -p | 端口映射 |
| nginx | 镜像名称 |
docker镜像生命周期
4.docker镜像相关操作
搜索官方仓库镜像
[root@docker01 ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 3992 [OK]
ansible/centos7-ansible Ansible on Centos7 105
获取镜像
根据镜像名称拉取镜像
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading 34.65MB/73.67MB
查看当前主机镜像列表
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
拉取第三方镜像方法
docker pull index.tenxcloud.com/tenxcloud/httpd
导出镜像
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
# 导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz
删除镜像
[root@docker01 ~]# docker image rm centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a4339aadd 5 weeks ago
导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz
e15afa4858b6: Loading layer 215.8MB/215.8MB
Loaded image: centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
查看镜像的详细信息
[root@docker01 ~]# docker image inspect centos
5.容器的日常管理
容器的起/停
最简单的运行一个容器
[root@docker01 ~]# docker run nginx
创建容器(不常用)
[root@docker01 ~]# docker create centos:latest /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01 ~]# docker start stupefied_nobel
stupefied_nobel
快速启动容器方法
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
查看正在运行的容器
[root@docker01 ~]# docker container ls
或
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 nginx "nginx -g 'daemon of…"6 seconds
查看你容器详细信息/ip
[root@docker01 ~]# docker container inspect 容器名称/id
查看你所有的容器(包括为运行的)
root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 nginx "nginx -g 'daemon of…"4minutes ago Exited (0) 59 seconds ago keen_lewin
f9f3e6af7508 nginx "nginx -g 'daemon of…" 5 minutes ago Exited (0) 5 minutes ago optimistic_haibt
8d8f81da12b5 nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 3 hours ago lucid_bohr
停止容器
[root@docker01 ~]# docker stop 容器名称/id
或
[root@docker01 ~]# docker container kill 容器名称/id
进入容器的方法
启动时进入方法
[root@docker01 ~]# docker run -it #参数:-it 可交互终端
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@79241093859e:/#
退出/离开容器
1 | ctrl+p & ctrl+q
启动后进入容器的方法
启动一个docker
[root@docker01 ~]# docker run -it centos:latest
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10015:47 pts/000:00:00 /bin/bash
root 131015:47 pts/000:00:00 ps -ef
attach进入容器,使用pts/0,会让所用通过此方法进如放入用户看到的操作
[root@docker01 ~]# docker attach 1bf0f43c4d2f
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10015:47 pts/000:00:00 /bin/bash
root 141015:49 pts/000:00:00 ps -ef
自命名启动一个容器 --name
[root@docker01 ~]# docker attach 1bf0f43c4d2f
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10015:47 pts/000:00:00 /bin/bash
root 141015:49 pts/000:00:00 ps -ef
exrc进入容器的方法(推荐使用)
[root@docker01 ~]# docker exec -it clsn1 /bin/bash
[root@b20fa75b4b40 /]# 重新分配一个终端
[root@b20fa75b4b40 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10016:11 pts/000:00:00 /bin/bash
root 130016:14 pts/100:00:00 /bin/bash
root 2613016:14 pts/100:00:00 ps -ef
删除所有的容器
[root@docker01 ~]# docker rm -f `docker ps -a -q`
# -f 强制删除
启动时进行端口映射
-p参数端口映射
[root@docker01 ~]# docker run -d -p 8888:80 nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
不同指定映射方法
| 参数 | 说明 |
|---|---|
| -p hostPort:containerPort | 端口映射 -p 8080:80 |
| -p ip:hostPort:containerPort | 配置监听地址 -p 10.0.0.100:8080:80 |
| -p ip::containerPort | 随机分配端口 -p 10.0.0.100::80 |
| -p hostPort:containerPort:udp | 指定协议 -p 8080:80:tcp |
| -p 81:80 –p 443:443 | 指定多个 |
随机映射
docker run -P (大P)# 需要镜像支持
6.docker数据卷的管理
挂在时创建卷
挂载卷
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器内站点目录: /usr/share/nginx/html
在宿主机写入数据,查看
[root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html
[root@docker01 ~]# curl 10.0.0.100
http://www.nmtui.com
设置共享卷,使用同一个卷启动一个新的容器
[root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01 ~]# curl 10.0.0.100:8080
http://www.nmtui.com
查看卷列表
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
创建卷后挂载
创建一个卷
[root@docker01 ~]# docker volume create
f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
指定卷名
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local clsn
local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
查看卷路径
[root@docker01 ~]# docker volume inspect clsn
[
{
"CreatedAt": "2018-02-01T00:39:25+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/clsn/_data",
"Name": "clsn",
"Options": {},
"Scope": "local"
}
]
使用卷创建
[root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest
1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
# 宿主机测试
[root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html
[root@docker01 ~]# curl 10.0.0.100:9000
blog.nmtui.com
设置卷
[root@docker01 ~]# docker run -d -P --volumes-from 079786c1e297 nginx:latest
b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb
查看使用的端口
[root@docker01 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1400/sshd
tcp 0 0 10.0.0.100:2375 0.0.0.0:* LISTEN 26218/dockerd
tcp6 0 0 :::9000 :::* LISTEN 32015/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 31853/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 31752/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1400/sshd
tcp6 0 0 :::32769 :::* LISTEN 32300/docker-proxy
[root@docker01 ~]# curl 10.0.0.100:32769
http://www.nmtui.com
手动将容器保存为镜像
本次是基于docker官方centos 6.8 镜像创建
官方镜像列表:https://hub.docker.com/explore/
启动一个centos6.8的镜像
[root@docker01 ~]# docker pull centos:6.8
[root@docker01 ~]# docker run -it -p 1022:22 centos:6.8 /bin/bash
# 在容器种安装sshd服务,并修改系统密码
[root@582051b2b92b ~]# yum install openssh-server -y
[root@582051b2b92b ~]# echo "root:123456" |chpasswd
[root@582051b2b92b ~]# /etc/init.d/sshd start
启动完成后镜像ssh连接测试
将容器提交为镜像
[root@docker01 ~]# docker commit brave_mcclintock centos6-ssh
使用新的镜像启动容器
[root@docker01 ~]# docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
在容器安装httpd服务
[root@5b8161fda2a9 /]# yum install httpd -y
编写启动脚本脚本
[root@5b8161fda2a9 /]# cat init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@5b8161fda2a9 /]# chmod +x init.sh
# 注意执行权限
注意执行权限
再次提交为新的镜像
[root@docker01 ~]# docker commit 5b8161fda2a9 centos6-httpd
sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
启动镜像,做好端口映射。并在浏览器中测试访问
[root@docker01 ~]# docker run -d -p 1222:22 -p 80:80 centos6-httpd /init.sh
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
7.docker中的镜像分层
官方构建dockerffile文件参考:https://github.com/CentOS/CentOS-Dockerfiles
dockerfile指令集
dockerfile主要组成部分:
基础镜像信息 FROM centos:6.8
制作镜像操作指令RUN yum insatll openssh-server \-y
容器启动时执行指令 CMD \["/bin/bash"\]
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(COPY文件,会自动解压)
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)
dockerfile其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令
创建一个dockerfile
创建第一个Dockerfile文件
# 创建目录
[root@docker01 base]# cd /opt/base
# 创建Dcokerfile文件,注意大小写
[root@docker01 base]# vim Dockerfile
FROM centos:6.8
RUN yum install openssh-server -y
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/usr/sbin/sshd","-D"]
构建docker镜像
[root@docker01 base]# docker image build -t centos6.8-ssh .
-t 为镜像标签打标签 . 表示当前路径
使用自构建的镜像启动
[root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
使用docker安装kodexplorer
Dockerfile文件内容
FROM centos:6.8
RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
# 设置工作目录,之后的操作都在这个目录中
WORKDIR /var/www/html/
RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
更多的Dockerfile可以参考官方方法。
8.docker镜像为什么分层
Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。
从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
Docker 镜像为什么分层
镜像分层最大的一个好处就是共享资源。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。
可写的容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
容器层的细节说明
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
文件操作说明
| 文件操作 | 说明 |
|---|---|
| 添加文件 | 在容器中创建文件时,新文件被添加到容器层中。 |
| 读取文件 | 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。 |
| 修改文件 | 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。 |
| 删除文件 | 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。(只是记录删除操作) |
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
9.使用docker运行zabbix-server
容器间的互联
在运行zabbix之前务必要了解容器间互联的方法
# 创建一个nginx容器
docker run -d -p 80:80 nginx
# 创建容器,做link,并进入容器中
docker run -it --link quirky_brown:web01 centos-ssh /bin/bash
# 在容器中访问nginx容器可以ping通
ping web01
命令执行过程
# 启动apache容器
[root@docker01 ~]# docker run -d httpd:2.4
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f1f7fc55472 httpd:2.4"httpd-foreground"6 seconds ago Up 5 seconds 80/tcp determined_clarke
# 拉取一个busybox 镜像
[root@docker01 ~]# docker pull busybox
# 启动容器
[root@docker01 ~]# docker run -it --link determined_clarke:web busybox:latest /bin/sh
/ #
# 使用新的容器访问最初的web容器
/ # ping web
PING web (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms
^C
--- web ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.058/0.058/0.058 ms
启动zabbix容器
1、启动一个mysql的容器
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
2、启动java-gateway容器监控java服务
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
3、启动zabbix-mysql容器使用link连接mysql与java-gateway。
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
关于zabbix api
10docker仓库(registry)
创建一个普通仓库
袋basic认证的仓库
11.docker-compose编排工具
安装docker-compose
编排启动镜像
haproxy代理后端docker容器
安装socat直接操作socket控制haproxy
12重启docker服务,容器全部退出的解决方法
在启动是指定自动重启
修改docker默认配置文件
13docker网络类型
docker的网络类型
不为容器配置网络功能
与其他容器共享网络配置
使用宿主机网络
查看网络列表
用PIPEWORK为docker容器配置独立ip
docker跨主机通信之macvlan
14.docker企业级镜像仓库harbor
使用容器的建议
关于docker容器的监控
shell
https://blog.csdn.net/weixin_44689630/article/details/120615238
变量
本地变量:在当前系统的某个环境才能生效
普通变量
变量名=变量值
命令变量
变量名=命令
全局变量:当前系统的所有环境下都能生效的变量
内置变量:拿过来就可以直接使用
$0 获取当前执行的shell脚本文件名
$n 第一个参数 第二个参数 以此类推
$# 获取当前脚本传入的参数
$? 获取命令执行的返回状态值
条件表达式
逻辑表达式
常见的逻辑表达式:
&& :命令1 && 命令2
#命令1执行成功,命令2执行
[ 1 = 1 ] && echo "条件成立"
#命令1执行不成功,命令2也不执行
[ 1 = 2 ] && echo "条件成立"
|| :命令1 || 命令2
#命令1执行成功,命令2不执行
[ 1 = 2 ] || echo "条件不成立"
#命令1执行失败,命令2执行
[ 1 = 1 ] || echo "条件不成立"
文件表达式
-f 判断输入内容是否是一个文件,示例:
[ -f weizhi.sh ] && echo "是一个文件"
#是一个文件
[ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件
-d 判断输入内容是否是一个目录,示例:
[ -d weizhi.sddh ] || echo "不是一个目录"
#不是一个目录
mkdir nihao
[ -d nihao ] && echo "是一个目录"
#是一个目录
-x 判断输入内容是否可执行 示例:
[ -x age.sh ] || echo "文件没有执行权限"
#文件没有执行权限
[ -x test.sh ] && echo "文件有执行权限"
#文件有执行权限
数值操作符
| 1 | 2 |
|---|---|
| n1 -eq n2 | 相等 |
| n1 -gt n2 | 大于 |
| n1 -lt n2 | 小于 |
| n1 -ne n2 | 不等于 |
字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
#判断字符是否内容一致
[ a == a ]
echo $? #0
[ a != a ]
echo $? #1
数组操作:定义格式 增删改查
定义格式
用括号来表示数组,数组元素用“空格”符号分割开.定义数组的语法格式: array_name=(value1 … valuen)
#单行定义
array_name=("a" "b" "c")
#多行定义
array_name=("a"
"b"
"c")
#单元素定义
array_name[0]="a"
array_name[1]="b"
#单元素定义的时候,可以不使用连续的下标,而且下标的范围没有限制
#命令定义:就是value的值以命令方式来获取
file_array=($(ls /tmp/))
信息查看
array_name=("a" "b" "c")
#获取索引为1的元素内容
echo ${array_name[1]}
#获取所有的元素内容
echo ${array_name[@]}
#获取所有的元素内容
echo ${array_name[*]}
获取数组长度,字符串长度
#获取索引为1的值的长度
echo ${#array_name[1]}
#获取所有的元素个数
echo ${#array_name[@]}
echo ${#array_name[*]}
删改查
获取元素:又分为单元素获取,和元素部分内容获取
#单元素获取格式:${array_name[index]}
echo ${array_name[1]}
#元素部分内容的获取格式如下:${array_name[index]:pos:length}
echo ${array_name[2]:0:2}
更改元素
#元素内容替换,array_name[index]=值
array_name[1]=444
#元素部分内容替换,${array_name[index]/原内容/新内容}
echo ${array_name[2]/va/hahhah}
#默认是演示效果,原数组未被修改,如果真要更改需要结合单元素内容替换
删除数组
#删除单元素 unset array_name[index]
unset array_name[1]
#删除整个数组 unset array_name
unset array_name
shell常见符号
重定向
> 符号 覆盖
>> 符号 追加
管道符
|
后台展示
& 就是将一个命令从前台转到后台执行
简单流程控制
if语句
#单分支
if [ 条件 ]
then
指令
fi
#多分支
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
多分支if语示例
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
elif [ "$1" == "nv" ]
then
echo "您的性别是 女"
else
echo "您的性别,我不知道"
fi
通过传入参数来实现不同的功能
admin-1@ubuntu:/data/scripts/python-n# cat if.sh
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "start" ]
then
echo "服务启动中..."
elif [ "$1" == "stop" ]
then
echo "服务关闭中..."
elif [ "$1" == "restart" ]
then
echo "服务重启中..."
else
echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
fi
case语句
语句格式
case 变量名 in
值1)
指令1
;;
值n)
指令n
;;
esac
# cat case.sh
#!/bin/bash
# case语句使用场景
case "$1" in
"start")
echo "服务启动中..."
;;
"stop")
echo "服务关闭中..."
;;
"restart")
echo "服务重启中..."
;;
*)
echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
;;
esac
首行关键字是case,末行关键字esac
选择项后面都有 )
每个选择的执行语句结尾都有两个分号;
循环语句
for语句
语法格式
for 值 in 列表
do
执行语句
done
示例
#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
while语句
语法格式
#条件的类型:命令,[[ 字符串表达式 ]],(( 数字表达式 ))
while 条件
do
执行语句
done
示例
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
循环退出
| 指令 | 含义 |
|---|---|
| break | 跳出所有循环 |
| break n | 跳出第n个循环(由内向外) |
| continue | 跳出当前循环 |
| exit | 退出当前程序 |
示例1
脚本进入死循环直至用户输入数字大于5
#!/bin/bash
while :
do
echo -n "输入你的数字,最好在 1 ~ 5: "
read aNum
case $aNum in
1|2|3|4|5)
echo "你的数字是 $aNum!"
;;
*)
echo "你选择的数字没在 1 ~ 5, 退出!"
break
;;
esac
done
效果示例:
~] /bin/bash while.sh
输入你的数字,最好在 1 ~ 5: 1
你的数字是 1!
输入你的数字,最好在 1 ~ 5: 6
你选择的数字没在 1 ~ 5, 退出!
示例2
如果 var1 等于 2,并且 var2 等于 0,就跳出循环
#!/bin/bash
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
#效果示例:
# /bin/bash while.sh
输入你的数字,最好在 1 ~ 5: 6
你选择的数字没在 1 ~ 5, 退出!
输入你的数字,最好在 1 ~ 5:
示例4exit
#!/bin/bash
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
exit
else
echo "$var1 $var2"
fi
done
done
函数
简单函数
定义
#1.简单函数格式:
函数名(){
函数体
}
函数名
示例
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
echo "wo de mingzi shi 111"
}
dayin
传参函数
定义
函数名(){
函数体 $n
}
函数名 参数
示例
#!/bin/bash
# 函数的使用场景二
dayin(){
echo "wo de mingzi shi $1"
}
dayin 111
脚本传参数,函数调用
定义
函数名(){
函数体 $1
}
函数名 $1
/bin/bash 脚本名 参数
示例
test.sh
#!/bin/bash
# 函数传参演示
# 定义传参数函数
dayin(){
echo "hello $1"
}
# 函数传参
dayin $1
/bin/bash test.sh jason
脚本传参,函数调用(生产用)
格式
本地变量名 = "$1"
函数名(){
函数体 $1
}
函数名 "${本地变量名}"
示例
#!/bin/bash
# 函数的使用场景二
canshu = "$1"
dayin(){
echo "hello $1"
}
dayin "${canshu}"
/bin/bash test.sh jason
mysql
DDL数据定义语言
用于创建数据对象,如库、表、索引等
create 创建
drop 删除
alter 修改
创建新的数据库
create database 数据库名字;
创建新的表
create table 表名 (字段1 数据类类型,字段2 数据类型,PRIMARY KEY (主键名))
删除指定数据表
use 数据库名字;
drop table 表名字;
删除指定数据库
dorp database 数据库名字;
DML数据操纵语言
用于对表中的数据进行管理,用来插入,删除和修改数据库中的数据
插入数据
insert into 表名字(字段1,字段2,values(字段1的值,字段2的值));
示例:
insert into ky23 (id,name,score,passwd) values(1,'lyl',80.5,PASSWORD('123456'))
insert into ky23 (id,name,score,passwd) values(2,'gsx',80.5,123456);
#PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示:若不使用PASSWORD(),查询时以明文显示。
修改、更新数据表中的数据记录
格式
update 表名 set 字段名1=字段值1,字段名1=字段值2 where 条件表达式
示例

在数据表中删除指定分数据记录
格式
delete from 表名 where 条件表达式;
示例
delete from aaa where id =2;
delete与drop的区别
delete保存字段
drop 是把整个字段结构删除
DQL数据查询语言
select
查询
格式
select * from 表名;
select * from 表名 limit 2;(前两行)
select * from 表名 limit 2,3;(显示第二行后的前三行)
DCL数据控制语言
修改表名和表结构(alter)
改表名
alter table 旧表名 rename 新表名;
示例
alter table zz rename yyy;
扩展表结构(增加字段)

修改字段列名,添加唯一键
格式
alter table 表名change 旧列名 新列名 数据类型[unique key];
unique key:唯一键(特性:唯一,但可以为空,空值只允许出现一次)
Primary key:唯一且非空(主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。)
删除字段
格式
alter table 表名 drop 字段名;
示例
alter table aaa drop passwd;
数据表高级操作
克隆表
create table yyy2 like yyy; #复制格式(字段),通过LIKE方法,复制yyy表结构生成yyy2表
insert into yyy2 select * from yyy; #备份内容
克隆表,将数据表的数据记录生成到新的表中
CREATE TABLE test02 (SELECT * from test); #复制test 表数据到test02中
这2种,第一种是完全的复制,第二种是复制了,但是没有主键,唯一键等等
show create table test02\G #获取数据表的表结构、索引等信息
SELECT * from test02;
清空表,删除表内的所有数据
方法一:
delete from yyy3;
\#DELETE清空表后,返回的结果内有删除的记录条目;
DELETE 工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM 删除
所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
方法二:
truncate table test01;
\#TRUNCATE清空表后,没有返回被删除的条目: TRUNCATE 工作时是将表结构按原样重新建立,
因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE 清空表内数据后,
ID会从1开始重新记录
小小结:↑↑↑
#删除类型
drop table table_name
1)属于DDL
2)不可回滚(无法恢复)
3)不可带where
4)表内容和结构删除
5)删除速度快
truncate table table_name
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快
delete from table_name
1)属于DML
2)可回滚(可恢复)
3)可带where
4)表结构在,表内容要看where执行的情况
5)删除速度慢,需要逐行删除
不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate
#删除
速度
drop> truncate > delete
安全性
delete 最好
创建临时表
临时表创建成功之后,使用SHOWTABLES命令是看不到创建的临时表的,临时表会在连接退出后被销毁。
如果在退出连接之前,也可以可执行增删改查等操作,比如使用DROP TABLE语句手动直接删除临时表。
PS:无法创建外键
CREATE TEMPORARY TABLE 表名 (字段1 数据类型,字段2 数据类型[, ...]
[, PRIMARY KEY (主键名)]);
sql 写入——》数据表中—》先把数据保存在内存中—》写入到磁盘
insert into info ——》info这张表,会先复制一份表数据到内存里面,给我们进行修改
---》敲完回车之后,确定提交了,才会写入数据表中—》再保存在磁盘里面
create table test01—》只会保存在内存中,在数据库退出连接之前的所有操作,都是在内存中进行的,不会保存在磁盘里面,退出连接后,临时表会释放掉
示例:
create temporary table xxx (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
insert into xxx values (1,'zhangsan',123456,'running');
select * from test03;
show tables;
quit
select * from test03;
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
备份表恢复表
备份到物理机
mysqldump -h 域名 -P 端口 -u用户 -p密码 库名 表名 > /路径/表名.{$date}.bak
1 mysqldump -uzhangsan_backup -p --master-data=2 --single-transaction --routines --triggers --events bonc_test > e:\\bonc_test2.sql
2mysqldump -uzhangsan_backup -p bonc_test > e:\\bonc_test.sql
将表备份在库里面(create复制表结构、insert复制表内容)
create table one_bak like one; 复制表结构
insert into one_bak select * from one; 复制表内容
将表备份在库里面(create table as备份)
注:与2步骤备份在库里面不同的是 as 备份表不会备份主键和外键,只备份表数据
create table one_bak as select * from one;
恢复表
#1.先创建一个数据库
create database bak_bonc_test;
#2.进行恢复数据
mysql -uroot -p bak_bonc_test <e:\\bonc_test2.sql
双主复制
主从复制
主从复制原理
介绍:
-
异步过程
-
底层就是基于mysql数据库自带的二进制功能
-
就是一台或者多台mysql数据库(slav,从库),从另外一台msql数据库(master,主库)进行日志复制
-
解析日志到本身在应用
-
实现主库和从库数据库状态保持一致
二进制日志
-
记录了所有的DDL和DML语句,不包括查询语句
-
mysql的主从复制,就是通过binlog实现的
mysql复制过程分成三步
-
主master数据库将数据写入bin log日志中(二进制日志)
-
从slave数据库通过I/O线程将master数据库的bin log日志文件拷贝到relay log中(中继日志)
-
从slave重做relay log中的事件,将master变更反应 为他自己的数据
读写分离
keeplive
介绍:
最开始就是为lvs设计,专门监控lvs集群系统中各个服务节点的状态,后来加入vrrp功能,vrrp(虚拟路由器冗余协议)vrrp出现就是为了解决静态路由出现的单点故障问题,他能够保证网络的不间断,稳定的运行
keepalived服务两大用途:
1.directors failover(通过vrrp实现的)
实现master主机和backup主机之间的故障转移和切换
主节点宕机备节点接管,主节点恢复了,备节点就会将数据资源还给主节点。
2.healthchecks
2.1.keepalived.conf里面配置就可以实现lvs功能
2.3.keepalived可以对lvs下面的集群节点做健康检查
keepalived故障切换转移原理介绍:
通过vrrp协议来实现具体如下:
主节点会给备节点发送心跳,备节点监听,当监听不到主节点发送的心跳,备节点就会接管所有的ip资源和服务,主节点恢复以后,将资源全部给主节点。
vrrp介绍:
-
vrrp协协议全称:虚拟路由器冗余协议,为了解决静态路由的单点故障
-
vrrp是通过一种竞选的机制来将路由器任务交给vrrp路由器
-
vrrp是用ip多播的方式实现通信
-
主发包,备接包,当备接不到主发的包的时候,就启动接管程序接管主的资源,备可以有多个,透明难过优先级精选
-
vrrp使用了加密协议
keepalived工作原理:
主节点会给备节点发送心跳,备节点监听,当监听不到主节点发送的心跳,备节点就会接管所有的ip资源和服务,主节点恢复以后,将资源全部给主节点。
安装部署:
说明:
准备两台机器(老男孩示例)
10.0.0.17 10.0.0.18
两台机器操作:
cd /home/hong
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
软连接操作(用到lvs会用到这个):
ln -s /usr/src/kernels/2.6.32-504.el6.x86_64 /usr/src/linux
如果没有2.6.32-504.el6.x86_64yum安装如下:没有生效尚未决绝
yum search keepalived
[root@localhost ~]# yum install keepalived.aarch64
解压安装:
cd /home/hong
tar
cd keep包
yum insatll openssl-devel -y
./configure(三个yes)
make
make install
配置规范启动:
启动查看:在stop
/etc/init.d/keepalived start
ps -ef | grep keep(有三个进程就代表成功了)
/etc/init.d/keepalived stop
keepalived配置vrrp文件说明:keepalived.conf
vrrp_instance lvs_inst { #定义vrrp实例名
state BACKUP #定义vrrp角色,分为MASTER/BACKUP两种
interface ens33 #指定网络接口名
virtual_router_id 51 #同一组的vrrp成员,该id需要一致
priority 150 #优先级,范围(0-255)
nopreempt #不抢占(只针对BACKUP生效)
advert_int 1 #发送hello的时间间隔
authentication { #通过密码身份验证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #定义虚拟IP(VIP)
10.18.42.123/24
}
}
开始配置keepalived.conf
主配置:
查看虚拟ip:也就是上面配置的虚拟ip
ip a
10.0.0.17
将keepalived.conf配置文件拷贝到备服务器:
scp keepalived.conf 10.10.0.8:/etc/keepalived
跟改备配置:更改三处
启动备节点keepalived 查看端口
<!--附加:keppalived配置文件里面的虚拟ip必须一致,要不就会出现裂脑,主备互不相通。-->
测试:
主停掉keepalive主的ip没有 备的ip有了,主启动keepslived,备ip没有。
keepalived + nginx
原理:
主Nginx挂掉,从nginx可以立即工作
利用
当主nginx挂掉,利用脚本关闭主keepalied,keepalived通过vrrp技术实现从机获得vip,在从机安装相同的nginx和配置,从机通过vip继续为外界提供服务。
LVS
简介:
用户发送请求给lvs调度器,调度器根据算法将请求发送给后端服务器
工作模式:
NAT网络地址转换
作用是通过数据报头的修改,使得位于企业内部的私有ip地址可以访问外网,外网可以访问内部的私有ip
TUN隧道模式
DR直接路由模式
redis
概念:
可以放在内存和硬盘 双机热备
redis库里面有key-value:
key:键
value:键值,数值
<!--附加:Java sprintboot 内置tomcat-->
为什么电商用redis做消息系统? 订单系统。 支付系统 库存系统。 物流系统
消息系统(redis,系统只管往订单系统发送数据)
订单系统和支付系统没有关系,互不影响
redis优点:
内存型数据库 快
并发行极强
美团
经常访问的数据放在redis里面,提高速度
将常用的mysql数据写入redis里面,客户访问就可以到redis里面读取数据,速度非常快(常见的mysql+redis)
<!--附加基础运维工作:(自己搭建自己维护)-->
<!--阿里云运维无需要自己部署搭建可以直接使用-->
redis需要学习什么?
支持的数据类型:string(字符串) list(链表)(消息) set(集合) 有序集合
<!--附加:session-cookie:淘宝一次登陆60s在规定的时间内不用重新登陆-->
redis版本类型说明:
标准版:双副本(主从复制)redis哨兵
标准版-单副本(10+并发处理能力)
重点:
主从复制
redis哨兵
集群
不适用于redis场景:
频繁更新数据
并发量不多
redis使用场景:
瞬时 实时记录 高并发
过期
百度、微博、直播间
redis特性:
支持key-vlaue等多种数据结构的存储系统
可以用于缓存,事件发布或订阅,高速对列等
redis五大类型:
字符串:计数器、点赞、评论数
哈希
列表
队列
集合
redis 用的怎么样:
软件源码高质量,运行速度快
支持丰富的数据类型,可以面对各种场景
场景实现如:
计数器、点赞、评论数、key过期功能、购物城订单、消息队列、发布订阅、聊天室
支持多种语言如python
支持数据持久化(运行时都在内存)
内置高可用架构:
主从复制
redis哨兵
集群
redis安装部署
1.redis的配置文件,数据目录,单独创建,规划好
[root@localhost ~]# mkdir -p /data/soft
[root@localhost ~]# mkdir -p /opt/redis_6329{conf,logs,pid}
[root@localhost ~]# mkdir -p /data/redis_6379
2.安装方式 源码
5 2023-04-15 14:08:35 cd /data/
6 2023-04-15 14:08:35 ls
7 2023-04-15 14:08:37 cd soft/
8 2023-04-15 14:08:37 ls
9 2023-04-15 14:11:10 wget https://download.redis.io/releases/redis-5.0.7.tar.gz
3.编译redis的基础依赖,下载gcc编译器
yum install gcc make -y
4.redis源码编译安装 解压到opt目录
tar -zxvf redis-5.0.7.tar.gz -C /opt/
5.进入源码目录,编译安装
cd /opt/redis-5.0.7
make MALLOC=libc && make install
6.创建配置文件 启动
[root@localhost opt]# mkdir -p /opt/redis_6329/{conf,logs,pid}
[root@localhost opt]# mkdir -p /data/redis_6379/
cd /opt/redis_6329/conf
vim redis_6379.conf
daemonize yes
bind 127.0.0.1 192.0.0.140
port 6379
pidfile /opt/redis_6379/pid/redis_6329.pid
logfile /opt/redis_6379/logs/redis_6329.log
6.1查看redis的二进制命令
[root@localhost src]# ll /usr/local/bin/
总用量 13240
-rwxr-xr-x. 1 root root 402304 4月 15 14:18 redis-benchmark 性能测试
-rwxr-xr-x. 1 root root 4093464 4月 15 14:18 redis-check-aof 检查aof数据状态
-rwxr-xr-x. 1 root root 4093464 4月 15 14:18 redis-check-rdb 检查rdb数据状态
-rwxr-xr-x. 1 root root 862752 4月 15 14:18 redis-cli redis-client 登陆命令
lrwxrwxrwx. 1 root root 12 4月 15 14:18 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 4093464 4月 15 14:18 redis-server redis哨兵,启动服务端都是这个命令
6.2启动关闭redis
启动
redis-server /opt/redis_6329/conf/redis_6379.conf
关闭
redis-cli shutdown
切记不能用kill杀死 结果数据丢失
7.登陆redis 基本操作
本地直接登陆
[root@localhost conf]# redis-cli
127.0.0.1:6379> ping
PONG
地址端口登陆
redis-cli -h 127.0.0.1 -p 6379
测试写入数据,查看数据,redis最基本的,最多的操作
set get 写入自负转数据 查询字符串数据
本地数据写入,查看key的数量,建议写入英文
dbsize #查看key的值
set name linux #创建value
查看key的具体值
[root@localhost conf]# redis-cli get name
"lihoooo"
[root@localhost conf]# redis-cli get name2
"ligonf"
用--raw参数,查看转码中文汉字
Redir-cli --raw get name3
李李
8.根据redis的日志,进行优化调整(如nginx,mysql,redis的优化,斗都是根据生产环境遇见的问题,进行参数设置,解决问题,如链接数过大,如cup使用核数等优化)
9.redis基本命令
https://blog.csdn.net/cucgyfjklx/article/details/124587360




浙公网安备 33010602011771号