diff --git "a/Day91-100/Docker\347\256\200\346\230\223\344\270\212\346\211\213\346\214\207\345\215\227.md" "b/Day91-100/Docker\347\256\200\346\230\223\344\270\212\346\211\213\346\214\207\345\215\227.md" index 69bcf2c0509f8d95a4bccb64699db23ef5195b02..4d4de425938268aa54e3ad5c56a07f21aaa556d5 100644 --- "a/Day91-100/Docker\347\256\200\346\230\223\344\270\212\346\211\213\346\214\207\345\215\227.md" +++ "b/Day91-100/Docker\347\256\200\346\230\223\344\270\212\346\211\213\346\214\207\345\215\227.md" @@ -4,11 +4,11 @@ 软件开发中最为麻烦的事情可能就是配置环境了。由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且可能在不同的环境下我们的软件需要依赖的其他软件包也是不一样的。 -那么问题来了,我们再安装软件的时候可不可以把软件运行的环境一并安装?也就是说在安装软件的时候,我们是不是可以把原始环境一模一样地复制过来呢? +那么问题来了,我们安装软件的时候可不可以把软件运行的环境一并安装?我们是不是可以把原始环境一模一样地复制过来呢? 虚拟机(virtual machine)就是带环境安装的一种解决方案,它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统,在macOS上运行Windows,而应用程序对此毫无感知。使用过虚拟机的人都知道,虚拟机用起来跟真实系统一模一样,而对于虚拟机的宿主系统来说,虚拟机就是一个普通文件,不需要了就删掉,对宿主系统或者其他的程序并没有影响。但是虚拟机通常会占用较多的系统资源,启动和关闭也非常的缓慢,总之用户体验没有想象中的那么好。 -Docker属于对Linux容器技术的一种封装,它提供了简单易用的容器使用接口,是目前最流行的 Linux 容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就再也不用担心环境问题了。 +Docker属于对Linux容器技术的一种封装(利用了Linux的namespace和cgroup技术),它提供了简单易用的容器使用接口,是目前最流行的 Linux 容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就再也不用担心环境问题了。 ![](./res/docker_vs_vm.png) @@ -18,7 +18,7 @@ Docker属于对Linux容器技术的一种封装,它提供了简单易用的容 2. 提供弹性的云服务(利用Docker很容易实现扩容和收缩)。 3. 实践微服务架构(隔离真实环境在容器中运行多个服务)。 -### CentOS下的安装和使用 +### 安装Docker 下面的讲解以CentOS为例,使用[Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)、[macOS](https://docs.docker.com/docker-for-mac/install/)或[Windows](https://docs.docker.com/docker-for-windows/install/)的用户可以通过点击链接了解这些平台下如何安装和使用Docker。 @@ -48,7 +48,7 @@ docker info docker run hello-world ``` - 也可以先用下面的命令下载镜像,然后再来运行。 +也可以先用下面的命令下载镜像,然后再来运行。 ```Shell docker pull @@ -103,7 +103,7 @@ service docker start 在有必要的情况下,可以更换Ubuntu软件下载源来提升下载速度,具体的做法请参照。 -安装Docker后,由于直接访问dockerhub下载镜像会非常缓慢,建议更换国内镜像,可以通过修改`/etc/docker/daemon.js`文件来做到。 +安装Docker后,由于直接访问dockerhub下载镜像会非常缓慢,建议更换国内镜像,可以通过修改`/etc/docker/daemon.js`文件来做到。如果使用云服务器(如:阿里云),通常云服务器提供商会提供默认的镜像服务器,并不需要手动进行指定。 ```JavaScript { @@ -114,50 +114,101 @@ service docker start } ``` -### Docker实战 +### 使用Docker #### 安装Nginx -Docker的使用肯定不止上面这点东西,但是有了这些知识之后,我们已经可以开始感受Docker的强大之处。下面我们就基于Docker来搭建HTTP服务器(Nginx)环境。 +下面我们就基于Docker来运行一台HTTP服务器,我们选择用Nginx来搭建该服务,因为Nginx是高性能的Web服务器,同时也是做反向代理服务器的上佳选择。要做到这件事情,只需要下面这条命令在Docker中创建一个容器即可。 ```Shell docker container run -d -p 80:80 --rm --name mynginx nginx ``` -> 说明:上面的参数`-d`表示容器在后台运行;`-p`是用来映射容器的端口到宿主机的端口;`--rm`表示容器停止后自动删除容器,例如通过`docker container stop mynginx`以后,容器就没有了;`--name`是自定义容器的名字。 +> 说明:上面的参数`-d`表示容器在后台运行(不产生输出到Shell)并显示容器的ID;`-p`是用来映射容器的端口到宿主机的端口;`--rm`表示容器停止后自动删除容器,例如通过`docker container stop mynginx`以后,容器就没有了;`—name`后面的mynginx就是自定义容器的名字。在创建容器的过程中,需要用到nginx的镜像文件,镜像文件的下载是自动完成的,如果没有指定版本号,默认是最新版本(latest)。 -如果需要将自己的页面部署到Nginx上,可以使用容器的拷贝命令将当前文件夹下所有的文件和文件夹拷贝到容器的指定目录中。当然也可以从容器中拷贝文件到我们指定的路径下。 +如果需要将自己的Web项目(页面)部署到Nginx上,可以使用容器拷贝命令将指定路径下所有的文件和文件夹拷贝到容器的指定目录中。 ```Shell -docker container cp ./index.html mynginx:/usr/local/nginx/html +docker container cp /root/web/index.html mynginx:/usr/share/nginx/html ``` -如果不愿意拷贝文件也可以将文件夹映射到Nginx保存页面文件的目录。 +如果不愿意拷贝文件也可以在创建容器时通过数据卷操作`--volume`将指定的文件夹映射到容器的某个目录中,例如将Web项目的文件夹直接映射到`/usr/share/nginx/html`目录。 ```Shell -docker container run -d -p 80:80 --rm --name mynginx --volume "$PWD/html":/usr/share/nginx/html nginx +docker container run -d -p 80:80 --rm --name mynginx --volume $PWD/html:/usr/share/nginx/html nginx +``` + +> 说明:上面创建容器和拷贝文件的命令中,`container`是可以省略的,也就是说`docker container run`和`docker run`是一样的,而`docker container cp`和`docker cp`是一样的。此外,命令中的`--volume`也可以缩写为`-v`,就如同`-d`是`--detach`的缩写,`-p`是`--publish`的缩写。`$PWD`代表宿主系统当前文件夹,这个用过Linux系统的人相信很容易理解。 + +要查看运行中的容器,可以使用下面的命令。 + +```Shell +docker ps +``` + +要让刚才创建的容器停下来,可以使用下面的命令。 + +```Shell +docker stop mynginx +``` + +由于在创建容器时使用了`--rm`选项,容器在停止时会被移除,当我们使用下面的命令查看所有容器时,应该已经看不到刚才的`mynginx`容器了。 + +```Shell +docker container ls -a +``` + +如果在创建容器时没有指定`--rm`选项,那么也可以使用下面的命令来删除容器。 + +```Shell +docker rm mynginx ``` #### 安装MySQL -下载MySQL镜像。 +我们可以先检查一下服务器上有没有MySQL的镜像文件。 ```Shell docker search mysql +``` + +下载MySQL镜像并指定镜像的版本号。 + +```Shell docker pull mysql:5.7 +``` + +如果需要查看已经下载的镜像文件,可以使用下面的命令。 + +```Shell docker images ``` -启动容器运行MySQL。 +创建并运行MySQL容器。 ```Shell -docker run --name mysql-docker -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 +docker run -d -p 3306:3306 --name mysql57 -v $PWD/mysql/conf:/etc/mysql/mysql.cnf.d -v $PWD/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 ``` -在使用MySQL 8.x时可能会遇到“error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded”的问题,这是因为MySQL 8.x默认使用了名为“caching_sha2_password”的机制对用户口令进行了更好的保护,但是如果客户端没有更新有可能无法基于这种方式进行身份验证,可以按照下面的方式加以解决。 +注意,上面创建容器时我们又一次使用了数据卷操作,那是因为通常容器是随时创建随时删除的,而数据库中的数据却是需要保留下来的,所以上面的两个数据卷操作一个是映射了MySQL配置文件所在的文件夹,一个是映射了MySQL数据所在的文件夹,这里的数据卷操作非常重要。我们可以将MySQL的配置文件放在`$PWD/mysql/conf`目录下,配置文件的具体内容如下所示: + +```INI +[mysqld] +pid-file=/var/run/mysqld/mysqld.pid +socket=/var/run/mysqld/mysqld.sock +datadir=/var/lib/mysql +log-error=/var/log/mysql/error.log +server-id=1 +log-bin=/var/log/mysql/mysql-bin.log +expire_logs_days=30 +max_binlog_size=256M +symbolic-links=0 +``` + +如果安装了MySQL 8.x版本(目前的最新版本),在使用客户端工具连接服务器时可能会遇到“error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded”的问题,这是因为MySQL 8.x默认使用了名为“caching_sha2_password”的机制对用户口令进行了更好的保护,但是如果客户端工具不支持新的认证方式,连接就会失败。解决这个问题有两种方式:一是升级客户端工具来支持MySQL 8.x的认证方式;二是进入容器,修改MySQL的用户口令认证方式。下面是具体的步骤,我们先用`docker exec`命令进入容器的交互式环境,假设运行MySQL 8.x的容器名字叫`mysql8x`。 ```Shell -docker exec -it mysql8-docker /bin/bash +docker exec -it mysql8x /bin/bash ``` 进入容器的交互式Shell之后,可以首先利用MySQL的客户端工具连接MySQL服务器。 @@ -195,4 +246,5 @@ select user, host, plugin, authentication_string from user where user='root'; 2 rows in set (0.00 sec) ``` -接下来就已经可以访问你的MySQL服务器啦,当然远程连接的时候不要忘了在防火墙上开启对应的端口。 \ No newline at end of file +在完成上面的步骤后,现在即便不更新客户端工具也可以连接MySQL 8.x了。 + diff --git a/README.md b/README.md index 211520b605b487131a63ada1e650188f61873311..14dad7a9b4512893d96380625637e3060439f3db 100644 --- a/README.md +++ b/README.md @@ -496,6 +496,19 @@ 1. 数据库性能调优 - 软硬件优化 - SQL优化 + - 通过show status了解SQL的执行频率。 + - 通过慢查询日志或show processlist定位低效率SQL。 + - 通过EXPLAIN分析低效率SQL的执行计划。 + - 通过show profile分析SQL。 + - 合理的使用索引。 + - 定期检查和优化表。 + - 优化insert操作。 + - 优化排序操作。 + - 优化分组操作。 + - 优化OR条件操作。 + - 优化分页操作。 - 架构优化 + - 主从复制,读写分离 + - 集群架构 2. 代码性能调优 3. 云存储和CDN加速