资讯专栏INFORMATION COLUMN

docker进阶,nginx部署的几个重要点详解以及开发流程---持续更新

KunMinX / 3194人阅读

摘要:无论这个连接是外部主动建立的,还是内部建立的。协议有表示层数据的表示安全压缩。在整个发展过程中的所有思想和着重点都以一种称为的文档格式存在。

部署基础知识
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. 阶段

​ 调研阶段 找方向点

</>复制代码

  1. 设计阶段 方向点可视化
  2. 产品:产品需求文档、项目里程表
  3. 开发阶段 产品阶段功能实现
  4. 测试阶段 保证产品的阶段功能
  5. 运营阶段 项目部署 + 运营维护
  6. 关键点:
  7. 阶段间是有前后关系依赖的
  8. 阶段间项目的推进是有文档来主导
  9. 理想化的生命周期和开发模型

1.2新型项目周期

</>复制代码

  1. 软件项目: 一个产品被拆分成了非常多的子功能
  2. 团队组织:高效协作,沟通
  3. 图的理解:
  4. 四个圈串在一起 --- 子功能的完整周期
  5. 单个圈 --- 岗位的工作内容
  6. 图片: https://uploader.shimo.im/f/hRwe365QitwNgyS7.png
  7. 团队组织间的高效协作是很重要的

​ 流程:

</>复制代码

  1. 1 根据需求文档来梳理网站的目标架构
  2. 2 分析产品需求文档的功能,来梳理部署结点
  3. 部署节点示意图:

图片: https://uploader.shimo.im/f/U...

</>复制代码

  1. 3 根据部署结点去互联网上梳理各种解决方案(根据业务需求
  2. 4 整合所有的解决方案,-- 初版部署方案
  3. 5 根据实际的公司业务情况,对初版部署方案进行优化调整

1.3 部署环境:

</>复制代码

  1. 个人开发环境 内容:项目子模块
  2. 公司开发环境 内容:项目模块间联调
  3. 环境一定要和线上环境一致
  4. 测试环境 内容:项目产品质量保证
  5. 预发布环境 内容:项目产品质量保证
  6. 线上环境 内容:项目产品部署+维护

拓展: 环境之间彼此隔离
第 2 章 Nginx进阶

</>复制代码

  1. 2.1 Nginx快速入门
  2. 2.1.1 Nginx简介
  3. 方向:
  4. web服务 反向代理服务器、缓存服务器、邮件服务器
  5. ****** web 反向代理
  6. ***** 缓存
  7. 特点:
  8. 成本低
  9. 资源占用少
  10. 模块化设计
  11. 2.1.2 Nginx部署
  12. 软件安装
  13. apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
  14. apt-get install nginx -y
  15. 注意
  16. 如果软件安装过程中,由于远程仓库安全限制方面的原因导致无法安装成功,使用 --allow-unauthenticated 参数
  17. 服务启动命令:(linux自带的)
  18. systemctl start|stop|restart|reload nginx ***
  19. nginx服务命令:
  20. nginx -t 每次修改配置文件后,都要检查配置文件,如果错误即使启动nginx也不生效更改的内容 ***
  21. nginx -s stop|reload 停止|重载 注意nginx -s reload不需要关闭并重新打开nginx进程,只需要将配置信息重新加载就可以了
  22. 其他命令:

查看服务的端口信息:
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查看进程配置信息

</>复制代码

  1. 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

</>复制代码

  1. 使用原则:

优先使用完整样式,然后使用前缀正则样式,最后使用后缀正则样式,如果正则样式相同的时候,匹配最长,
否则就走非法规则。
非法域名/IP,表示请求到该主机上一个不存在的IP或者域名

}
server {
listen 88;
server_name b.com

}

location配置段

</>复制代码

  1. 语法:
  2. location 匹配条件 匹配样式 {执行动作}
  3. 匹配条件:
  4. 1 精确匹配 =
  5. 2 优先正则 ^~
  6. 3 普通正则 ~区分大小写 !~区分大小写不匹配 ~*不区分大小写 !~* 双重否定
  7. 4 默认规则 空
  8. 匹配样式:
  9. 针对的是url 里面的路径部分
  10. location ~ .(jpe?g)$ {}
  11. location ^~ .(jpeg)$ {}

