Docker为什么出现

一款产品: 开发到上线,有两套环境自己本地的环境和生成环境, 这时候环境不一致可能会导致各种问题, 或者代码的版本更新导致的bug
另外一个原因: 环境的配置是十分麻烦的, 单机还算好说, 如果是集群的话每一台机器都需要部署环境 这是很费时费力的

例: 目前php项目上线都是先在服务器上部署好环境再把git仓库的代码拉去下来运行的, 这里就可能会产生环境不一致的问题, 所以有人就想能不能在项目打包的时候把环境也代码一起打包

传统: 开发写代码, 运维来部署
现在: 开发打包部署上线 ,一套流程做完

Docker 解决以上问题

Docker 的核心思想

  • Docker的思想来自于集装箱, 以php,nginx,mysql为例 其中的每个服务都是一个小的集装箱, 它们之间是相互隔离的
  • Docker想把所有的服务都打包装箱

Docker和虚拟机的区别

  1. 在容器技术出来之前, 我们使用的虚拟机技术
  2. 虚拟机是在 win, mac 系统中安装一个虚拟机软件, 通过软件我们可以虚拟出来一个或者多台电脑. 这样是很笨重的!
  3. 虚拟机也是虚拟化技术, Docker容器技术也是一种虚拟机技术

虚拟机技术

45243-qmufhukzlpe.png

虚拟机的缺点
  • 占用资源多
  • 冗余步骤多
  • 启动慢

容器化技术

容器化技术它不是模拟的一个完整的操作系统

28353-hu6pc4pd48q.png

Docker和虚拟机的不同

  • 传统虚拟机, 虚拟出硬件, 运行一个完整的操作系统. 然后在这个系统上安装和运行软件
  • docker容器内直接运行宿主机的内核,容器是没有直接的内核的也没有虚拟硬件, 所以就轻便的很多
  • 每个容器之间是相互隔离的, 每个容器内都有属于自己的文件系统, 互不影响 就算是有其中一个容器也就是服务挂了也不会影响到其他的容器正常运行

学习大纲

  • Docker 概述
  • Docker 安装
  • Docker 命令

    • 镜像命令
    • 容器命令
    • 操作命令
    • .....
  • Docker 镜像
  • 容器数据卷
  • DockerFile
  • Docker网络原理
  • Docker Compose
  • Docker Swarm
  • CICD Jenkins

在 nginx 配置中添加

server {
    listen 80;
    server_name ....
    root ....;
    
    # Cross Domains
    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Methods "OPTION, POST, GET";
    add_header Access-Control-Allow-Headers "*";
}

查询是否开启 mysql 慢查询

  1. 首先进入到 mysql 命令行模式
mysql -u 用户名 -p 
  1. 查看是否开启慢查询功能
 show variables like 'slow_query%';
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log      | OFF                                |
| slow_query_log_file | /var/lib/mysql/homestead-slow.log |
+---------------------+-----------------------------------+
  • slow_query_log = off 表示没有开启慢查询
  • slow_query_log_file 表示慢查询日志存放的目录

开启慢查询和相关设置

  1. 开启慢查询(及时性重启mysql后失效)
set global slow_query_log=ON;
  1. 设置慢查询日志存放的位置
set global slow_query_log_file='/var/lib/mysql/slow.log';

设置慢查询时间(超过此值的sql将会记录下来)

  1. 查询当前的设置的时间(mysql默认10秒)
show variables like 'long_query%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
  1. 设置慢查询时间
set long_query_time=0.5;
  • 通常来说一条sql执行时间不应该超过500毫秒, 这个时间已经很慢了
  • sql执行50毫秒左右最佳
  • 这里要提一下程序执行的时间不止是sql 还需要php代码执行等因素,所以一般来说 get请求100毫秒左右, post请求 200毫秒以内 超过这个时间就需要具体优化了.

letsencrypt 为1.8亿个网站提供TLS证书的非盈利性证书颁发机构
安装 letsencrypt
apt install letsencrypt
生成 ssl 所需证书文件

注意: 生成的时候要先停止 nginx

letsencrypt certonly --standalone --email your@mail.com -d text1.com -d text2.com
成功生成如下:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/xxx/fullchain.pem. Your cert
will expire on 2020-05-19. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le
证书有效期只有 90 天, 免费续期的命令如下
letsencrypt certonly --renew-by-default --email your@mail.com -d text1.com -d text2.com
配置 crontab 定时任务, 自动续期
编写自动续期脚本, updateHttps.sh
sudo service nginx stop

/usr/bin/letsencrypt certonly --renew-by-default --email your@mail.com -d text1.com -d text2.com

sudo service nginx start
crontab -e
* * 1 * * /realpath/updateHttps.sh
修改 nginx.conf, 添加 https
server {
    # 强制跳转https
    if ($scheme = http) {
       return 301 https://$server_name$request_uri;
    }

    listen 443 ssl;
    ssl_certificate   /etc/letsencrypt/live/text1.comfullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/text1.comprivkey.pem;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

}