44
55软件开发中最为麻烦的事情可能就是配置环境了。由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且可能在不同的环境下我们的软件需要依赖的其他软件包也是不一样的。
66
7- 那么问题来了,我们再安装软件的时候可不可以把软件运行的环境一并安装?也就是说在安装软件的时候, 我们是不是可以把原始环境一模一样地复制过来呢?
7+ 那么问题来了,我们安装软件的时候可不可以把软件运行的环境一并安装? 我们是不是可以把原始环境一模一样地复制过来呢?
88
99虚拟机(virtual machine)就是带环境安装的一种解决方案,它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统,在macOS上运行Windows,而应用程序对此毫无感知。使用过虚拟机的人都知道,虚拟机用起来跟真实系统一模一样,而对于虚拟机的宿主系统来说,虚拟机就是一个普通文件,不需要了就删掉,对宿主系统或者其他的程序并没有影响。但是虚拟机通常会占用较多的系统资源,启动和关闭也非常的缓慢,总之用户体验没有想象中的那么好。
1010
11- Docker属于对Linux容器技术的一种封装,它提供了简单易用的容器使用接口,是目前最流行的 Linux 容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就再也不用担心环境问题了。
11+ Docker属于对Linux容器技术的一种封装(利用了Linux的namespace和cgroup技术) ,它提供了简单易用的容器使用接口,是目前最流行的 Linux 容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就再也不用担心环境问题了。
1212
1313![ ] ( ./res/docker_vs_vm.png )
1414
@@ -18,7 +18,7 @@ Docker属于对Linux容器技术的一种封装,它提供了简单易用的容
18182 . 提供弹性的云服务(利用Docker很容易实现扩容和收缩)。
19193 . 实践微服务架构(隔离真实环境在容器中运行多个服务)。
2020
21- ### CentOS下的安装和使用
21+ ### 安装Docker
2222
2323下面的讲解以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。
2424
@@ -48,7 +48,7 @@ docker info
4848docker run hello-world
4949```
5050
51- 也可以先用下面的命令下载镜像,然后再来运行。
51+ 也可以先用下面的命令下载镜像,然后再来运行。
5252
5353 ``` Shell
5454docker pull < name>
@@ -103,7 +103,7 @@ service docker start
103103
104104在有必要的情况下,可以更换Ubuntu软件下载源来提升下载速度,具体的做法请参照< https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ > 。
105105
106- 安装Docker后,由于直接访问dockerhub下载镜像会非常缓慢,建议更换国内镜像,可以通过修改` /etc/docker/daemon.js ` 文件来做到。
106+ 安装Docker后,由于直接访问dockerhub下载镜像会非常缓慢,建议更换国内镜像,可以通过修改` /etc/docker/daemon.js ` 文件来做到。如果使用云服务器(如:阿里云),通常云服务器提供商会提供默认的镜像服务器,并不需要手动进行指定。
107107
108108``` JavaScript
109109{
@@ -114,50 +114,101 @@ service docker start
114114}
115115```
116116
117- ### Docker实战
117+ ### 使用Docker
118118
119119#### 安装Nginx
120120
121- Docker的使用肯定不止上面这点东西,但是有了这些知识之后,我们已经可以开始感受Docker的强大之处。下面我们就基于Docker来搭建HTTP服务器(Nginx)环境 。
121+ 下面我们就基于Docker来运行一台HTTP服务器,我们选择用Nginx来搭建该服务,因为Nginx是高性能的Web服务器,同时也是做反向代理服务器的上佳选择。要做到这件事情,只需要下面这条命令在Docker中创建一个容器即可 。
122122
123123``` Shell
124124docker container run -d -p 80:80 --rm --name mynginx nginx
125125```
126126
127- > 说明:上面的参数` -d ` 表示容器在后台运行;` -p ` 是用来映射容器的端口到宿主机的端口;` --rm ` 表示容器停止后自动删除容器,例如通过` docker container stop mynginx ` 以后,容器就没有了;` -- name` 是自定义容器的名字 。
127+ > 说明:上面的参数` -d ` 表示容器在后台运行(不产生输出到Shell)并显示容器的ID ;` -p ` 是用来映射容器的端口到宿主机的端口;` --rm ` 表示容器停止后自动删除容器,例如通过` docker container stop mynginx ` 以后,容器就没有了;` — name` 后面的mynginx就是自定义容器的名字。在创建容器的过程中,需要用到nginx的镜像文件,镜像文件的下载是自动完成的,如果没有指定版本号,默认是最新版本(latest) 。
128128
129- 如果需要将自己的页面部署到Nginx上,可以使用容器的拷贝命令将当前文件夹下所有的文件和文件夹拷贝到容器的指定目录中。当然也可以从容器中拷贝文件到我们指定的路径下 。
129+ 如果需要将自己的Web项目(页面)部署到Nginx上,可以使用容器拷贝命令将指定路径下所有的文件和文件夹拷贝到容器的指定目录中 。
130130
131131``` Shell
132- docker container cp ./ index.html mynginx:/usr/local /nginx/html
132+ docker container cp /root/web/ index.html mynginx:/usr/share /nginx/html
133133```
134134
135- 如果不愿意拷贝文件也可以将文件夹映射到Nginx保存页面文件的目录 。
135+ 如果不愿意拷贝文件也可以在创建容器时通过数据卷操作 ` --volume ` 将指定的文件夹映射到容器的某个目录中,例如将Web项目的文件夹直接映射到 ` /usr/share/nginx/html ` 目录 。
136136
137137``` Shell
138- docker container run -d -p 80:80 --rm --name mynginx --volume " $PWD /html" :/usr/share/nginx/html nginx
138+ docker container run -d -p 80:80 --rm --name mynginx --volume $PWD /html:/usr/share/nginx/html nginx
139+ ```
140+
141+ > 说明:上面创建容器和拷贝文件的命令中,` container ` 是可以省略的,也就是说` docker container run ` 和` docker run ` 是一样的,而` docker container cp ` 和` docker cp ` 是一样的。此外,命令中的` --volume ` 也可以缩写为` -v ` ,就如同` -d ` 是` --detach ` 的缩写,` -p ` 是` --publish ` 的缩写。` $PWD ` 代表宿主系统当前文件夹,这个用过Linux系统的人相信很容易理解。
142+
143+ 要查看运行中的容器,可以使用下面的命令。
144+
145+ ``` Shell
146+ docker ps
147+ ```
148+
149+ 要让刚才创建的容器停下来,可以使用下面的命令。
150+
151+ ``` Shell
152+ docker stop mynginx
153+ ```
154+
155+ 由于在创建容器时使用了` --rm ` 选项,容器在停止时会被移除,当我们使用下面的命令查看所有容器时,应该已经看不到刚才的` mynginx ` 容器了。
156+
157+ ``` Shell
158+ docker container ls -a
159+ ```
160+
161+ 如果在创建容器时没有指定` --rm ` 选项,那么也可以使用下面的命令来删除容器。
162+
163+ ``` Shell
164+ docker rm mynginx
139165```
140166
141167#### 安装MySQL
142168
143- 下载MySQL镜像 。
169+ 我们可以先检查一下服务器上有没有MySQL的镜像文件 。
144170
145171``` Shell
146172docker search mysql
173+ ```
174+
175+ 下载MySQL镜像并指定镜像的版本号。
176+
177+ ``` Shell
147178docker pull mysql:5.7
179+ ```
180+
181+ 如果需要查看已经下载的镜像文件,可以使用下面的命令。
182+
183+ ``` Shell
148184docker images
149185```
150186
151- 启动容器运行MySQL 。
187+ 创建并运行MySQL容器 。
152188
153189``` Shell
154- docker run -- name mysql-docker -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
190+ 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
155191```
156192
157- 在使用MySQL 8.x时可能会遇到“error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded”的问题,这是因为MySQL 8.x默认使用了名为“caching_sha2_password”的机制对用户口令进行了更好的保护,但是如果客户端没有更新有可能无法基于这种方式进行身份验证,可以按照下面的方式加以解决。
193+ 注意,上面创建容器时我们又一次使用了数据卷操作,那是因为通常容器是随时创建随时删除的,而数据库中的数据却是需要保留下来的,所以上面的两个数据卷操作一个是映射了MySQL配置文件所在的文件夹,一个是映射了MySQL数据所在的文件夹,这里的数据卷操作非常重要。我们可以将MySQL的配置文件放在` $PWD/mysql/conf ` 目录下,配置文件的具体内容如下所示:
194+
195+ ``` INI
196+ [mysqld]
197+ pid-file =/var/run/mysqld/mysqld.pid
198+ socket =/var/run/mysqld/mysqld.sock
199+ datadir =/var/lib/mysql
200+ log-error =/var/log/mysql/error.log
201+ server-id =1
202+ log-bin =/var/log/mysql/mysql-bin.log
203+ expire_logs_days =30
204+ max_binlog_size =256M
205+ symbolic-links =0
206+ ```
207+
208+ 如果安装了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 ` 。
158209
159210``` Shell
160- docker exec -it mysql8-docker /bin/bash
211+ docker exec -it mysql8x /bin/bash
161212```
162213
163214进入容器的交互式Shell之后,可以首先利用MySQL的客户端工具连接MySQL服务器。
@@ -195,4 +246,5 @@ select user, host, plugin, authentication_string from user where user='root';
1952462 rows in set (0 .00 sec)
196247```
197248
198- 接下来就已经可以访问你的MySQL服务器啦,当然远程连接的时候不要忘了在防火墙上开启对应的端口。
249+ 在完成上面的步骤后,现在即便不更新客户端工具也可以连接MySQL 8.x了。
250+
0 commit comments