jpeg

</>复制代码

  1. jg
  2. ~* !~ Jpg
  3. location = /image {
  4. http://a.com/image
  5. location = / { location ~ .(gif|jpg|png|js|css)$ { location !~* .xhtml$ {
  6. ? ?#精确规则A ? ? #正则规则D ? ? #正则规则G
  7. } } }
  8. location = /login { location ~* .png$ { location / {
  9. ? ?#精确规则B ? ? #正则规则E ? ? #通用规则H
  10. } } }
  11. location ^~ /static/ { location !~ .xhtml$ {
  12. ? ?#优先规则C ? ? #正则规则F
  13. } }

http://a.com/other

</>复制代码

  1. $uri /other
  2. $uri/ /other/ 默认首页
  3. location实践1:
  4. root@itcast:/etc/nginx/conf.d# cat test.conf
  5. server{
  6. listen 99;
  7. location / {
  8. root /nihao/nibuhao;
  9. index index.html;
  10. try_files $uri $uri/ =404;
  11. }
  12. }
  13. location实践2: 网站质量页面,监控nginx运行状况:nginx-status
  14. root@itcast:/etc/nginx/conf.d# cat /data/backup/status.conf
  15. server{
  16. listen 99;
  17. location /nginx-status {
  18. stub_status on;
  19. allow 192.168.8.15; 安全权限配置点,不允许别人访问
  20. deny all;
  21. }
  22. }
  23. location实践3:上传服务器
  24. root@itcast:/etc/nginx/conf.d# cat upload.conf
  25. server{
  26. listen 99;
  27. location /upload {
  28. alias /var/www/upload;
  29. autoindex on;
  30. }
  31. }
  32. root VS alias

简单点讲:root是/var/www/image + /img/ 加上匹配的uri ----相对 用于location配置

</>复制代码

  1. alias是/var/www/image/ 忽略匹配的uri -----绝对 用于other配置
  2. 图片: https://uploader.shimo.im/f/mXKynyi3pEE3eh5e.png
  3. root@itcast:/etc/nginx/conf.d# cat upload.conf
  4. server{
  5. listen 99;
  6. location /upload {
  7. #alias /var/www/upload;
  8. root /var/www;
  9. autoindex on;
  10. }
  11. }
  12. 拓展:
  13. server中 listen 端口一样,主机名不一样
  14. 直接3个server字段,端口一样,server_name不一样
  15. 主机1
  16. a.com 80
  17. b.com 80
  18. c.com 80
  19. root@itcast:/etc/nginx/conf.d# cat test.conf
  20. server{
  21. listen 99;
  22. root /nihao/nibuhao;
  23. index index.html;
  24. location / {
  25. root /nihao/nibuhao1;
  26. index index.html;
  27. try_files $uri $uri/ =404;
  28. }
  29. }

2.2.1 反向代理

</>复制代码

  1. 代理:
  2. 分类:
  3. 正向代理: 代替公司内网的客户端去互联网上访问
  4. 相亲的时候,自己的照片
  5. 反向代理: 代替公司内网的服务器向互联网提供服务
  6. 相亲的时候,媒婆说的女方形象
  7. 拓展:
  8. 正向解析和反向解析 --- dns知识范畴

王树森 18:01:28 (多人发送)

</>复制代码

  1. 2.2 Nginx进阶知识
  2. 2.2.1 反向代理
  3. 代理:
  4. 分类:
  5. 正向代理: 代替公司内网的客户端去互联网上访问
  6. 相亲的时候,自己的照片
  7. 反向代理: 代替公司内网的服务器向互联网提供服务
  8. 相亲的时候,媒婆说的女方形象
  9. 拓展:
  10. 正向解析和反向解析 --- dns知识范畴

正向解析:域名解析为IP
反向解析:IP解析为域名 https://www.cnblogs.com/weiap...

</>复制代码

  1. 关键配置:
  2. proxy_pass 代理后的地址;
  3. 反向代理示例:
  4. root@itcast:/etc/nginx/conf.d# cat proxy.conf
  5. server{
  6. listen 99;
  7. location / {
  8. proxy_pass http://192.168.8.15:999/nilaiya/;
  9. }
  10. }
  11. server {
  12. listen 999;
  13. location /nilaiya/ {
  14. root /ni/laiya;
  15. index index.html;
  16. try_files $uri $uri/ =404;
  17. }
  18. }
  19. 关键点:
  20. proxy_pass 后面的地址结尾的"/" 很重要
  21. 配置示例:
  22. location /html/ {
  23. 1 proxy_pass http://proxy.com;
  24. 2 proxy_pass http://proxy.com/;
  25. }
  26. 请求地址:
  27. http://domain.com/html/test.js
  28. 结果:
  29. 如果是 1 ,由于地址后面没有 "/", 所以$uri(/html/test.js)作为一个内容和我们的地址拼接在一起
  30. http://proxy.com/html/test.js
  31. 如果是 2 ,由于地址后面有 "/", 所以$uri(/html/test.js)中关键字之后的 的内容 (/test.js),和代理的地址拼接在一起
  32. http://proxy.com/test.js

——————————————————————————————————————————
2.2.2 负载均衡

</>复制代码

  1. 负载均衡是一种特殊的反向代理,区别在于团伙打群架
  2. 负载均衡的分类:
  3. 四层负载 port 传输层
  4. 七层负载 url 应用层
  5. upstream 的格式:
  6. upstream 主机群名称 {
  7. server 主机1;
  8. server 主机2;
  9. ...
  10. server 主机3;
  11. }
  12. 关键点:
  13. 配置关键字: upstream
  14. 主机群名用在哪里? proxy_pass 后面指定主机
  15. 主机列表如何来制作: server指令了解一下。

简单实践1:

</>复制代码

  1. root@itcast:/etc/nginx/conf.d# cat upstream.conf backends.conf
  2. upstream obackends {
  3. server 192.168.8.15:10086;
  4. server 192.168.8.15:10087;
  5. server 192.168.8.15:10088;
  6. }
  7. server{
  8. listen 80;
  9. location / {
  10. proxy_pass http://backends;
  11. }
  12. }
  13. server {
  14. listen 192.168.8.15:10086;
  15. root /var/www/html/huang;
  16. index index.html;
  17. location / {
  18. try_files $uri $uri/ =404;
  19. }
  20. }
  21. server {
  22. listen 192.168.8.15:10087;
  23. root /var/www/html/li;
  24. index index.html;
  25. location / {
  26. try_files $uri $uri/ =404;
  27. }
  28. }
  29. server {
  30. listen 192.168.8.15:10088;
  31. root /var/www/html/liu;
  32. index index.html;
  33. location / {
  34. try_files $uri $uri/ =404;
  35. }
  36. }
  37. mkdir /var/www/html/{huang,li,liu}
  38. ls /var/www/html/
  39. echo "

    nihao huangxiong

    " > /var/www/html/huang/index.html
  40. echo "

    nihao lixiong

    " > /var/www/html/li/index.html
  41. echo "

    nihao liuxiong

    " > /var/www/html/liu/index.html
  42. nginx -t
  43. systemctl restart nginx

__
OSI七层模型
应用层

</>复制代码

  1. 网络服务与最终用户的一个接口。
  2. 协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层

</>复制代码

  1. 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
  2. 格式有,JPEG、ASCll、DECOIC、加密格式等

会话层

</>复制代码

  1. 建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
  2. 对应主机进程,指本地主机与远程主机正在进行的会话

传输层

</>复制代码

  1. 定义传输数据的协议端口号,以及流控和差错校验。
  2. 协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层,port,ssl位于传输层,、

网络层

</>复制代码

  1. 进行逻辑地址寻址,实现不同网络之间的路径选择。
  2. 协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层

</>复制代码

  1. 建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)
  2. 将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层

