共计 17091 个字符,预计需要花费 43 分钟才能阅读完成。
- 部署基础知识
url:协议:// 网站地址:端口(/)路径地址? 参数
eg:http://www.baidu.com:80/abc/dd/
www.baidu.com 找服务器
80 端口:找服务器上提供服务的应用 nginx
uri:/abc/dd/
nginx 的 pid 文件是可变化的
等号两边不能空格,否则会报错tail -f 1.txt 实时监控文件变化
1.1 部署基础
1.11.1 项目生命周期
传统项目生命周期
阶段
调研阶段 找方向点
设计阶段 方向点可视化
产品:产品需求文档、项目里程表
开发阶段 产品阶段功能实现
测试阶段 保证产品的阶段功能
运营阶段 项目部署 + 运营维护
关键点:阶段间是有前后关系依赖的
阶段间项目的推进是有文档来主导
理想化的生命周期和开发模型
1.2 新型项目周期
软件项目:一个产品被拆分成了非常多的子功能
团队组织:高效协作,沟通
图的理解:四个圈串在一起 --- 子功能的完整周期
单个圈 --- 岗位的工作内容
图片: https://uploader.shimo.im/f/hRwe365QitwNgyS7.png
团队组织间的高效协作是很重要的
流程:
1 根据需求文档来梳理网站的目标架构
2 分析产品需求文档的功能,来梳理部署结点
部署节点示意图:
图片: https://uploader.shimo.im/f/U…
3 根据部署结点去互联网上梳理各种解决方案(根据业务需求
4 整合所有的解决方案,-- 初版部署方案
5 根据实际的公司业务情况,对初版部署方案进行优化调整
1.3 部署环境:
个人开发环境 内容:项目子模块
公司开发环境 内容:项目模块间联调
环境一定要和线上环境一致
测试环境 内容:项目产品质量保证
预发布环境 内容:项目产品质量保证
线上环境 内容:项目产品部署 + 维护
拓展:环境之间彼此隔离
第 2 章 Nginx 进阶
2.1 Nginx 快速入门
2.1.1 Nginx 简介
方向:web 服务 反向代理服务器、缓存服务器、邮件服务器
****** web 反向代理
***** 缓存
特点:成本低
资源占用少
模块化设计
2.1.2 Nginx 部署
软件安装
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y
注意
如果软件安装过程中,由于远程仓库安全限制方面的原因导致无法安装成功,使用 --allow-unauthenticated 参数
服务启动命令:(linux 自带的)systemctl start|stop|restart|reload nginx ***
nginx 服务命令:nginx -t 每次修改配置文件后,都要检查配置文件,如果错误即使启动 nginx 也不生效更改的内容 ***
nginx -s stop|reload 停止 | 重载 注意 nginx -s reload 不需要关闭并重新打开 nginx 进程,只需要将配置信息重新加载就可以了
其他命令:
查看服务的端口信息:
netstat -tnulp | grep nginx
nginx 目录结构:
前提:使用 apt-get 来安装的 nginx
家目录:/etc/nginx
日志目录:/var/log/nginx
html 目录:/var/www/html 一般会把 //usr/share/nginx/html/index.html 注释
nginx 配置文件:
路径:/etc/nginx/nginx.conf (官方默认里面会包含下面的两个存放目录)
存放目录:
/etc/nginx/ /etc/nginx/conf.d
nginx 的配置文件结构:
全局配置段
http 配置段
server 配置段 —– 项目或者应用的网站
location 配置段 —— 网站里面的文件 —–/var/www/html
nginx 的访问原理:
浏览器拆分 url 请求:
地址和端口 和路径关键字
根据地址找服务器 ——nginx 服务器
根据端口找服务器上面的应用或者框架 ——-server 配置段
根据路径关键字找对应的文件 ——location 配置段
———————————————- lscpu 查看 cpu 信息,全局配置段里面的 worker_processes 是根据这个来设置的,auto 的话是一样多的,也可以定制
———————————————– 默认的 worker_connections:768
高并发的一个配置点:worker_procees 一般是和 cpu 内核数相匹配的,多开的话可能会造成影响主进程调度,占用 CPU 资源,适当的话就刚刚好,实际运行时都会多一个,这个就是主进程,负责调度的,
worker_connections:这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。这里需要注意的是,一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受操作系统设定的,进程最大可打开的文件数有关。
两个命令:ps -elf | grep nginx 查看进程配置信息
cat /proc/pid/limits 查看硬盘支持的最大可打开文件数
图片: https://uploader.shimo.im/f/m…
nginx -s reload 命令重新启动 Nginx。
https://blog.csdn.net/zs74294…
worker_rlimit_nofile 配置要和系统的单进程打开文件数一致,
根据我配置实践,
服务器是“多个 CPU+gzip+ 网站总文件大小大于内存”的环境,worker_processes 设置为 CPU 个数的两倍比较好。
2.1.3 配置详解:
全局配置段:
user 指的是 worker_processes 的用户
worker_processes
pid
events
worker_connections 768
use 默认 epoll 面试掌握 select /poll.epoll z 阻塞非阻塞并行串行
http 配置段:
sendfile 开启高效文件传输
gzip 开启 gzip 压缩
tcp_delay 防止网络阻塞
tcp_nopush 防止网络阻塞
autoindex 开启目录列表访问,适合下载服务器
keepalive_timeout 保持长连接
include 将相关的配置文件导入到文件中
面试掌握:tcp/ip 协议的有限状态机
server 常见配置段:
格式:
server {
listen 端口;
server_name 主机名;
root 服务器响应请求的 html 文件所在路径 /var/www/html
index 定义响应请求后返回的文件名称或者格式; index index.html index.htm index.nginx-debian.html;
return 响应请求返回的 http 状态码;
}
server {
listen 88; 监听的端口(优先匹配)
server_name a.com 端口相同的情况下匹配 server_name
使用原则:
优先使用完整样式, 然后使用前缀正则样式, 最后使用后缀正则样式, 如果正则样式相同的时候, 匹配最长,
否则就走非法规则。
非法域名 /IP,表示请求到该主机上一个不存在的 IP 或者域名
}
server {
listen 88;
server_name b.com
}
location 配置段
语法:location 匹配条件 匹配样式 {执行动作}
匹配条件:1 精确匹配 =
2 优先正则 ^~
3 普通正则 ~ 区分大小写 !~ 区分大小写不匹配 ~* 不区分大小写 !~* 双重否定
4 默认规则 空
匹配样式:针对的是 url 里面的路径部分
location ~ .(jpe?g)$ {}
location ^~ .(jpeg)$ {}
jpeg
jg
~* !~ Jpg
location = /image {
http://a.com/image
location = / {location ~ \.(gif|jpg|png|js|css)$ { location !~* \.xhtml$ {? ?# 精确规则 A ? ? #正则规则 D ? ? #正则规则 G} } }
location = /login { location ~* \.png$ { location / {? ?# 精确规则 B ? ? #正则规则 E ? ? #通用规则 H} } }
location ^~ /static/ { location !~ \.xhtml$ {? ?# 优先规则 C ? ? #正则规则 F} }
http://a.com/other
$uri /other
$uri/ /other/ 默认首页
location 实践 1:root@itcast:/etc/nginx/conf.d# cat test.conf
server{
listen 99;
location / {
root /nihao/nibuhao;
index index.html;
try_files $uri $uri/ =404;
}
}
location 实践 2: 网站质量页面,监控 nginx 运行状况:nginx-status
root@itcast:/etc/nginx/conf.d# cat /data/backup/status.conf
server{
listen 99;
location /nginx-status {
stub_status on;
allow 192.168.8.15; 安全权限配置点,不允许别人访问
deny all;
}
}
location 实践 3:上传服务器
root@itcast:/etc/nginx/conf.d# cat upload.conf
server{
listen 99;
location /upload {
alias /var/www/upload;
autoindex on;
}
}
root VS alias
简单点讲:root 是 /var/www/image + /img/ 加上匹配的 uri —- 相对 用于 location 配置
alias 是 /var/www/image/ 忽略匹配的 uri ----- 绝对 用于 other 配置
图片: https://uploader.shimo.im/f/mXKynyi3pEE3eh5e.png
root@itcast:/etc/nginx/conf.d# cat upload.conf
server{
listen 99;
location /upload {
#alias /var/www/upload;
root /var/www;
autoindex on;
}
}
拓展:server 中 listen 端口一样,主机名不一样
直接 3 个 server 字段,端口一样,server_name 不一样
主机 1
a.com 80
b.com 80
c.com 80
root@itcast:/etc/nginx/conf.d# cat test.conf
server{
listen 99;
root /nihao/nibuhao;
index index.html;
location / {
root /nihao/nibuhao1;
index index.html;
try_files $uri $uri/ =404;
}
}
2.2.1 反向代理
代理:分类:正向代理:代替公司内网的客户端去互联网上访问
相亲的时候,自己的照片
反向代理:代替公司内网的服务器向互联网提供服务
相亲的时候,媒婆说的女方形象
拓展:正向解析和反向解析 --- dns 知识范畴
王树森 18:01:28 (多人发送)
2.2 Nginx 进阶知识
2.2.1 反向代理
代理:分类:正向代理:代替公司内网的客户端去互联网上访问
相亲的时候,自己的照片
反向代理:代替公司内网的服务器向互联网提供服务
相亲的时候,媒婆说的女方形象
拓展:正向解析和反向解析 --- dns 知识范畴
正向解析:域名解析为 IP
反向解析:IP 解析为域名 https://www.cnblogs.com/weiap…
关键配置:proxy_pass 代理后的地址;
反向代理示例:root@itcast:/etc/nginx/conf.d# cat proxy.conf
server{
listen 99;
location / {proxy_pass http://192.168.8.15:999/nilaiya/;}
}
server {
listen 999;
location /nilaiya/ {
root /ni/laiya;
index index.html;
try_files $uri $uri/ =404;
}
}
关键点:proxy_pass 后面的地址结尾的 "/" 很重要
配置示例:location /html/ {
1 proxy_pass http://proxy.com;
2 proxy_pass http://proxy.com/;
}
请求地址:http://domain.com/html/test.js
结果:如果是 1,由于地址后面没有 "/",所以 $uri(/html/test.js)作为一个内容和我们的地址拼接在一起
http://proxy.com/html/test.js
如果是 2,由于地址后面有 "/",所以 $uri(/html/test.js)中关键字之后的 的内容 (/test.js), 和代理的地址拼接在一起
http://proxy.com/test.js
——————————————————————————————————————————
2.2.2 负载均衡
负载均衡是一种特殊的反向代理,区别在于团伙打群架
负载均衡的分类:四层负载 port 传输层
七层负载 url 应用层
upstream 的格式:upstream 主机群名称 {
server 主机 1;
server 主机 2;
...
server 主机 3;
}
关键点:配置关键字:upstream
主机群名用在哪里?proxy_pass 后面指定主机
主机列表如何来制作:server 指令了解一下。
简单实践 1:
root@itcast:/etc/nginx/conf.d# cat upstream.conf backends.conf
upstream obackends {
server 192.168.8.15:10086;
server 192.168.8.15:10087;
server 192.168.8.15:10088;
}
server{
listen 80;
location / {proxy_pass http://backends;}
}
server {
listen 192.168.8.15:10086;
root /var/www/html/huang;
index index.html;
location / {try_files $uri $uri/ =404;}
}
server {
listen 192.168.8.15:10087;
root /var/www/html/li;
index index.html;
location / {try_files $uri $uri/ =404;}
}
server {
listen 192.168.8.15:10088;
root /var/www/html/liu;
index index.html;
location / {try_files $uri $uri/ =404;}
}
mkdir /var/www/html/{huang,li,liu}
ls /var/www/html/
echo '<h1> nihao huangxiong</h1>' > /var/www/html/huang/index.html
echo '<h1> nihao lixiong</h1>' > /var/www/html/li/index.html
echo '<h1> nihao liuxiong</h1>' > /var/www/html/liu/index.html
nginx -t
systemctl restart nginx
__
OSI 七层模型
应用层
网络服务与最终用户的一个接口。协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)格式有,JPEG、ASCll、DECOIC、加密格式等
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层,port,ssl 位于传输层,、
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IGMP IP(IPV4 IPV6)ARP RARP
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)将比特组合成字节进而组合成帧,用 MAC 地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC [3] 文档。一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信
图片: https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=591aacf100f79052eb1f403c3cf1d738/0dd7912397dda144d48ab350bbb7d0a20df48655.jpg
超链接:https://www.cnblogs.com/wxd01…
curl 命令:掌握即成功
主机列表属性:
down 主机故障直接隔离
backup 主机管用,但是一般不用,只有紧急或者繁忙的时候再用
max_fails 重试次数,当重试失败次数达到一定程度,就终止给该主机发送请求
fail_timeout 当重试失败停止后,等待一段时间,继续重试
调度算法:
内置策略
雨露均沾 轮训 加权轮训 fair
定向服务 ip_hash
没钱不用
扩展策略
自定义
第三方
图片: https://uploader.shimo.im/f/9…
实践:加权轮训
upstream backends {
server 192.168.8.15:10086 weight=1;
server 192.168.8.15:10087 weight=3;
server 192.168.8.15:10088 weight=1;
}
ip_hash 算法
upstream backends {
ip_hash; *** ip_hash 加上这句话就实现了 ip 哈希
server 192.168.8.15:10086 weight=1;
server 192.168.8.15:10087 weight=3;
server 192.168.8.15:10088 weight=1;
}
url_hash 算法
2.2.3 日志解析
日志定制是工作中很重要的意向内容,特别是监控网站的运行状态
在 /etc/nginx/nginx.conf 文件中配置
日志格式定制:log_format 日志格式名 '内置变量组成的日志格式';
日志格式使用:access_log 日志文件所在路径 采用日志格式名;
err_log 日志文件所在路径 采用日志格式名;
$remote_addr 前一台主机的 ip 地址,不一定是真实的客户端 IP
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的 url 以及请求方法
$status 响应状态码,例如:200 成功、404 页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_referer 可以记录用户是从哪个链接访问过来的
$http_user_agent 用户所使用的代理(一般为浏览器)
日志定制案例:
图片: https://uploader.shimo.im/f/g…
1 定制日志格式
2 在第一个代理上 设置两个真实的报文头
X-Real-IP X-Forwarded-For
3
方法一:在所有的主机上获取 $http_x_forwarded_for
方法二:在最后一台主机上设置 $http_x_real_ip
4 在后端主机上使用定制日志
root@itcast:/etc/nginx/conf.d# cat upstream.conf backends.conf
upstream backends {server 192.168.8.15:10086;}
server{
listen 80;
location / {
proxy_pass http://backends;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 192.168.8.15:10086;
root /var/www/html/huang;
index index.html;
access_log /var/log/nginx/huang.log proxy_format;
real_ip_header X-Forwarded-For;
# set_real_ip_from 192.168.142.0/17 (监听特定网段的 ip)
-# real_ip_recursive on; (多层代理要开启这个才能获得真实的 ip 地址)
location / {try_files $uri $uri/ =404;}
}
拓展:分析一下,real_ip_header 和 X-Forwarded-For
在多层代理中的一个表示样式
real_ip_header 和 X-Forwarded-For 的比较
real_ip : 用于记录真实客户端 IP,如果只有一层代理的话,这两者是一样的,但是如果客户端之前就使用了正向代理的话就会出现代理 IP,不是真实 IP,这时要开启 real_ip_recursive
X-Forwarded-For:用于记录代理信息的,每经过一层代理就记录一次(匿名代理除外)
eg:来自 4.4.4.4 的一个请求,header 包含这样一行
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由 1.1.1.1 发出,经过三层代理,第一层是 2.2.2.2,第二层是 3.3.3.3,而本次请求的来源 IP4.4.4.4 是第三层代理
而 X -Real-IP
// 最后一跳是正向代理,可能会保留真实客户端 IP
X-Real-IP: 1.1.1.1
// 最后一跳是反向代理,比如 Nginx,一般会是与之直接连接的客户端 IP
X-Real-IP: 3.3.3.3
- 多层代理使用 X -Forwarded-For 的效果好于 X -Real-IP
附带:最全的真实 ip 获取,涉及 CDN,XFF 欺骗等
多级代理下的 Nginx 获取用户真实 IP 地址的方法
https://blog.csdn.net/abc8631…
http_realip_module 这个模块,它包括三个指令:
1、set_real_ip_from 是指接受从哪个信任前代理处获得真实用户 ip
2、real_ip_header 是指从接收到报文的哪个 http 首部去获取前代理传送的用户 ip
3、real_ip_recursive 是否递归地排除直至得到用户 ip(默认为 off)
首先,real_ip_header 指定一个 http 首部名称,默认是 X -Real-Ip,假设用默认值的话,nginx 在接收到报文后,会查看 http 首部 X -Real-Ip。
(1)如果有 1 个 IP,它会去核对,发送方的 ip 是否在 set_real_ip_from 指定的信任 ip 列表中。如果是被信任的,它会去认为这个 X -Real-Ip 中的 IP 值是前代理告诉自己的,用户的真实 IP 值,于是,它会将该值赋值给自身的 $remote_addr 变量;如果不被信任,那么将不作处理,那么 $remote_addr 还是发送方的 ip 地址。
(2)如果 X -Real-Ip 有多个 IP 值,比如前一方代理是这么设置的:proxy_set_header X-Real-Ip $proxy_add_x_forwarded_for;
得到的是一串 IP,那么此时 real_ip_recursive 的值就至关重要了。nginx 将会从 ip 列表的右到左,去比较 set_real_ip_from 的信任列表中的 ip。如果 real_ip_recursive 为 off,那么,当最右边一个 IP,发现是信任 IP,即认为下一个 IP(右边第二个)就是用户的真正 IP;如果 real_ip_recursive 为 on,那么将从右到左依次比较,知道找到一个不是信任 IP 为止。然后同样把 IP 值复制给 $remote_addr。(可以参考上面的例子,帮助理解这个过程)
因此,明白了整个过程后,我们知道,用 realip 模块是非常好用的,能满足各种获取用户 IP 的需求,而且不会受到 XFF 欺骗!
那么问题来了,后端除了想获取用户 ip,也想获取代理 ip,怎么办呢?那么此时 $proxy_add_x_forwarded_for 派上用场。只需要在每一层代理 IP,都保持一个良好的习惯:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 然后后端得到的 X -Forwarded-For 首部,依次就是用户 IP 到各层代理的 IP,至于最靠近自己的代理 ip,各种 web 开发语言都有获取发送方真实 IP 的接口了,然后你知道该怎么做了吧?
第 3 章 Docker 快速入门
3.1 docker 快速入门
3.1.1 docker 是什么
快速解决生产问题的一种技术手段 --- 使用范围相当广 C/ S 客户端服务器
三大组成部分:镜像 构建 build
仓库 运输 ship
容器 运行 running
特点:多(运用场景多)快(更新,使用)好(好多人使用)省(开源,省钱,好用),依赖操作系统,依赖网络,银行 U 盾等场景(模拟的软件环境不是真实的硬件环境,模拟不出来)不能使用
3.1.2 部署 docker
1 安装依赖软件
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
2 安装软件
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce
如果这里的走不通报错的话,可以按照下面步骤来
报错:Process: 3485 ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
走加速器
3.1.3 docker 加速器(有好多免费的,下面是北京科大的,18.04)
其他版本的信息也有:http://mirrors.ustc.edu.cn/he…
1.cat /etc/docker/daemon.json,加上后面红色字体
{“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn/”],”insecure-registries”:[]}
{“registry-mirrors”: [“http://f1361db2.m.daocloud.io”], “insecure-registries”: [“192.168.142.145:5000”]}
还是这个最靠谱
注意:daemon.json 文件存在的前提,得有 /etc/docker/ 目录
这个目录是 docker 启动后才创建的
基本命令:docker -v
docker info
=====================================================================
3.2 镜像管理
3.2.1 镜像简介
特点:只读文件
3.2.2 搜索、查看、获取、历史
避免每次都要输入 sudo,可以设置用户全信啊,注意执行后必须重启后登录
sudo usermod -a -G docker $USER
docker search
docker images
docker pull
docker history 镜像名 ----- 可以看到版本变化信息,是否安全
3.2.3 重命名、删除
docker tag image_old_name:old_version image_new_name:new_version
注意:版本号不写,表示 latest
docker rmi image_name|image_id
注意:如果 image_id 一样,那么就用 image_name:version 形式来删除
3.2.4 导出、导入
docker save -o 镜像文件名 docker 镜像名
docker load < 镜像文件名
=======================================================================
3.3 容器管理
3.3.1 容器简介
特点:
容器本身就是一个进程
在 docker 中我们可以为所欲为的地方
3.3.2 查看、启动
docker ps
docker run
-d 守护进程
-i 接受输入的命令
-t 用于接受命令的终端
--name 给容器命名(docker run -d --name test nginx)3.3.3 关闭、删除
docker stop|start
docker rm | rm -f
docker ps -a -q 获取所有容器的 ID
小技巧:docker rm -f $(docker ps -a -q) 批量删除所有的容器
注意:生产中不要用
3.3.4 进入、退出
docker exec -it 容器名称 /bin/bash
exit
3.3.5 基于容器创建镜像
docker commit -m "注释" -a "作者" 容器 id 新镜像名: 新镜像版本
3.3.6 查看正在运行的容器日志、信息
docker logs 容器 id 查看容器的日志信息
docker inspect 容器 id 查看容器的配置内容
注意:二次开发好好的了解一下 inspect 命令的结果内容
为了避免 docker 每次命令都输入 sudo,可以设置用户权限,注意执行后需要注销重新登录
sudo usermod -a -G docker $USER
3.4 仓库管理
3.4.1 仓库简介
分类:安全角度
安全仓库 不安全
位置角度
本地仓库
私有仓库 registry harbor
公有仓库
3.4.2 私有仓库部署
流程:1 获取仓库镜像
2 运行镜像仓库
3 仓库权限配置
4 镜像打标签
5 推送拉取测试
流程:1 获取仓库镜像
docker pull registry
2 运行镜像仓库
docker run -d --name registry1 --restart=always -p 5000:5000 registry
3 仓库权限配置
root@itcast:~# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.15:5000"]}
4 镜像打标签
docker tag busybox 192.168.8.15:5000/busybox:v0.1
5 推送拉取测试
docker push 192.168.8.15:5000/busybox:v0.1
docker pull 192.168.8.15:5000/busybox:v0.1
注意事项:1 运行仓库的时候,添加 --restart 参数
2 推送镜像的时候,镜像的名称应该携带仓库地址
拓展:1 安全仓库的搭建
2 携带用户名和密码的安全仓库
3 企业级仓库 harbor 的搭建
4 私有仓库里面镜像的删除 -====================================================-------===============
3.5 数据管理
3.5.1 数据卷简介
宿主机和容器间共享数据的一种机制
-v 宿主机文件: 容器文件路径
3.5.2 数据卷实践
目录
docker run -d -v /tmp:/test1 nginx
文件
docker run -d --name hah -v /tmp/nihao.txt:/nicai/h.py nginx
需求:如果我准备启动 10 个容器每个容器我都同时挂载 2 个文件
思路 1:一个数据卷操作的命令执行 10 遍
3.5.3 数据卷容器简介
场景:批量数据卷的操作
步骤:1 创建数据卷容器
注意:数据卷容器不会启动
2 启动应用容器的时候,挂载数据卷容器
3.5.4 数据卷容器实践
docker create -v /tmp/:/test -v /suzhuji:/jizhusu -v /su:/us --name vc-test nginx
docker ps
docker ps -a
docker inspect 5d8526a2abe9
docker ps -a
docker run --volumes-from vc-test --name nginx-test1 nginx
docker run -d --volumes-from vc-test --name nginx-test1 nginx
docker run -d --volumes-from vc-test --name nginx-test2 nginx
docker run -d --volumes-from vc-test --name nginx-test3 nginx
docker ps
docker exec -it nginx-test2 /bin/bash
docker exec -it nginx-test3 /bin/bash
拓展:容器里面的数据备份和还原
3.6 网络管理
3.6.1 端口映射详解
随机端口的起始端口号是:32768
每次使用随机端口映射,都会在之前的端口号基础上 +1
好处:无需关心容器的端口号和宿主机上的端口号
所有的容器永远不可能冲突
3.6.2 随机映射实践
docker run -d -P nginx
3.6.3 指定映射实践
-p [宿主机 ip]:[宿主机 port]:[容器端口]
注意:宿主机 ip 不写 表示 0.0.0.0
宿主机 port 不写,表示 随机端口
容器端口必须写
生产中在使用指定端口映射的时候,一定要合理的安排端口的分配
docker run -d -p 192.168.8.15:999:80 nginx
docker run -d -p :999:80 nginx
docker run -d -p :998:80 nginx
docker run -d -p ::80 nginx
拓展:1 docker 的网络模型 (5 种)
docker 自带的网络模型:bridge(默认) none host
docker 其他的网络模型:container overlay
2 docker 网络模型简单实践
3 docker overlay 网络模型实践
weave、flannel、calico、canel、openswitch
4.1 Dockerfile
4.1.1 Dockerfile 简介
作用;自动化的将我们的定制 docker 镜像创建出来
类似于我们的 python 脚本
1 命令必须可执行
2 目标需要相应的流程来配合
一句话:在使用 Dockerfile 之前,手工执行一定要成功
使用准则:大 文件名 Dockerfile 首字母大写
空 Dockerfile 文件在一个空目录下(只存放和 Dockerfile 相关的内容)
单 构建后的 docker 镜像尽量只有一个功能
少 Dockerfile 里面的命令,越少越好,即使是 5 条命令实现一个目的,也要把这 5 条命令放在一行来执行
Dockerfile 的指令类型:1 来源
2 维护者
3 定制命令
4 容器启动时候的第一条命令
Dockerfile 的使用
docker build -t 镜像名称: 镜像版本 Dockerfile 文件所在路径
注意:Dockerfile 文件所在路径 可以是相对路径,也可以是绝对路径
4.1.2 Dockerfile 快速入门
跨主机免密码认证:
1 自己有钥匙和锁
2 把锁挂载房东家屋子门上
3 房东同意我挂锁
4 钥匙和锁测试一下
跨主机免密码认证:
1 主机 1 自己创建秘钥对儿
2 主机 2 使用主机 1 上面的公钥文件
3 主机 2 使用公钥文件来进行用户登录的认证
4 主机 1 登录一下主机 2 测试一下公钥和私钥的认证是否成功
mkdir /docker/images/ssh -p
cd /docker/images/ssh
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
root@admina-virtual-machine:/docker/images/ssh# cat Dockerfile
# 构建一个基于 ubuntu 的 ssh 定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 执行命令
# 增加软件源 -- 由于课堂网络原因,我们不执行这一步
# ADD sources.list /etc/apt/sources.list
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置, 并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动 ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
docker build -t ubuntu-ssh:v0.1 .
docker run -d -p 10086:22 ubuntu-ssh:v0.1
ssh 192.168.8.14 -p 10086
======================================================================
4.1.3 基础指令详解
FROM
MAINTAINER
RUN
EXPOSE
ENTRYPOINT
4.1.4 文件编辑指令详解
ADD 如果传输的是压缩包,会自动在容器里面解压
COPY 纯纯的拷贝动作
VOLUME 产生一个共享的目录
# ADD yasuobao.tar.gz /test/
# COPY yasuobao.tar.gz /copy/
# COPY authorized_keys /copy/
# VOLUME ["VOLUMES"]
4.1.5 环境指令详解
需求:mysql 镜像,设定好了登录用户名 USERNAEM 和密码 PASSWD
基于镜像创建的容器,我们想使用这两个变量来登录,docker run -e
ENV
在构件镜像的时候,给他设定一个环境变量
WORKDIR
切换工作目录
注意:如果切换工作目录后,并没有执行回退的 WORKDIR 指令,那么就会一直在指定的目录下
ENV USERNAME=itcast
ENV PASSWD=itcast
WORKDIR ["/nihao/hah"]
RUN ["touch","itcast.txt"]
=====================================================================
4.2 Dockerfile 构建 django 环境(拓展)
4.2.1 项目描述
4.2.2 手工部署 django 项目环境
4.2.3 Dockerfile 案例实践
如何在生产中定制标准的 docker 镜像
1 标准的工作目录
/docker/images/ 功能目录
2 标准的手工流程
按照我们课件上的分析流程做出来手工执行方案
需求 -- 方案分析 -- 技术关键点 -- 梳理出实施方案
注意:在进入到 Dockerfile 步骤之前,一定要保证手工执行是成功的
而且必须报手工执行的命令梳理出来
3 标准的 Dockerfile 转换
3.1 根据手工梳理出来的命令,准备 Dockerfile 所依赖的软件和文件,放到专用的 Dockerfile 目录里
3.2 分析手工命令,将其转换成 Dockefile 指令
3.3 整理 Dockefile 指令
3.4 执行 Dockefile 文件
3.5 整体测试
===================================================================
项目初期
单机阶段
所有服务都部署到一台主机
应用数据分离阶段
数据库有压力的时候,单独部署
页面动静分离阶段
web 服务有压力的时候,动态请求和静态请求分别管理
应用 | 数据缓存阶段
采取数据缓存的策略,实现有限的资源,创造更高的效益
拓展分析:1 网站项目的架构是一次性做出来的么?不是,一步一步演变过来的
2 演变的措施是一股脑全部实现么?不是,遇到什么问题就解决什么问题
3 每个阶段的措施是一次的么?不是,前面的措施,在后面也可以用,是一个选项
5.2 项目运营
5.2.1 网站分析
常见术语:通用的:IP 独立 ip 数 日志里面的关键字 独立的访问 ip
PV 页面访问量 日志里面的关键字
UV 独立的用户数量 日志里面的关键字
VV 用户访问的页面数量 日志里面的关键字
专用的:BR 页面跳出率 -- 辣眼睛
CR 页面转化率 -- 大眼睛
常见的指标分析方法:定制的
日志分析、监控平台、等等
其他的
通用的网站统计工具