Date: Fri, 1 Nov 2019 13:26:03 +0800
Subject: [PATCH 26/40] =?UTF-8?q?Docker=E6=A6=82=E5=BF=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...23\350\277\236\346\216\245\346\261\240.md" | 21 ++++++
.../java-learning-path-and-methods.md | 2 +-
docs/tools/Docker.md | 74 +++++++++----------
3 files changed, 59 insertions(+), 38 deletions(-)
create mode 100644 "docs/database/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240.md"
diff --git "a/docs/database/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240.md" "b/docs/database/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240.md"
new file mode 100644
index 00000000000..3e84dfc8efd
--- /dev/null
+++ "b/docs/database/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240.md"
@@ -0,0 +1,21 @@
+- 公众号和Github待发文章:[数据库:数据库连接池原理详解与自定义连接池实现](https://www.fangzhipeng.com/javainterview/2019/07/15/mysql-connector-pool.html)
+- [基于JDBC的数据库连接池技术研究与应用](http://blog.itpub.net/9403012/viewspace-111794/)
+- [数据库连接池技术详解](https://juejin.im/post/5b7944c6e51d4538c86cf195)
+
+数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存
+
+连接池是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。**在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。**连接池还减少了用户必须等待建立与数据库的连接的时间。
+
+操作过数据库的朋友应该都知道数据库连接池这个概念,它几乎每天都在和我们打交道,但是你真的了解 **数据库连接池** 吗?
+
+### 没有数据库连接池之前
+
+我相信你一定听过这样一句话:**Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁**。
+
+
+
+
+
+
+
+
diff --git a/docs/questions/java-learning-path-and-methods.md b/docs/questions/java-learning-path-and-methods.md
index 1242ed23a08..3d9f246ff6f 100644
--- a/docs/questions/java-learning-path-and-methods.md
+++ b/docs/questions/java-learning-path-and-methods.md
@@ -16,7 +16,7 @@
**下面的学习路线以及方法是笔主根据个人学习经历总结改进后得出,我相信照着这条学习路线来你的学习效率会非常高。**
-学习某个知识点的过程中如果不知道看什么书的话,可以查看这篇文章 :[Java 学习必备书籍推荐终极版!](../data/java-recommended-books.md "Java 学习必备书籍推荐终极版!")。
+学习某个知识点的过程中如果不知道看什么书的话,可以查看这篇文章 :[Java 学习必备书籍推荐终极版!](https://github.com/Snailclimb/JavaGuide/blob/master/docs/data/java-recommended-books.md)。
另外,很重要的一点:**建议使用 Intellij IDEA 进行编码,可以单独抽点时间学习 Intellij IDEA 的使用。**
diff --git a/docs/tools/Docker.md b/docs/tools/Docker.md
index 3af6600bdbb..137bd54c7d4 100644
--- a/docs/tools/Docker.md
+++ b/docs/tools/Docker.md
@@ -1,33 +1,8 @@
**本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令。**
-
-
-- [一 先从认识容器开始](#一-先从认识容器开始)
- - [1.1 什么是容器?](#11-什么是容器)
- - [先来看看容器较为官方的解释](#先来看看容器较为官方的解释)
- - [再来看看容器较为通俗的解释](#再来看看容器较为通俗的解释)
- - [1.2 图解物理机,虚拟机与容器](#12-图解物理机虚拟机与容器)
-- [二 再来谈谈 Docker 的一些概念](#二-再来谈谈-docker-的一些概念)
- - [2.1 什么是 Docker?](#21-什么是-docker)
- - [2.2 Docker 思想](#22-docker-思想)
- - [2.3 Docker 容器的特点](#23-docker-容器的特点)
- - [2.4 为什么要用 Docker ?](#24-为什么要用-docker-)
-- [三 容器 VS 虚拟机](#三-容器-vs-虚拟机)
- - [3.1 两者对比图](#31-两者对比图)
- - [3.2 容器与虚拟机总结](#32-容器与虚拟机总结)
- - [3.3 容器与虚拟机两者是可以共存的](#33-容器与虚拟机两者是可以共存的)
-- [四 Docker基本概念](#四-docker基本概念)
- - [4.1 镜像(Image):一个特殊的文件系统](#41-镜像image一个特殊的文件系统)
- - [4.2 容器(Container):镜像运行时的实体](#42-容器container镜像运行时的实体)
- - [4.3仓库(Repository):集中存放镜像文件的地方](#43仓库repository集中存放镜像文件的地方)
-- [五 最后谈谈:Build Ship and Run](#五-最后谈谈build-ship-and-run)
-- [六 总结](#六-总结)
-
-
-
-> **Docker 是世界领先的软件容器平台**,所以想要搞懂Docker的概念我们必须先从容器开始说起。
-
-## 一 先从认识容器开始
+## 一 认识容器
+
+**Docker 是世界领先的软件容器平台**,所以想要搞懂Docker的概念我们必须先从容器开始说起。
### 1.1 什么是容器?
@@ -64,7 +39,7 @@
---
-> 相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识,下面我们就来谈谈Docker的一些概念。
+**相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识,下面我们就来谈谈Docker的一些概念。**
## 二 再来谈谈 Docker 的一些概念
@@ -111,7 +86,7 @@
---
-> 每当说起容器,我们不得不将其与虚拟机做一个比较。就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。
+**每当说起容器,我们不得不将其与虚拟机做一个比较。就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。**
## 三 容器 VS 虚拟机
@@ -141,11 +116,9 @@
---
-> Docker中非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
-
## 四 Docker基本概念
-Docker 包括三个基本概念
+**Docker中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。**
- **镜像(Image)**
- **容器(Container)**
@@ -178,7 +151,7 @@ Docker 包括三个基本概念
按照 Docker 最佳实践的要求,**容器不应该向其存储层内写入任何数据** ,容器存储层要保持无状态化。**所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录**,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, **使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。**
-### 4.3仓库(Repository):集中存放镜像文件的地方
+### 4.3 仓库(Repository):集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, **如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。**
@@ -196,7 +169,7 @@ Docker 包括三个基本概念
---
-> Docker的概念基本上已经讲完,最后我们谈谈:Build, Ship, and Run。
+**Docker的概念基本上已经讲完,最后我们谈谈:Build, Ship, and Run。**
## 五 最后谈谈:Build Ship and Run
如果你搜索Docker官网,会发现如下的字样:**“Docker - Build, Ship, and Run Any App, Anywhere”**。那么Build, Ship, and Run到底是在干什么呢?
@@ -209,13 +182,40 @@ Docker 包括三个基本概念
**Docker 运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将Docker称为码头工人或码头装卸工,这和Docker的中文翻译搬运工人如出一辙。**
-## 六 总结
+### 七 简单了解一下Docker底层原理
-本文主要把Docker中的一些常见概念做了详细的阐述,但是并不涉及Docker的安装、镜像的使用、容器的操作等内容。这部分东西,希望读者自己可以通过阅读书籍与官方文档的形式掌握。如果觉得官方文档阅读起来很费力的话,这里推荐一本书籍《Docker技术入门与实战第二版》。
+Docker 技术是基于 LXC(Linux container- Linux容器)虚拟容器技术的。
+
+> LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
+
+LXC 技术主要是借助Linux内核中提供的CGroup功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
+
+**cgroup 和 namespace 介绍:**
+
+- **namespace 是 Linux 内核用来隔离内核资源的方式。** 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
+ (以上关于 namespace 介绍内容来自https://www.cnblogs.com/sparkdev/p/9365405.html ,更多关于namespace 的呢内容可以查看这篇文章 )。
+- **CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。**
+
+ (以上关于 CGroup 介绍内容来自 https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html ,更多关于CGroup 的呢内容可以查看这篇文章 )。
+
+**cgroup 和 namespace 两者对比:**
+
+两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace是为了隔离进程组之间的资源,而cgroup是为了对一组进程进行统一的资源监控和限制。
+
+## 八 总结
+
+本文主要把Docker中的一些常见概念做了详细的阐述,但是并不涉及Docker的安装、镜像的使用、容器的操作等内容。这部分东西,希望读者自己可以通过阅读书籍与官方文档的形式掌握。如果觉得官方文档阅读起来很费力的话,这里推荐一本书籍《Docker技术入门与实战第二版》。
+## 九 推荐阅读
+- [10分钟看懂Docker和K8S](https://zhuanlan.zhihu.com/p/53260098)
+- [从零开始入门 K8s:详解 K8s 容器基本概念](https://www.infoq.cn/article/te70FlSyxhltL1Cr7gzM)
+## 十 参考
+- [Linux Namespace和Cgroup](https://segmentfault.com/a/1190000009732550)
+- [LXC vs Docker: Why Docker is Better](https://www.upguard.com/articles/docker-vs-lxc)
+- [CGroup 介绍、应用实例及原理描述](https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html)
From 5cdd7820cf17e2b317b2b4ef7697aa037023f8b3 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 13:26:15 +0800
Subject: [PATCH 27/40] =?UTF-8?q?=E9=98=BF=E9=87=8C=E4=BA=91=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 6 +-
...77\347\224\250\347\273\217\351\252\214.md" | 149 ++++++++++++++++++
2 files changed, 154 insertions(+), 1 deletion(-)
create mode 100644 "docs/tools/\351\230\277\351\207\214\344\272\221\346\234\215\345\212\241\345\231\250\344\275\277\347\224\250\347\273\217\351\252\214.md"
diff --git a/README.md b/README.md
index 34b40a0dff0..a87262ea599 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
-**[推荐一下阿里云双11的活动:云服务器1折起,仅86元/年,限量抢购!](https://www.aliyun.com/1111/2019/group-buying-share?ptCode=32AE103FC8249634736194795A3477C4647C88CF896EF535&userCode=hf47liqn&share_source=copy_link)** (仅限新人,老用户可以考虑使用家人或者朋友账号购买,推荐799/3年 2核4G 这个性价比和适用面更广)
+**[推荐一下阿里云双11的活动:云服务器1折起,仅86元/年,限量抢购!](https://www.aliyun.com/1111/2019/group-buying-share?ptCode=32AE103FC8249634736194795A3477C4647C88CF896EF535&userCode=hf47liqn&share_source=copy_link)** (仅限新人,老用户可以考虑使用家人或者朋友账号购买,推荐799/3年 2核4G 这个性价比和适用面更广。不懂怎么使用云服务器的朋友可以看这篇[阿里云服务器使用经验](docs/tools/阿里云服务器使用经验.md))。
@@ -251,6 +251,10 @@
* [Docker 基本概念解读](docs/tools/Docker.md)
* [一文搞懂 Docker 镜像的常用操作!](docs/tools/Docker-Image.md)
+### 其他
+
+- [阿里云服务器使用经验](docs/tools/阿里云服务器使用经验.md)
+
## 资源
### 书单
diff --git "a/docs/tools/\351\230\277\351\207\214\344\272\221\346\234\215\345\212\241\345\231\250\344\275\277\347\224\250\347\273\217\351\252\214.md" "b/docs/tools/\351\230\277\351\207\214\344\272\221\346\234\215\345\212\241\345\231\250\344\275\277\347\224\250\347\273\217\351\252\214.md"
new file mode 100644
index 00000000000..55c89645362
--- /dev/null
+++ "b/docs/tools/\351\230\277\351\207\214\344\272\221\346\234\215\345\212\241\345\231\250\344\275\277\347\224\250\347\273\217\351\252\214.md"
@@ -0,0 +1,149 @@
+最近很多阿里云双 11 做活动,优惠力度还挺大的,很多朋友都买以最低的价格买到了自己的云服务器。不论是作为学习机还是部署自己的小型网站或者服务来说都是很不错的!
+
+但是,很多朋友都不知道如何正确去使用。下面我简单分享一下自己的使用经验。
+
+总结一下,主要涉及下面几个部分,对于新手以及没有这么使用过云服务的朋友还是比较友好的:
+
+1. 善用阿里云镜像市场节省安装 Java 环境的时间,相关说明都在根目录下的 readme.txt. 文件里面;
+2. 本地通过 SSH 连接阿里云服务器很容易,配置好 Host地址,通过 root 用户加上实例密码直接连接即可。
+3. 本地连接 MySQL 数据库需要简单配置一下安全组和并且允许 root 用户在任何地方进行远程登录。
+4. 通过 Alibaba Cloud Toolkit 部署 Spring Boot 项目到阿里云服务器真的很方便。
+
+**[活动地址](https://www.aliyun.com/1111/2019/group-buying-share?ptCode=32AE103FC8249634736194795A3477C4647C88CF896EF535&userCode=hf47liqn&share_source=copy_link)** (仅限新人,老用户可以考虑使用家人或者朋友账号购买,推荐799/3年 2核4G 这个性价比和适用面更广)
+
+### 善用阿里云镜像市场节省安装环境的时间
+
+基本的购买流程这里就不多说了,另外这里需要注意的是:其实 Java 环境是不需要我们手动安装配置的,阿里云提供的镜像市场有一些常用的环境。
+
+> 阿里云镜像市场是指阿里云建立的、由镜像服务商向用户提供其镜像及相关服务的网络平台。这些镜像在操作系统上整合了具体的软件环境和功能,比如Java、PHP运行环境、控制面板等,供有相关需求的用户开通实例时选用。
+
+具体如何在购买云服务器的时候通过镜像创建实例或者已有ECS用户如何使用镜像可以查看官方详细的介绍,地址:
+
+https://help.aliyun.com/knowledge_detail/41987.html?spm=a2c4g.11186631.2.1.561e2098dIdCGZ
+
+### 当我们成功购买服务器之后如何通过 SSH 连接呢?
+
+创建好 ECS 后,你绑定的手机会收到短信,会告知你初始密码的。你可以登录管理控制台对密码进行修改,修改密码需要在管理控制台重启服务器才能生效。
+
+你也可以在阿里云 ECS 控制台重置实例密码,如下图所示。
+
+
+
+**第一种连接方式是直接在阿里云服务器管理的网页上连接**。如上图所示, 点击远程连接,然后输入远程连接密码,这个并不是你重置实例密码得到的密码,如果忘记了直接修改远程连接密码即可。
+
+**第二种方式是在本地通过命令或者软件连接。** 推荐使用这种方式,更加方便。
+
+ **Windows 推荐使用 Xshell 连接,具体方式如下:**
+
+> Window电脑在家,这里直接用找到的一些图片给大家展示一个。
+
+
+
+
+
+接着点开,输入账号:root,命名输入刚才设置的密码,点ok就可以了
+
+
+
+**Mac 或者 Linux 系统都可以直接使用 ssh 命令进行连接,非常方便。**
+
+成功连接之后,控制台会打印出如下消息。
+
+```shell
+➜ ~ ssh root@47.107.159.12 -p 22
+root@47.107.159.12's password:
+Last login: Wed Oct 30 09:31:31 2019 from 220.249.123.170
+
+Welcome to Alibaba Cloud Elastic Compute Service !
+
+ 欢迎使用 Tomcat8 JDK8 Mysql5.7 环境
+
+ 使用说明请参考 /root/readme.txt 文件
+```
+
+我当时选择是阿里云提供好的 Java 环境,自动就提供了 Tomcat、 JDK8 、Mysql5.7,所以不需要我们再进行安装配置了,节省了很多时间。另外,需要注意的是:**一定要看 /readme.txt ,Tomcat、 JDK8 、Mysql5.7相关配置以及安装路径等说明都在里面。**
+
+### 如何连接数据库?
+
+ **如需外网远程访问mysql 请参考以上网址 设置mysql及阿里云安全组**。
+
+
+
+Mysql为了安全性,在默认情况下用户只允许在本地登录,但是可以使用 SSH 方式连接。如果我们不想通过 SSH 方式连接的话就需要对 MySQL 进行简单的配置。
+
+```shell
+#允许root用户在任何地方进行远程登录,并具有所有库任何操作权限:
+# *.*代表所有库表 “%”代表所有IP地址
+mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY "自定义密码" WITH GRANT OPTION;
+Query OK, 0 rows affected, 1 warning (0.00 sec)
+#刷新权限。
+mysql>flush privileges;
+#退出mysql
+mysql>exit
+#重启MySQL生效
+[root@snailclimb]# systemctl restart mysql
+```
+
+这样的话,我们就能在本地进行连接了。Windows 推荐使用Navicat或者SQLyog。
+
+> Window电脑在家,这里用 Mac 上的MySQL可视化工具Sequel Pro给大家演示一下。
+
+
+
+### 如何把一个Spring Boot 项目部署到服务器上呢?
+
+默认大家都是用 IDEA 进行开发。另外,你要有一个简单的 Spring Boot Web 项目。如果还不了解 Spring Boot 的话,一个简单的 Spring Boot 版 "Hello World "项目,地址如下:
+
+https://github.com/Snailclimb/springboot-guide/blob/master/docs/start/springboot-hello-world.md 。
+
+**1.下载一个叫做 Alibaba Cloud Toolkit 的插件。**
+
+
+
+**2.进入 Preference 配置一个 Access Key ID 和 Access Key Secret。**
+
+
+
+**3.部署项目到 ECS 上。**
+
+
+
+
+
+按照上面这样填写完基本配置之后,然后点击 run 运行即可。运行成功,控制台会打印出如下信息:
+
+```shell
+[INFO] Deployment File is Uploading...
+[INFO] IDE Version:IntelliJ IDEA 2019.2
+[INFO] Alibaba Cloud Toolkit Version:2019.9.1
+[INFO] Start upload hello-world-0.0.1-SNAPSHOT.jar
+[INFO][##################################################] 100% (18609645/18609645)
+[INFO] Succeed to upload, 18609645 bytes have been uploaded.
+[INFO] Upload Deployment File to OSS Success
+[INFO] Target Deploy ECS: { 172.18.245.148 / 47.107.159.12 }
+[INFO] Command: { source /etc/profile; cd /springboot; }
+ Tip: The deployment package will be temporarily stored in Alibaba Cloud Security OSS and will be
+ deleted after the deployment is complete. Please be assured that no one can access it except you.
+
+[INFO] Create Deploy Directory Success.
+
+[INFO] Deployment File is Downloading...
+[INFO] Download Deployment File from OSS Success
+
+[INFO] File Upload Total time: 16.676 s
+```
+
+ 通过控制台答应出的信息可以看出:通过这个插件会自动把这个 Spring Boot 项目打包成一个 jar 包,然后上传到你的阿里云服务器中指定的文件夹中,你只需要登录你的阿里云服务器,然后通过 `java -jar hello-world-0.0.1-SNAPSHOT.jar`命令运行即可。
+
+```shell
+[root@snailclimb springboot]# ll
+total 18176
+-rw-r--r-- 1 root root 18609645 Oct 30 08:25 hello-world-0.0.1-SNAPSHOT.jar
+[root@snailclimb springboot]# java -jar hello-world-0.0.1-SNAPSHOT.jar
+```
+
+ 然后你就可以在本地访问访问部署在你的阿里云 ECS 上的服务了。
+
+
+
+**[推荐一下阿里云双11的活动:云服务器1折起,仅86元/年,限量抢购!](https://www.aliyun.com/1111/2019/group-buying-share?ptCode=32AE103FC8249634736194795A3477C4647C88CF896EF535&userCode=hf47liqn&share_source=copy_link)** (仅限新人,老用户可以考虑使用家人或者朋友账号购买,推荐799/3年 2核4G 这个性价比和适用面更广)
\ No newline at end of file
From cd33c26a92e905e386dec72de97f24bccbf08c34 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 16:47:52 +0800
Subject: [PATCH 28/40] =?UTF-8?q?Update=20Java=E7=BC=96=E7=A8=8B=E8=A7=84?=
=?UTF-8?q?=E8=8C=83.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...26\347\250\213\350\247\204\350\214\203.md" | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index 11b7410e1c8..b9cd000a989 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -8,3 +8,24 @@
### 个人
- **程序员你为什么这么累:**
+
+### 如何写出优雅的 Java 代码
+
+1. 使用 IntelliJ IDEA 作为您的集成开发环境 (IDE)
+1. 使用 JDK 8 或更高版本
+1. 使用 Maven/Gradle
+1. 使用 Lombok
+1. 编写单元测试
+1. 重构:常见,但也很慢
+1. 注意代码规范
+1. 定期联络客户,以获取他们的反馈
+
+上述建议的详细内容:[八点建议助您写出优雅的Java代码](docs/八点建议助您写出优雅的Java代码.md)。
+
+更多代码优化相关内容推荐:
+
+- [业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!](https://juejin.im/post/5dad23685188251d2c4ea2b6)
+
+- [一些不错的 Java 实践!推荐阅读3遍以上!](http://lrwinx.github.io/2017/03/04/%E7%BB%86%E6%80%9D%E6%9E%81%E6%81%90-%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BC%9A%E5%86%99java%E5%90%97/)
+
+- [[解锁新姿势] 兄dei,你代码需要优化了](https://juejin.im/post/5dafbc02e51d4524a0060bdd)
\ No newline at end of file
From 48e72bb60257c7d341104800a4a4bb3a5172197e Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 17:16:19 +0800
Subject: [PATCH 29/40] =?UTF-8?q?Update=20Java=E7=BC=96=E7=A8=8B=E8=A7=84?=
=?UTF-8?q?=E8=8C=83.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Java\347\274\226\347\250\213\350\247\204\350\214\203.md" | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index b9cd000a989..99d588e16b9 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -25,7 +25,6 @@
更多代码优化相关内容推荐:
- [业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!](https://juejin.im/post/5dad23685188251d2c4ea2b6)
-
- [一些不错的 Java 实践!推荐阅读3遍以上!](http://lrwinx.github.io/2017/03/04/%E7%BB%86%E6%80%9D%E6%9E%81%E6%81%90-%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BC%9A%E5%86%99java%E5%90%97/)
-
-- [[解锁新姿势] 兄dei,你代码需要优化了](https://juejin.im/post/5dafbc02e51d4524a0060bdd)
\ No newline at end of file
+- [[解锁新姿势] 兄dei,你代码需要优化了](https://juejin.im/post/5dafbc02e51d4524a0060bdd)
+- [消灭 Java 代码的“坏味道”](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485599&idx=1&sn=d83ff4e6b1ee951a0a33508a10980ea3&chksm=cea24754f9d5ce426d18b435a8c373ddc580c06c7d6a45cc51377361729c31c7301f1bbc3b78&token=1328169465&lang=zh_CN#rd)
\ No newline at end of file
From 1c4abc3a4bacef4eea5170cf6c8f0285e912f9c8 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 17:22:49 +0800
Subject: [PATCH 30/40] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index a87262ea599..ec6dbbd8968 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@
- [JVM](#jvm)
- [I/O](#io)
- [Java 8](#java-8)
- - [编程规范](#编程规范)
+ - [编程规范/优雅 Java代码必备实践](#编程规范/优雅 Java代码必备实践)
- [网络](#网络)
- [操作系统](#操作系统)
- [Linux相关](#linux相关)
@@ -110,9 +110,9 @@
* [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md)
* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md)
-### 编程规范
+ ### 编程规范/优雅 Java代码必备实践
-- [Java 编程规范](docs/java/Java编程规范.md)
+* [Java 编程规范](docs/java/Java编程规范.md)
## 网络
From a0aba05a79fe0ebac6d0ae247161076674097db8 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 17:24:56 +0800
Subject: [PATCH 31/40] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index ec6dbbd8968..e2f53bc5ca1 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@
- [JVM](#jvm)
- [I/O](#io)
- [Java 8](#java-8)
- - [编程规范/优雅 Java代码必备实践](#编程规范/优雅 Java代码必备实践)
+ - [优雅 Java 代码必备实践(Java编程规范)](#优雅-java-代码必备实践java编程规范)
- [网络](#网络)
- [操作系统](#操作系统)
- [Linux相关](#linux相关)
@@ -110,7 +110,7 @@
* [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md)
* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md)
- ### 编程规范/优雅 Java代码必备实践
+ ### 优雅 Java代码必备实践(Java编程规范)
* [Java 编程规范](docs/java/Java编程规范.md)
From bb8191ab309f88b0e2a0a1b1a577ec7d9ec89885 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 17:26:47 +0800
Subject: [PATCH 32/40] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index e2f53bc5ca1..e07aaa1a250 100644
--- a/README.md
+++ b/README.md
@@ -110,7 +110,7 @@
* [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md)
* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md)
- ### 优雅 Java代码必备实践(Java编程规范)
+### 优雅 Java代码必备实践(Java编程规范)
* [Java 编程规范](docs/java/Java编程规范.md)
From bd1fa704f1279043f68b7f6c2d76ca51ee6f3ba5 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 17:28:24 +0800
Subject: [PATCH 33/40] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index e07aaa1a250..73ef094d1e8 100644
--- a/README.md
+++ b/README.md
@@ -110,7 +110,7 @@
* [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md)
* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md)
-### 优雅 Java代码必备实践(Java编程规范)
+### 优雅 Java 代码必备实践(Java编程规范)
* [Java 编程规范](docs/java/Java编程规范.md)
From 039d7f94dbe375f112c135bf8c44ca58fdc8d3be Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Fri, 1 Nov 2019 18:01:57 +0800
Subject: [PATCH 34/40] =?UTF-8?q?Java=20=E7=BC=96=E7=A8=8B=E8=A7=84?=
=?UTF-8?q?=E8=8C=83=E4=BB=A5=E5=8F=8A=E4=BC=98=E9=9B=85Java=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E5=AE=9E=E8=B7=B5=E6=80=BB=E7=BB=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
.../Java\347\274\226\347\250\213\350\247\204\350\214\203.md" | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 73ef094d1e8..6050a14f5fc 100644
--- a/README.md
+++ b/README.md
@@ -112,7 +112,7 @@
### 优雅 Java 代码必备实践(Java编程规范)
-* [Java 编程规范](docs/java/Java编程规范.md)
+* [Java 编程规范以及优雅Java代码实践总结](docs/java/Java编程规范.md)
## 网络
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index 99d588e16b9..2f719bc1df2 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -1,4 +1,4 @@
-根据各位建议加上了这部分内容,我暂时只是给出了两个资源,后续可能会对重要的点进行总结,然后更新在这里,如果你总结过这类东西,欢迎与我联系!
+讲真的,下面推荐的文章或者资源建议阅读 3 遍以上。
### 团队
From 00b7bc73e8a50cf86a9de6f8ff94615296774a2f Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Sat, 2 Nov 2019 08:20:54 +0800
Subject: [PATCH 35/40] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B9=8B=E9=97=B4?=
=?UTF-8?q?=E7=9A=84=E8=B0=83=E7=94=A8=E4=B8=BA=E5=95=A5=E4=B8=8D=E7=9B=B4?=
=?UTF-8?q?=E6=8E=A5=E7=94=A8=20HTTP=20=E8=80=8C=E7=94=A8=20RPC=EF=BC=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 3 +-
.../data-communication/why-use-rpc.md | 97 +++++++++++++++++++
...10\344\270\252\351\227\256\351\242\230.md" | 0
3 files changed, 99 insertions(+), 1 deletion(-)
create mode 100644 docs/system-design/data-communication/why-use-rpc.md
rename "docs/system-design/website-architecture/\343\200\220\351\235\242\350\257\225\347\262\276\351\200\211\343\200\221\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md" => "docs/system-design/website-architecture/\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md" (100%)
diff --git a/README.md b/README.md
index 6050a14f5fc..2bb3b018b89 100644
--- a/README.md
+++ b/README.md
@@ -181,6 +181,7 @@
### 数据通信
- [数据通信(RESTful、RPC、消息队列)相关知识点总结](docs/system-design/data-communication/summary.md)
+- [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/system-design/data-communication/why-use-rpc.md)
#### Dubbo
@@ -208,7 +209,7 @@
- [一文读懂分布式应该学什么](docs/system-design/website-architecture/分布式.md)
- [8 张图读懂大型网站技术架构](docs/system-design/website-architecture/8%20张图读懂大型网站技术架构.md)
-- [【面试精选】关于大型网站系统架构你不得不懂的10个问题](docs/system-design/website-architecture/【面试精选】关于大型网站系统架构你不得不懂的10个问题.md)
+- [【面试精选】关于大型网站系统架构你不得不懂的10个问题](docs/system-design/website-architecture/关于大型网站系统架构你不得不懂的10个问题.md)
## 面试指南
diff --git a/docs/system-design/data-communication/why-use-rpc.md b/docs/system-design/data-communication/why-use-rpc.md
new file mode 100644
index 00000000000..bbad824f9c1
--- /dev/null
+++ b/docs/system-design/data-communication/why-use-rpc.md
@@ -0,0 +1,97 @@
+## 什么是 RPC?RPC原理是什么?
+
+### **什么是 RPC?**
+
+RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 当然可以,但是可能会比较慢而且一些优化做的并不好。 RPC 的出现就是为了解决这个问题。
+
+### **RPC原理是什么?**
+
+我这里这是简单的提一下,详细内容可以查看下面这篇文章:
+
+http://www.importnew.com/22003.html
+
+
+
+1. 服务消费方(client)调用以本地调用方式调用服务;
+2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
+3. client stub找到服务地址,并将消息发送到服务端;
+4. server stub收到消息后进行解码;
+5. server stub根据解码结果调用本地的服务;
+6. 本地服务执行并将结果返回给server stub;
+7. server stub将返回结果打包成消息并发送至消费方;
+8. client stub接收到消息,并进行解码;
+9. 服务消费方得到最终结果。
+
+下面再贴一个网上的时序图:
+
+
+
+### RPC 解决了什么问题?
+
+从上面对 RPC 介绍的内容中,概括来讲RPC 主要解决了:**让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。**
+
+### 常见的 RPC 框架总结?
+
+- **RMI(JDK自带):** JDK自带的RPC,有很多局限性,不推荐使用。
+- **Dubbo:** Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
+- **gRPC** :gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
+
+- **Hessian:** Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
+- **Thrift:** Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
+
+## 既有 HTTP ,为啥用 RPC 进行服务调用?
+
+###RPC 只是一种设计而已
+
+RPC 只是一种概念、一种设计,就是为了解决 **不同服务之间的调用问题**, 它一般会包含有 **传输协议** 和 **序列化协议** 这两个。
+
+实现 RPC 的可以传输协议可以直接建立在 TCP 之上,也可以建立在 HTTP 协议之上。**大部分 RPC 框架都是使用的 TCP 连接(gRPC使用了HTTP2)。**
+
+### HTTP 和 TCP
+
+**可能现在很多对计算机网络不太熟悉的朋友已经被搞蒙了,要想真正搞懂,还需要来简单复习一下计算机网络基础知识:**
+
+> 我们通常谈计算机网络的五层协议的体系结构是指:应用层、传输层、网络层、数据链路层、物理层。
+>
+> **应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。**HTTP 属于应用层协议,它会基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过 URL 向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。HTTP协议建立在 TCP 协议之上。
+>
+> **运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务**。TCP是传输层协议,主要解决数据如何在网络中传输。相比于UDP,**TCP** 提供的是**面向连接**的,**可靠的**数据传输服务。
+
+**主要关键就在 HTTP 使用的 TCP 协议,和我们自定义的 TCP 协议在报文上的区别。**
+
+**http1.1协议的 TCP 报文包含太多在传输过程中可能无用的信息:**
+
+```
+HTTP/1.0 200 OK
+Content-Type: text/plain
+Content-Length: 137582
+Expires: Thu, 05 Dec 1997 16:00:00 GMT
+Last-Modified: Wed, 5 August 1996 15:55:28 GMT
+Server: Apache 0.84
+
+
+ Hello World
+
+```
+
+**使用自定义 TCP 协议进行传输就会避免上面这个问题,极大地减轻了传输数据的开销。**这也就是为什么通常会采用自定义 TCP 协议的 RPC 来进行进行服务调用的真正原因。初次之外,成熟的 RPC 框架还提供好了“服务自动注册与发现”、"智能负载均衡"、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择 RPC 进行服务注册和发现的一方面原因吧!
+
+###一个常见的错误观点
+
+很多文章中还会提到说 HTTP 协议相较于自定义 TCP 报文协议,增加的开销在于连接的建立与断开,但是这个观点已经被否认,下面截取自知乎中一个回答,原回答地址:https://www.zhihu.com/question/41609070/answer/191965937。
+
+>首先要否认一点 HTTP 协议相较于自定义 TCP 报文协议,增加的开销在于连接的建立与断开。HTTP 协议是支持连接池复用的,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接。二一要说的是 HTTP 也可以使用 Protobuf 这种二进制编码协议对内容进行编码,因此二者最大的区别还是在传输协议上。
+
+### 题外话
+
+初次之外,还需要注意的一点是 Spring Cloud Netflix 并没有使用 RPC 框架来进行不同服务之间的调用,而是使用 HTTP 协议进行调用的,速度虽然不比 RPC ,但是使用 HTTP 协议也会带来其他很多好处(这一点,可以自行查阅相关资料了解)。
+
+## 参考链接
+
+
+
+## 相关文章
+
+- http://www.ruanyifeng.com/blog/2016/08/http.html (HTTP 协议入门- 阮一峰)
+
+
\ No newline at end of file
diff --git "a/docs/system-design/website-architecture/\343\200\220\351\235\242\350\257\225\347\262\276\351\200\211\343\200\221\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md" "b/docs/system-design/website-architecture/\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md"
similarity index 100%
rename from "docs/system-design/website-architecture/\343\200\220\351\235\242\350\257\225\347\262\276\351\200\211\343\200\221\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md"
rename to "docs/system-design/website-architecture/\345\205\263\344\272\216\345\244\247\345\236\213\347\275\221\347\253\231\347\263\273\347\273\237\346\236\266\346\236\204\344\275\240\344\270\215\345\276\227\344\270\215\346\207\202\347\232\20410\344\270\252\351\227\256\351\242\230.md"
From 28d955ddb12957cbfc131e6991d42f18032da242 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Sat, 2 Nov 2019 08:25:56 +0800
Subject: [PATCH 36/40] =?UTF-8?q?Redis=20=E9=9B=86=E7=BE=A4=E4=BB=A5?=
=?UTF-8?q?=E5=8F=8A=E5=BA=94=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 3 ++-
...17\212\345\272\224\347\224\250\345\234\272\346\231\257.md" | 4 ++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 2bb3b018b89..982f23a3b81 100644
--- a/README.md
+++ b/README.md
@@ -158,7 +158,8 @@
* [Redis 总结](docs/database/Redis/Redis.md)
* [Redlock分布式锁](docs/database/Redis/Redlock分布式锁.md)
-* [如何做可靠的分布式锁,Redlock真的可行么](docs/database/Redis/如何做可靠的分布式锁,Redlock真的可行么.md)
+* [如何做可靠的分布式锁,Redlock真的可行么]()
+* [几种常见的 Redis 集群以及使用场景](docs/database/Redis/redis集群以及应用场景.md)
## 系统设计
diff --git "a/docs/database/Redis/redis\351\233\206\347\276\244\344\273\245\345\217\212\345\272\224\347\224\250\345\234\272\346\231\257.md" "b/docs/database/Redis/redis\351\233\206\347\276\244\344\273\245\345\217\212\345\272\224\347\224\250\345\234\272\346\231\257.md"
index c963ffc34e2..641e6bfd310 100644
--- "a/docs/database/Redis/redis\351\233\206\347\276\244\344\273\245\345\217\212\345\272\224\347\224\250\345\234\272\346\231\257.md"
+++ "b/docs/database/Redis/redis\351\233\206\347\276\244\344\273\245\345\217\212\345\272\224\347\224\250\345\234\272\346\231\257.md"
@@ -1,3 +1,7 @@
+相关阅读:
+
+- [史上最全Redis高可用技术解决方案大全](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484850&idx=1&sn=3238360bfa8105cf758dcf7354af2814&chksm=cea24a79f9d5c36fb2399aafa91d7fb2699b5006d8d037fe8aaf2e5577ff20ae322868b04a87&token=1082669959&lang=zh_CN&scene=21#wechat_redirect)
+
# Redis 集群以及应用
## 集群
From e30a9788fa39bcaca6d26edc17b49adad9a036eb Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Sun, 3 Nov 2019 14:20:22 +0800
Subject: [PATCH 37/40] Update why-use-rpc.md
---
docs/system-design/data-communication/why-use-rpc.md | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/docs/system-design/data-communication/why-use-rpc.md b/docs/system-design/data-communication/why-use-rpc.md
index bbad824f9c1..c6358f35103 100644
--- a/docs/system-design/data-communication/why-use-rpc.md
+++ b/docs/system-design/data-communication/why-use-rpc.md
@@ -76,6 +76,10 @@ Server: Apache 0.84
**使用自定义 TCP 协议进行传输就会避免上面这个问题,极大地减轻了传输数据的开销。**这也就是为什么通常会采用自定义 TCP 协议的 RPC 来进行进行服务调用的真正原因。初次之外,成熟的 RPC 框架还提供好了“服务自动注册与发现”、"智能负载均衡"、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择 RPC 进行服务注册和发现的一方面原因吧!
+**相关阅读:**
+
+- http://www.ruanyifeng.com/blog/2016/08/http.html (HTTP 协议入门- 阮一峰)
+
###一个常见的错误观点
很多文章中还会提到说 HTTP 协议相较于自定义 TCP 报文协议,增加的开销在于连接的建立与断开,但是这个观点已经被否认,下面截取自知乎中一个回答,原回答地址:https://www.zhihu.com/question/41609070/answer/191965937。
@@ -86,12 +90,5 @@ Server: Apache 0.84
初次之外,还需要注意的一点是 Spring Cloud Netflix 并没有使用 RPC 框架来进行不同服务之间的调用,而是使用 HTTP 协议进行调用的,速度虽然不比 RPC ,但是使用 HTTP 协议也会带来其他很多好处(这一点,可以自行查阅相关资料了解)。
-## 参考链接
-
-## 相关文章
-
-- http://www.ruanyifeng.com/blog/2016/08/http.html (HTTP 协议入门- 阮一峰)
-
-
\ No newline at end of file
From 59ba6306d8f848f580eeaf49c36351661670a7bc Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Sun, 3 Nov 2019 17:19:09 +0800
Subject: [PATCH 38/40] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 982f23a3b81..d31e78a8557 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@
- [数据通信(消息队列、Dubbo ... )](#数据通信)
- [权限认证](#权限认证)
- [设计模式(工厂模式、单例模式 ... )](#设计模式)
- - [网站架构](#网站架构)
+ - [架构](#架构)
- [面试指南](#面试指南)
- [备战面试](#备战面试)
- [常见面试题总结](#常见面试题总结)
@@ -206,7 +206,7 @@
- [设计模式系列文章](docs/system-design/设计模式.md)
-### 网站架构
+### 架构
- [一文读懂分布式应该学什么](docs/system-design/website-architecture/分布式.md)
- [8 张图读懂大型网站技术架构](docs/system-design/website-architecture/8%20张图读懂大型网站技术架构.md)
From 25c42e03936952ccb6361de97619c68fbb590bf4 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Mon, 4 Nov 2019 21:23:01 +0800
Subject: [PATCH 39/40] =?UTF-8?q?Update=20=E5=90=8E=E7=AB=AF=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E5=91=98=E5=BF=85=E5=A4=87=E7=9A=84Linux=E5=9F=BA?=
=?UTF-8?q?=E7=A1=80=E7=9F=A5=E8=AF=86.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\237\272\347\241\200\347\237\245\350\257\206.md" | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md"
index 199bfc9b35a..3af99b4e656 100644
--- "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md"
+++ "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md"
@@ -147,10 +147,10 @@ Linux命令大全:[http://man.linuxde.net/](http://man.linuxde.net/)
注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
6. **`cp -r 目录名称 目录拷贝的目标位置`:** 拷贝目录(改),-r代表递归拷贝
-
+
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归
7. **`rm [-rf] 目录`:** 删除目录(删)
-
+
注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都直接使用`rm -rf` 目录/文件/压缩包
@@ -331,20 +331,29 @@ passwd命令用于设置用户的认证信息,包括用户密码、密码过
### 4.8 其他常用命令
- **`pwd`:** 显示当前所在位置
+
+- `sudo + 其他命令`:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
+
- **`grep 要搜索的字符串 要搜索的文件 --color`:** 搜索命令,--color代表高亮显示
+
- **`ps -ef`/`ps -aux`:** 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:**`ps aux|grep redis`** (查看包括redis字符串的进程),也可使用 `pgrep redis -a`。
注意:如果直接用ps((Process Status))命令,会显示所有进程的状态,通常结合grep命令查看某进程的状态。
+
- **`kill -9 进程的pid`:** 杀死进程(-9 表示强制终止。)
先用ps查找进程,然后用kill杀掉
+
- **网络通信命令:**
- 查看当前系统的网卡信息:ifconfig
- 查看与某台机器的连接情况:ping
- 查看当前系统的端口使用:netstat -an
+
- **net-tools 和 iproute2 :**
`net-tools`起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持`iproute2`。linux ip命令类似于ifconfig,但功能更强大,旨在替代它。更多详情请阅读[如何在Linux中使用IP命令和示例](https://linoxide.com/linux-command/use-ip-command-linux)
+
- **`shutdown`:** `shutdown -h now`: 指定现在立即关机;`shutdown +5 "System will shutdown after 5 minutes"`:指定5分钟后关机,同时送出警告信息给登入用户。
+
- **`reboot`:** **`reboot`:** 重开机。**`reboot -w`:** 做个重开机的模拟(只有纪录并不会真的重开机)。
## 公众号
From 5345b5d608ad1f784ffcd40a88fe17117a46e8a7 Mon Sep 17 00:00:00 2001
From: Kou Shuang
Date: Mon, 4 Nov 2019 21:23:03 +0800
Subject: [PATCH 40/40] Update Docker.md
---
docs/tools/Docker.md | 199 ++++++++++++++++++++++++++++++-------------
1 file changed, 142 insertions(+), 57 deletions(-)
diff --git a/docs/tools/Docker.md b/docs/tools/Docker.md
index 137bd54c7d4..dbf00dce138 100644
--- a/docs/tools/Docker.md
+++ b/docs/tools/Docker.md
@@ -1,45 +1,48 @@
-**本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令。**
+**本文只是对 Docker 的概念做了较为详细的介绍,并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。**
## 一 认识容器
-**Docker 是世界领先的软件容器平台**,所以想要搞懂Docker的概念我们必须先从容器开始说起。
+**Docker 是世界领先的软件容器平台**,所以想要搞懂 Docker 的概念我们必须先从容器开始说起。
### 1.1 什么是容器?
#### 先来看看容器较为官方的解释
-**一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。**
+**一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。**
- **容器镜像是轻量的、可执行的独立软件包** ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
-- **容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。**
+- **容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。**
- **容器赋予了软件独立性** ,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
#### 再来看看容器较为通俗的解释
**如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。**
-
+
+
+
### 1.2 图解物理机,虚拟机与容器
+
关于虚拟机与容器的对比在后面会详细介绍到,这里只是通过网上的图片加深大家对于物理机、虚拟机与容器这三者的理解(下面的图片来源与网络)。
**物理机**
-
+
**虚拟机:**
-
+
**容器:**
-
+
通过上面这三张抽象图,我们可以大概可以通过类比概括出: **容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。**
---
-**相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识,下面我们就来谈谈Docker的一些概念。**
+**相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识,下面我们就来谈谈 Docker 的一些概念。**
## 二 再来谈谈 Docker 的一些概念
@@ -47,11 +50,10 @@
### 2.1 什么是 Docker?
-说实话关于Docker是什么并太好说,下面我通过四点向你说明Docker到底是个什么东西。
+说实话关于 Docker 是什么并太好说,下面我通过四点向你说明 Docker 到底是个什么东西。
-- **Docker 是世界领先的软件容器平台。**
-- **Docker** 使用 Google 公司推出的 **Go 语言** 进行开发实现,基于 **Linux 内核** 的cgroup,namespace,以及AUFS类的**UnionFS**等技术,**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进
-程,因此也称其为容器。**Docke最初实现是基于 LXC.**
+- **Docker 是世界领先的软件容器平台。**
+- **Docker** 使用 Google 公司推出的 **Go 语言** 进行开发实现,基于 **Linux 内核** 提供的 CGroup 功能和 name space 来实现的,以及 AUFS 类的 **UnionFS** 等技术,**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
- **Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。**
- **用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。**
@@ -60,7 +62,7 @@
### 2.2 Docker 思想
- **集装箱**
-- **标准化:** ①运输方式 ② 存储方式 ③ API接口
+- **标准化:** ① 运输方式 ② 存储方式 ③ API 接口
- **隔离**
### 2.3 Docker 容器的特点
@@ -68,9 +70,11 @@
- #### 轻量
在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
+
- #### 标准
Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
+
- #### 安全
Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
@@ -86,15 +90,15 @@
---
-**每当说起容器,我们不得不将其与虚拟机做一个比较。就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。**
-
## 三 容器 VS 虚拟机
- 简单来说: **容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。**
+**每当说起容器,我们不得不将其与虚拟机做一个比较。就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。**
+
+简单来说: **容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。**
### 3.1 两者对比图
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便.
+传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便.

@@ -104,9 +108,9 @@
- **容器是一个应用层抽象,用于将代码和依赖资源打包在一起。** **多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行** 。与虚拟机相比, **容器占用的空间较少**(容器镜像大小通常只有几十兆),**瞬间就能完成启动** 。
-- **虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。** 管理程序允许多个 VM 在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 **占用大量空间** 。而且 VM **启动也十分缓慢** 。
+- **虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。** 管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 **占用大量空间** 。而且 VM **启动也十分缓慢** 。
- 通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。**虚拟机更擅长于彻底隔离整个运行环境**。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 **Docker通常用于隔离不同的应用** ,例如前端,后端以及数据库。
+通过 Docker 官网,我们知道了这么多 Docker 的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。**虚拟机更擅长于彻底隔离整个运行环境**。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 **Docker 通常用于隔离不同的应用** ,例如前端,后端以及数据库。
### 3.3 容器与虚拟机两者是可以共存的
@@ -116,9 +120,9 @@
---
-## 四 Docker基本概念
+## 四 Docker 基本概念
-**Docker中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。**
+**Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。**
- **镜像(Image)**
- **容器(Container)**
@@ -130,49 +134,121 @@
### 4.1 镜像(Image):一个特殊的文件系统
- **操作系统分为内核和用户空间**。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker 镜像(Image),就相当于是一个 root 文件系统。
+**操作系统分为内核和用户空间**。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
- **Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。** 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
+**Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。** 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- Docker 设计时,就充分利用 **Union FS**的技术,将其设计为 **分层存储的架构** 。 镜像实际是由多层文件系统联合组成。
+Docker 设计时,就充分利用 **Union FS**的技术,将其设计为 **分层存储的架构** 。 镜像实际是由多层文件系统联合组成。
- **镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。** 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
+**镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。** 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
- 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
+分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
### 4.2 容器(Container):镜像运行时的实体
- 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,**容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等** 。
-
- **容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。**
+镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,**容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等** 。
- **容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。**
+**容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。**
- 按照 Docker 最佳实践的要求,**容器不应该向其存储层内写入任何数据** ,容器存储层要保持无状态化。**所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录**,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, **使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。**
+**容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。**
+按照 Docker 最佳实践的要求,**容器不应该向其存储层内写入任何数据** ,容器存储层要保持无状态化。**所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录**,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, **使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。**
### 4.3 仓库(Repository):集中存放镜像文件的地方
- 镜像构建完成后,可以很容易的在当前宿主上运行,但是, **如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。**
+镜像构建完成后,可以很容易的在当前宿主上运行,但是, **如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。**
- 一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:**镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。**
+一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:**镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。**
- 通常,**一个仓库会包含同一个软件不同版本的镜像**,而**标签就常用于对应该软件的各个版本** 。我们可以通过```<仓库名>:<标签>```的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
+通常,**一个仓库会包含同一个软件不同版本的镜像**,而**标签就常用于对应该软件的各个版本** 。我们可以通过`<仓库名>:<标签>`的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
-**这里补充一下Docker Registry 公开服务和私有 Docker Registry的概念:**
+**这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:**
- **Docker Registry 公开服务** 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
+**Docker Registry 公开服务** 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
- 最常使用的 Registry 公开服务是官方的 **Docker Hub** ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:[https://hub.docker.com/](https://hub.docker.com/) 。在国内访问**Docker Hub** 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://www.163yun.com/product/repo)、[DaoCloud 镜像市场](https://www.daocloud.io/)、[阿里云镜像库](https://www.aliyun.com/product/containerservice?utm_content=se_1292836)等。
+最常使用的 Registry 公开服务是官方的 **Docker Hub** ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:[https://hub.docker.com/](https://hub.docker.com/ "https://hub.docker.com/") 。官方是这样介绍 Docker Hub 的:
- 除了使用公开服务外,用户还可以在 **本地搭建私有 Docker Registry** 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
+> Docker Hub 是 Docker 官方提供的一项服务,用于与您的团队查找和共享容器镜像。
+
+比如我们想要搜索自己想要的镜像:
+
+
+
+在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:
+
+- **OFFICIAL Image** :代表镜像为 Docker 官方提供和维护,相对来说稳定性和安全性较高。
+- **Stars** :和点赞差不多的意思,类似 GitHub 的 Star。
+- **Dowloads** :代表镜像被拉取的次数,基本上能够表示镜像被使用的频度。
+
+当然,除了直接通过 Docker Hub 网站搜索镜像这种方式外,我们还可以通过 `docker search` 这个命令搜索 Docker Hub 中的镜像,搜索的结果是一致的。
+
+```bash
+➜ ~ docker search mysql
+NAME DESCRIPTION STARS OFFICIAL AUTOMATED
+mysql MySQL is a widely used, open-source relation… 8763 [OK]
+mariadb MariaDB is a community-developed fork of MyS… 3073 [OK]
+mysql/mysql-server Optimized MySQL Server Docker images. Create… 650 [OK]
+```
+
+在国内访问**Docker Hub** 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像库](https://hub.tenxcloud.com/ "时速云镜像库")、[网易云镜像服务](https://www.163yun.com/product/repo "网易云镜像服务")、[DaoCloud 镜像市场](https://www.daocloud.io/ "DaoCloud 镜像市场")、[阿里云镜像库](https://www.aliyun.com/product/containerservice?utm_content=se_1292836 "阿里云镜像库")等。
+
+除了使用公开服务外,用户还可以在 **本地搭建私有 Docker Registry** 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
---
-**Docker的概念基本上已经讲完,最后我们谈谈:Build, Ship, and Run。**
+## 五 常见命令
+
+### 5.1 基本命令
+
+```bash
+docker version # 查看docker版本
+docker images # 查看所有已下载镜像,等价于:docker image ls 命令
+docker container ls # 查看所有容器
+docker ps #查看正在运行的容器
+docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;
+```
-## 五 最后谈谈:Build Ship and Run
-如果你搜索Docker官网,会发现如下的字样:**“Docker - Build, Ship, and Run Any App, Anywhere”**。那么Build, Ship, and Run到底是在干什么呢?
+### 5.2 拉取镜像
+
+```bash
+docker search mysql # 查看mysql相关镜像
+docker pull mysql:5.7 # 拉取mysql镜像
+docker image ls # 查看所有已下载镜像
+```
+
+### 5.3 删除镜像
+
+比如我们要删除我们下载的 mysql 镜像。
+
+通过 `docker rmi [image]` (等价于`docker image rm [image]`)删除镜像之前首先要确保这个镜像没有被容器引用(可以通过标签名称或者镜像 ID删除)。通过我们前面讲的` docker ps`命令即可查看。
+
+```shell
+➜ ~ docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+c4cd691d9f80 mysql:5.7 "docker-entrypoint.s…" 7 weeks ago Up 12 days 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
+```
+
+可以看到 mysql 正在被 id 为 c4cd691d9f80 的容器引用,我们需要首先通过 `docker stop c4cd691d9f80` 或者 `docker stop mysql`暂停这个容器。
+
+然后查看 mysql 镜像的 id
+
+```shell
+➜ ~ docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+mysql 5.7 f6509bac4980 3 months ago 373MB
+```
+
+通过 IMAGE ID 或者 REPOSITORY 名字即可删除
+
+```shell
+docker rmi f6509bac4980 # 或者 docker rmim mysql
+```
+
+## 六 Build Ship and Run
+
+**Docker 的概念以及常见命令基本上已经讲完,我们再来谈谈:Build, Ship, and Run。**
+
+如果你搜索 Docker 官网,会发现如下的字样:**“Docker - Build, Ship, and Run Any App, Anywhere”**。那么 Build, Ship, and Run 到底是在干什么呢?

@@ -180,42 +256,51 @@
- **Ship(运输镜像)** :主机和仓库间运输,这里的仓库就像是超级码头一样。
- **Run (运行镜像)** :运行的镜像就是一个容器,容器就是运行程序的地方。
-**Docker 运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将Docker称为码头工人或码头装卸工,这和Docker的中文翻译搬运工人如出一辙。**
+**Docker 运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将 Docker 称为码头工人或码头装卸工,这和 Docker 的中文翻译搬运工人如出一辙。**
+
+## 七 简单了解一下 Docker 底层原理
+
+### 7.1 虚拟化技术
-### 七 简单了解一下Docker底层原理
+首先,Docker **容器虚拟化**技术为基础的软件,那么什么是虚拟化技术呢?
-Docker 技术是基于 LXC(Linux container- Linux容器)虚拟容器技术的。
+简单点来说,虚拟化技术可以这样定义:
-> LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
+> 虚拟化技术是一种资源管理技术,是将计算机的各种[实体资源](https://zh.wikipedia.org/wiki/資源_(計算機科學 "实体资源"))([CPU](https://zh.wikipedia.org/wiki/CPU "CPU")、[内存](https://zh.wikipedia.org/wiki/内存 "内存")、[磁盘空间](https://zh.wikipedia.org/wiki/磁盘空间 "磁盘空间")、[网络适配器](https://zh.wikipedia.org/wiki/網路適配器 "网络适配器")等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
-LXC 技术主要是借助Linux内核中提供的CGroup功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
+###7.2 Docker 基于 LXC 虚拟容器技术
+
+Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。
+
+> LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
+
+LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
**cgroup 和 namespace 介绍:**
- **namespace 是 Linux 内核用来隔离内核资源的方式。** 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
- (以上关于 namespace 介绍内容来自https://www.cnblogs.com/sparkdev/p/9365405.html ,更多关于namespace 的呢内容可以查看这篇文章 )。
+ (以上关于 namespace 介绍内容来自https://www.cnblogs.com/sparkdev/p/9365405.html ,更多关于 namespace 的呢内容可以查看这篇文章 )。
- **CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。**
- (以上关于 CGroup 介绍内容来自 https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html ,更多关于CGroup 的呢内容可以查看这篇文章 )。
+ (以上关于 CGroup 介绍内容来自 https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html ,更多关于 CGroup 的呢内容可以查看这篇文章 )。
**cgroup 和 namespace 两者对比:**
-两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace是为了隔离进程组之间的资源,而cgroup是为了对一组进程进行统一的资源监控和限制。
+两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
## 八 总结
-本文主要把Docker中的一些常见概念做了详细的阐述,但是并不涉及Docker的安装、镜像的使用、容器的操作等内容。这部分东西,希望读者自己可以通过阅读书籍与官方文档的形式掌握。如果觉得官方文档阅读起来很费力的话,这里推荐一本书籍《Docker技术入门与实战第二版》。
+本文主要把 Docker 中的一些常见概念做了详细的阐述,但是并不涉及 Docker 的安装、镜像的使用、容器的操作等内容。这部分东西,希望读者自己可以通过阅读书籍与官方文档的形式掌握。如果觉得官方文档阅读起来很费力的话,这里推荐一本书籍《Docker 技术入门与实战第二版》。
## 九 推荐阅读
-- [10分钟看懂Docker和K8S](https://zhuanlan.zhihu.com/p/53260098)
-- [从零开始入门 K8s:详解 K8s 容器基本概念](https://www.infoq.cn/article/te70FlSyxhltL1Cr7gzM)
+- [10 分钟看懂 Docker 和 K8S](https://zhuanlan.zhihu.com/p/53260098 "10分钟看懂Docker和K8S")
+- [从零开始入门 K8s:详解 K8s 容器基本概念](https://www.infoq.cn/article/te70FlSyxhltL1Cr7gzM "从零开始入门 K8s:详解 K8s 容器基本概念")
## 十 参考
-- [Linux Namespace和Cgroup](https://segmentfault.com/a/1190000009732550)
-- [LXC vs Docker: Why Docker is Better](https://www.upguard.com/articles/docker-vs-lxc)
-- [CGroup 介绍、应用实例及原理描述](https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html)
-
+- [Linux Namespace 和 Cgroup](https://segmentfault.com/a/1190000009732550 "Linux Namespace和Cgroup")
+- [LXC vs Docker: Why Docker is Better](https://www.upguard.com/articles/docker-vs-lxc "LXC vs Docker: Why Docker is Better")
+- [CGroup 介绍、应用实例及原理描述](https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html "CGroup 介绍、应用实例及原理描述")