</>复制代码

  1. 建立、维护、断开物理连接。(由底层网络定义协议)
  2. TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
  3. 应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC [3] 文档。
  4. 一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信
  5. 图片: https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=591aacf100f79052eb1f403c3cf1d738/0dd7912397dda144d48ab350bbb7d0a20df48655.jpg
超链接:https://www.cnblogs.com/wxd01... curl命令:掌握即成功

主机列表属性:

</>复制代码

  1. down 主机故障直接隔离
  2. backup 主机管用,但是一般不用,只有紧急或者繁忙的时候再用
  3. max_fails 重试次数,当重试失败次数达到一定程度,就终止给该主机发送请求
  4. fail_timeout 当重试失败停止后,等待一段时间,继续重试

调度算法:

</>复制代码

  1. 内置策略
  2. 雨露均沾 轮训 加权轮训 fair
  3. 定向服务 ip_hash
  4. 没钱不用
  5. 扩展策略
  6. 自定义
  7. 第三方

图片: https://uploader.shimo.im/f/9...

</>复制代码

  1. 实践:
  2. 加权轮训
  3. upstream backends {
  4. server 192.168.8.15:10086 weight=1;
  5. server 192.168.8.15:10087 weight=3;
  6. server 192.168.8.15:10088 weight=1;
  7. }
  8. ip_hash算法
  9. upstream backends {
  10. ip_hash; *** ip_hash 加上这句话就实现了ip哈希
  11. server 192.168.8.15:10086 weight=1;
  12. server 192.168.8.15:10087 weight=3;
  13. server 192.168.8.15:10088 weight=1;
  14. }
url_hash算法

2.2.3 日志解析

</>复制代码

  1. 日志定制是工作中很重要的意向内容,特别是监控网站的运行状态
  2. 在 /etc/nginx/nginx.conf 文件中配置
  3. 日志格式定制:
  4. log_format 日志格式名 "内置变量组成的日志格式 ";
  5. 日志格式使用:
  6. access_log 日志文件所在路径 采用日志格式名;
  7. 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. 1 定制日志格式
  2. 2 在第一个代理上 设置两个真实的报文头
  3. X-Real-IP X-Forwarded-For
  4. 3
  5. 方法一:在所有的主机上获取 $http_x_forwarded_for
  6. 方法二:在最后一台主机上设置 $http_x_real_ip
  7. 4 在后端主机上使用定制日志
  8. root@itcast:/etc/nginx/conf.d# cat upstream.conf backends.conf
  9. upstream backends {
  10. server 192.168.8.15:10086;
  11. }
  12. server{
  13. listen 80;
  14. location / {
  15. proxy_pass http://backends;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. }
  19. }
  20. server {
  21. listen 192.168.8.15:10086;
  22. root /var/www/html/huang;
  23. index index.html;
  24. access_log /var/log/nginx/huang.log proxy_format;
  25. real_ip_header X-Forwarded-For;
  26. # set_real_ip_from 192.168.142.0/17 (监听特定网段的ip)
  27. -# real_ip_recursive on; (多层代理要开启这个才能获得真实的ip地址)
  28. location / {
  29. try_files $uri $uri/ =404;
  30. }
  31. }
  32. 拓展:
  33. 分析一下,real_ip_header 和 X-Forwarded-For
  34. 在多层代理中的一个表示样式

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快速入门

</>复制代码

  1. 3.1 docker快速入门
  2. 3.1.1 docker是什么
  3. 快速解决生产问题的一种技术手段 --- 使用范围相当广 C/S客户端服务器
  4. 三大组成部分:
  5. 镜像 构建 build
  6. 仓库 运输 ship
  7. 容器 运行 running

特点:多(运用场景多)快(更新,使用)好(好多人使用)省(开源,省钱,好用),依赖操作系统,依赖网络,银行U盾等场景(模拟的软件环境不是真实的硬件环境,模拟不出来)不能使用

</>复制代码

  1. 3.1.2 部署docker
  2. 1 安装依赖软件
  3. apt-get update
  4. apt-get install apt-transport-https ca-certificates curl software-properties-common -y
  5. 2 安装软件
  6. curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  7. add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  8. apt-get update
  9. apt-get install docker-ce

如果这里的走不通报错的话,可以按照下面步骤来
报错:Process: 3485 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
走加速器

</>复制代码

  1. 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"]}
还是这个最靠谱

</>复制代码

  1. 注意:
  2. daemon.json 文件存在的前提,得有 /etc/docker/ 目录
  3. 这个目录是docker启动后才创建的
  4. 基本命令:
  5. docker -v
  6. docker info
  7. =====================================================================
  8. 3.2 镜像管理
  9. 3.2.1 镜像简介
  10. 特点:
  11. 只读文件
  12. 3.2.2 搜索、查看、获取、历史

避免每次都要输入sudo,可以设置用户全信啊,注意执行后必须重启后登录
sudo usermod -a -G docker $USER

</>复制代码

  1. docker search
  2. docker images
  3. docker pull
  4. docker history 镜像名 ----- 可以看到版本变化信息,是否安全
  5. 3.2.3 重命名、删除
  6. docker tag image_old_name:old_version image_new_name:new_version
  7. 注意:版本号不写,表示 latest
  8. docker rmi image_name|image_id
  9. 注意:如果image_id一样,那么就用 image_name:version形式来删除
  10. 3.2.4 导出、导入
  11. docker save -o 镜像文件名 docker镜像名
  12. docker load < 镜像文件名

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

3.3 容器管理

</>复制代码

  1. 3.3.1 容器简介
  2. 特点:

容器本身就是一个进程

</>复制代码

  1. 在docker中我们可以为所欲为的地方
  2. 3.3.2 查看、启动
  3. docker ps
  4. docker run
  5. -d 守护进程
  6. -i 接受输入的命令
  7. -t 用于接受命令的终端
  8. --name 给容器命名 (docker run -d --name test nginx)
  9. 3.3.3 关闭、删除
  10. docker stop|start
  11. docker rm | rm -f
  12. docker ps -a -q 获取所有容器的ID
  13. 小技巧:
  14. docker rm -f $(docker ps -a -q) 批量删除所有的容器
  15. 注意:生产中不要用
  16. 3.3.4 进入、退出
  17. docker exec -it 容器名称 /bin/bash
  18. exit
  19. 3.3.5 基于容器创建镜像
  20. docker commit -m "注释" -a "作者" 容器id 新镜像名:新镜像版本
  21. 3.3.6 查看正在运行的容器日志、信息
  22. docker logs 容器id 查看容器的日志信息
  23. docker inspect 容器id 查看容器的配置内容
  24. 注意:
  25. 二次开发好好的了解一下inspect命令的结果内容

为了避免docker每次命令都输入sudo,可以设置用户权限,注意执行后需要注销重新登录

sudo usermod -a -G docker $USER

</>复制代码

  1. 3.4 仓库管理
  2. 3.4.1 仓库简介
  3. 分类:
  4. 安全角度
  5. 安全仓库 不安全
  6. 位置角度
  7. 本地仓库
  8. 私有仓库 registry harbor
  9. 公有仓库
  10. 3.4.2 私有仓库部署
  11. 流程:
  12. 1 获取仓库镜像
  13. 2 运行镜像仓库
  14. 3 仓库权限配置
  15. 4 镜像打标签
  16. 5 推送拉取测试
  17. 流程:
  18. 1 获取仓库镜像
  19. docker pull registry
  20. 2 运行镜像仓库
  21. docker run -d --name registry1 --restart=always -p 5000:5000 registry
  22. 3 仓库权限配置
  23. root@itcast:~# cat /etc/docker/daemon.json
  24. {"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.15:5000"]}
  25. 4 镜像打标签
  26. docker tag busybox 192.168.8.15:5000/busybox:v0.1
  27. 5 推送拉取测试
  28. docker push 192.168.8.15:5000/busybox:v0.1
  29. docker pull 192.168.8.15:5000/busybox:v0.1
  30. 注意事项:
  31. 1 运行仓库的时候,添加 --restart参数
  32. 2 推送镜像的时候,镜像的名称应该携带仓库地址
  33. 拓展:
  34. 1 安全仓库的搭建
  35. 2 携带用户名和密码的安全仓库
  36. 3 企业级仓库harbor的搭建
  37. 4 私有仓库里面镜像的删除-====================================================-------===============

3.5 数据管理

</>复制代码

  1. 3.5.1 数据卷简介
  2. 宿主机和容器间共享数据的一种机制
  3. -v 宿主机文件:容器文件路径
  4. 3.5.2 数据卷实践
  5. 目录
  6. docker run -d -v /tmp:/test1 nginx
  7. 文件
  8. docker run -d --name hah -v /tmp/nihao.txt:/nicai/h.py nginx
  9. 需求:
  10. 如果我准备启动10个容器每个容器我都同时挂载2个文件
  11. 思路1:
  12. 一个数据卷操作的命令执行10遍
  13. 3.5.3 数据卷容器简介
  14. 场景:
  15. 批量数据卷的操作
  16. 步骤:
  17. 1 创建数据卷容器
  18. 注意:数据卷容器不会启动
  19. 2 启动应用容器的时候,挂载数据卷容器
  20. 3.5.4 数据卷容器实践
  21. docker create -v /tmp/:/test -v /suzhuji:/jizhusu -v /su:/us --name vc-test nginx
  22. docker ps
  23. docker ps -a
  24. docker inspect 5d8526a2abe9
  25. docker ps -a
  26. docker run --volumes-from vc-test --name nginx-test1 nginx
  27. docker run -d --volumes-from vc-test --name nginx-test1 nginx
  28. docker run -d --volumes-from vc-test --name nginx-test2 nginx
  29. docker run -d --volumes-from vc-test --name nginx-test3 nginx
  30. docker ps
  31. docker exec -it nginx-test2 /bin/bash
  32. docker exec -it nginx-test3 /bin/bash
  33. 拓展:
  34. 容器里面的数据备份和还原

</>复制代码

  1. 3.6 网络管理
  2. 3.6.1 端口映射详解
  3. 随机端口的起始端口号是:32768
  4. 每次使用随机端口映射,都会在之前的端口号基础上+1
  5. 好处:
  6. 无需关心容器的端口号和宿主机上的端口号
  7. 所有的容器永远不可能冲突
  8. 3.6.2 随机映射实践
  9. docker run -d -P nginx
  10. 3.6.3 指定映射实践
  11. -p [宿主机ip]:[宿主机port]:[容器端口]
  12. 注意:
  13. 宿主机ip不写 表示 0.0.0.0
  14. 宿主机port不写,表示 随机端口
  15. 容器端口必须写
  16. 生产中在使用指定端口映射的时候,一定要合理的安排端口的分配
  17. docker run -d -p 192.168.8.15:999:80 nginx
  18. docker run -d -p :999:80 nginx
  19. docker run -d -p :998:80 nginx
  20. docker run -d -p ::80 nginx
  21. 拓展:
  22. 1 docker的网络模型 (5种)
  23. docker自带的网络模型:bridge(默认) none host
  24. docker其他的网络模型:container overlay
  25. 2 docker 网络模型简单实践
  26. 3 docker overlay网络模型实践
  27. weave、flannel、calico、canel、openswitch

4.1 Dockerfile

</>复制代码

  1. 4.1.1 Dockerfile简介
  2. 作用;
  3. 自动化的将我们的定制docker镜像创建出来
  4. 类似于我们的python脚本
  5. 1 命令必须可执行
  6. 2 目标需要相应的流程来配合
  7. 一句话:
  8. 在使用Dockerfile之前,手工执行一定要成功
  9. 使用准则:
  10. 大 文件名 Dockerfile 首字母大写
  11. 空 Dockerfile文件在一个空目录下(只存放和Dockerfile相关的内容)
  12. 单 构建后的docker镜像尽量只有一个功能
  13. 少 Dockerfile里面的命令,越少越好,
  14. 即使是5条命令实现一个目的,也要把这5条命令放在一行来执行
  15. Dockerfile的指令类型:
  16. 1 来源
  17. 2 维护者
  18. 3 定制命令
  19. 4 容器启动时候的第一条命令
  20. Dockerfile的使用
  21. docker build -t 镜像名称:镜像版本 Dockerfile文件所在路径
  22. 注意:
  23. Dockerfile文件所在路径 可以是相对路径,也可以是绝对路径

4.1.2 Dockerfile快速入门

</>复制代码

  1. 跨主机免密码认证:
  2. 1 自己有钥匙和锁
  3. 2 把锁挂载房东家屋子门上
  4. 3 房东同意我挂锁
  5. 4 钥匙和锁测试一下
  6. 跨主机免密码认证:
  7. 1 主机1 自己创建秘钥对儿
  8. 2 主机2 使用主机1上面的公钥文件
  9. 3 主机2 使用公钥文件来进行用户登录的认证
  10. 4 主机1 登录一下主机2 测试一下公钥和私钥的认证是否成功
  11. mkdir /docker/images/ssh -p
  12. cd /docker/images/ssh
  13. ssh-keygen -t rsa
  14. cat ~/.ssh/id_rsa.pub > authorized_keys
  15. root@admina-virtual-machine:/docker/images/ssh# cat Dockerfile
  16. # 构建一个基于ubuntu的ssh定制镜像
  17. # 基础镜像
  18. FROM ubuntu
  19. # 镜像作者
  20. MAINTAINER President.Wang 000000@qq.com
  21. # 执行命令
  22. # 增加软件源 -- 由于课堂网络原因,我们不执行这一步
  23. # ADD sources.list /etc/apt/sources.list
  24. # 安装 ssh 服务
  25. 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
  26. # 复制配置文件到相应位置,并赋予脚本可执行权限
  27. ADD authorized_keys /root/.ssh/authorized_keys
  28. # 对外端口
  29. EXPOSE 22
  30. # 启动ssh
  31. ENTRYPOINT ["/usr/sbin/sshd","-D"]
  32. docker build -t ubuntu-ssh:v0.1 .
  33. docker run -d -p 10086:22 ubuntu-ssh:v0.1
  34. ssh 192.168.8.14 -p 10086

======================================================================
4.1.3 基础指令详解

</>复制代码

  1. FROM
  2. MAINTAINER
  3. RUN
  4. EXPOSE
  5. ENTRYPOINT
  6. 4.1.4 文件编辑指令详解
  7. ADD 如果传输的是压缩包,会自动在容器里面解压
  8. COPY 纯纯的拷贝动作
  9. VOLUME 产生一个共享的目录
  10. # ADD yasuobao.tar.gz /test/
  11. # COPY yasuobao.tar.gz /copy/
  12. # COPY authorized_keys /copy/
  13. # VOLUME ["VOLUMES"]
  14. 4.1.5 环境指令详解
  15. 需求:
  16. mysql 镜像,设定好了登录用户名USERNAEM和密码PASSWD
  17. 基于镜像创建的容器,我们想使用这两个变量来登录, docker run -e
  18. ENV
  19. 在构件镜像的时候,给他设定一个环境变量
  20. WORKDIR
  21. 切换工作目录
  22. 注意:
  23. 如果切换工作目录后,并没有执行回退的WORKDIR指令,那么就会一直在指定的目录下
  24. ENV USERNAME=itcast
  25. ENV PASSWD=itcast
  26. WORKDIR ["/nihao/hah"]
  27. RUN ["touch","itcast.txt"]

=====================================================================
4.2 Dockerfile构建django环境(拓展)

</>复制代码

  1. 4.2.1 项目描述
  2. 4.2.2 手工部署django项目环境
  3. 4.2.3 Dockerfile案例实践
  4. 如何在生产中定制标准的docker镜像
  5. 1 标准的工作目录
  6. /docker/images/功能目录
  7. 2 标准的手工流程
  8. 按照我们课件上的分析流程做出来手工执行方案
  9. 需求 -- 方案分析 -- 技术关键点 -- 梳理出实施方案
  10. 注意:
  11. 在进入到Dockerfile步骤之前,一定要保证手工执行是成功的
  12. 而且必须报手工执行的命令梳理出来
  13. 3 标准的Dockerfile转换

3.1 根据手工梳理出来的命令,准备Dockerfile所依赖的软件和文件,放到专用的Dockerfile目录里

</>复制代码

  1. 3.2 分析手工命令,将其转换成Dockefile指令
  2. 3.3 整理Dockefile指令
  3. 3.4 执行Dockefile文件
  4. 3.5 整体测试

===================================================================
项目初期

</>复制代码

  1. 单机阶段
  2. 所有服务都部署到一台主机
  3. 应用数据分离阶段
  4. 数据库有压力的时候,多带带部署
  5. 页面动静分离阶段
  6. web服务有压力的时候,动态请求和静态请求分别管理
  7. 应用|数据缓存阶段
  8. 采取数据缓存的策略,实现有限的资源,创造更高的效益
  9. 拓展分析:
  10. 1 网站项目的架构是一次性做出来的么?
  11. 不是,一步一步演变过来的
  12. 2 演变的措施是一股脑全部实现么?
  13. 不是,遇到什么问题就解决什么问题
  14. 3 每个阶段的措施是一次的么?
  15. 不是,前面的措施,在后面也可以用,是一个选项

5.2 项目运营

</>复制代码

  1. 5.2.1 网站分析
  2. 常见术语:
  3. 通用的:
  4. IP 独立ip数 日志里面的关键字 独立的访问ip
  5. PV 页面访问量 日志里面的关键字
  6. UV 独立的用户数量 日志里面的关键字
  7. VV 用户访问的页面数量 日志里面的关键字
  8. 专用的:
  9. BR 页面跳出率 -- 辣眼睛
  10. CR 页面转化率 -- 大眼睛
  11. 常见的指标分析方法:
  12. 定制的
  13. 日志分析、监控平台、等等
  14. 其他的
  15. 通用的网站统计工具

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27801.html

相关文章

  • docker进阶nginx部署几个重要详解以及开发流程---持续更新

    摘要:无论这个连接是外部主动建立的,还是内部建立的。协议有表示层数据的表示安全压缩。在整个发展过程中的所有思想和着重点都以一种称为的文档格式存在。 部署基础知识url:协议://网站地址:端口(/)路径地址?参数eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服务器 80端口:找服务器上提供服务的应用 nginx uri:/ab...

    ytwman 评论0 收藏0
  • 后端知识拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞这个词来自操作系统的线程进程的状态模型网络爬虫基本原理一后端掘金网络爬虫是捜索引擎抓取系统的重要组成部分。每门主要编程语言现未来已到后端掘金使用和在相同环境各加载多张小图片,性能相差一倍。 2016 年度小结(服务器端方向)| 掘金技术征文 - 后端 - 掘金今年年初我花了三个月的业余时间用 Laravel 开发了一个项目,在此之前,除了去年换工作准备面试时,我并...

    CoderBear 评论0 收藏0
  • 后端知识拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞这个词来自操作系统的线程进程的状态模型网络爬虫基本原理一后端掘金网络爬虫是捜索引擎抓取系统的重要组成部分。每门主要编程语言现未来已到后端掘金使用和在相同环境各加载多张小图片,性能相差一倍。 2016 年度小结(服务器端方向)| 掘金技术征文 - 后端 - 掘金今年年初我花了三个月的业余时间用 Laravel 开发了一个项目,在此之前,除了去年换工作准备面试时,我并...

    Carl 评论0 收藏0
  • CI Weekly #4 | 不同规模的团队,如何做好持续集成?

    摘要:王者荣耀项目组高级测试工程师工程师文化团队中的实践本文不是一篇入门教程,而是从结合实际场景,阐述在团队协作中如何去好好地应用。 CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Tips 。同步于 flow.ci Blog、微信公众号、官方微...

    jeffrey_up 评论0 收藏0

发表评论

0条评论

KunMinX

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<