<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div>

<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div><dl id="b56cf"><menu id="b56cf"><small id="b56cf"></small></menu></dl>

<sup id="b56cf"></sup>

理解Nginx的server匹配规则

2019年6月27日 没有评论

Nginx的块配置

Nginx在逻辑上将提供不同内容的配置划分为块,这些块以层次结构的形式存在(http->server->location)。客户端发出请求时,Nginx收到之后,会有一个确定应该使用哪些配置块来处理请求的过程。本文主要介绍 server 块背后的处理过程。

server块是Nginx配置的子集,它定义用于处理已定义类型请求的虚拟服务器(虚拟机)。管理员通常会配置多个server块,并根据请求的域名,端口和IP地址决定哪个块应该处理哪个连接。

Nginx如何决定哪个server块来处理请求

由于Nginx允许管理员定义多个server块作为单独的虚拟Web服务器实例,因此需要一个算法来确定将使用哪些server块来匹配请求。

Nginx在此过程中关注的主要server块指令是listen指令和server_name指令。

解析“listen”指令以找到可能的匹配

首先,Nginx查看请求的IP地址和端口,并与每个服务器的 listen 指令相匹配,构建可能解析请求的服务器块列表。

listen指令通常定义 server 块将响应的IP地址和端口。默认情况下,任何不包含listen指令的 server 块默认 listen 在0.0.0.0:80(或者0.0.0.0:8080如果Nginx由普通的非root?#27809;?#36816;行),这样的配置块响应80端口上任何接口的请求,但是这个默认值在server选择过程中没有太大的权重。

listen指令可以设置为:

  • IP地址/端口组合。
  • 只有IP地址,它将监听默认端口80。
  • 只有端口,它将监听该端口上的每个接口。
  • Unix套接字的路径。

最后的选项通常在不同的服务器之间传递请求时起到作用。

在尝试确定向哪个服务器块发送请求时,Nginx将首先尝试listen使用以下规则根据指令的特异性来决定:

  • Nginx用默认的缺省值来替换所有不完整的lesten指令(完整:IP+port的组合)的缺省值,因此每一个server块的listen指令都可以看作是IP地址和端口的组合。 这种转换的例子有:
    • 没有listen指令的块使用该值0.0.0.0:80
    • 设置为111.111.111.111没有端口的IP地址的块变为111.111.111.111:80
    • 设置为8888没有IP地址的端口的块变为0.0.0.0:8888
  • 接下来Nginx会尝试去收集一个server块的列表,这个列表是基于具体的IP和端口最佳匹配。也就是?#31561;?#26524;匹配的server块有具体的IP地址,它就不会匹配用0.0.0.0作为默认的IP地址的server块。无论什么情况,在Nginx选择server块的过程中,端口必须准确匹配。
  • 如果只有一个最具体的匹配,那么该server块将用于提供请求。如果有多个server 块具有相同层次的具体匹配,那么Nginx需继续评估server_name指令 。

需要特别注意的是,只有 listen 指令在同一层次上有多个匹配的 server 块时,Nginx才会继续评估server_name指令。举个例子,如果域名example.com被解析到IP为192.168.1.10,端口为80的主机上,当客户端请求example.com时,在本例中,第一个server模块总是会提供服务,尽管server_name指令在第二个server模块中。

1
2
3
4
server{
listen 192.168.1.10;
....
}
1
2
3
4
5
server{
listen 80;
server_name example.com;
....
}

多个server模块在具体的匹配中处于同一级别的情况下,Nginx下一步才会检查server_name指令。

解析server_name指令选择一个匹配

接下来,为了进一步评估具有相同特定listen指令的请求,Nginx会检查请求的“host”标头,此值包含客户端实际尝试访问的域或IP地址。

Nginx在候选的每一个server模块中,查看其server_name指令,尝试去找到最佳的匹配。Nginx通过下面的公式来进行评估:

  • Nginx首?#26085;?#21040;server_name与请求的Host头信息精准匹配的server模块,如果找到了这个server模块,它将会被用于服务客户端的请求。若有多个特定的匹配项被找到,第一个会被用于提供服务。
  • 如果没有找到精准的匹配项,Nginx接下来将尝试去找server_name与前置通配符(在配置中名称的开头用*表示)匹配的server模块。只要找到一个,这个server模块将被用于为客户端提供服务。如果找到了多个匹配,最长匹配结果的server模块将会被用于提供服务。
  • 如果使用前置通配符没有找到匹配时,Nginx接下来将尝试去找server_name与后置通配符(在配置中名称的结尾用*表示)匹配的server模块。只要找到一个,这个server模块将被用于为客户端提供服务。如果找到了多个匹配,最长匹配结果的server模块将会被用于提供服务。
  • 如果使用后置通配符没有找到匹配时,Nginx接下来将会评估用正则表达式(在名称前用~表示)定义server_name的server模块。带有与Host头匹配的正则表达式的第一个server_name将被用于提供服务。
  • 如果没有找?#25509;?#27491;则表达式定义server_name的相匹配的server模块时,Nginx接下来会使用默认IP和端口的server模块。

每一个IP地址/端口组合都有一个默认的server模块,当用上面的方法不能确定一个操作的过程时将使用默认的server模块。对于IP地址/端口的组合来说,这将是配置中的第一个模块或者是包含default_server选项作为listen指令的一部分的server模块(这将复写first-found算法)。每一个IP地址/端口组合只能有一个default_server声明。

实例

如果已定义的server_name与Host头的值精准匹配时,这个server模块将被选择来处理请求。

在这个例子中,如果请求的Host头的值被设置为 host1.example.com,第二个server模块将被选中:

1
2
3
4
5
server{
listen 80;
server_name *.example.com;
...
}
1
2
3
4
5
server{
listen 80;
server_name host1.example.com;
...
}

如果精准的匹配没有被找到时,Nginx将会检查是否有一个具有适合前置通配符的server_name。以通配符开始的最长的server_name的server模块将会被选择来完?#19978;?#24212;。

在这个例子中,如果请求的Host头是 www.example.org,第二个server模块将被选中:

1
2
3
4
5
server{
listen 80;
server_name www.example.*;
...
}
1
2
3
4
5
server{
listen 80;
server_name *.example.org;
...
}
1
2
3
4
server{
listen 80;
server_name *.org;
}

server_name以通配符开始的模块没有找到,Nginx将查看在表达式后面有通配符的匹配项是否存在。此时,以通配符结尾的最长的匹配项将被用于服务客户端的请求。

在这个例子中,如果请求的Host头被设置为 www.example.com,第三个模块将被选中:

1
2
3
4
5
server{
listen 80;
server_name host1.example.com;
...
}
1
2
3
4
server{
listen 80;
server_name example.com;
}
1
2
3
4
server{
listen 80;
server_name www.example.*;
}

如果通配符匹配项没有找到,Nginx将会去匹配用了正则表达式的server_name。第一个匹配上的server模块将会被选中来响应请求。

在这个例子中,如果请求的Host头设置为 www.example.com,那么第二个server模块将被选中来完?#19978;?#24212;。

1
2
3
4
5
server{
listen 80;
server_name example.com;
...
}
1
2
3
4
5
server{
listen 80;
server_name ~^(www|host1).*\.example\.com$;
...
}
1
2
3
4
5
server{
listen 80;
server_name ~^(subdomain|set|www|host1).*\.example\.com$;
...
}

如果上述步骤都不能满足请求,则该请求将被传递到默认的server模块以获取匹配的IP地址和端口。

分类: nginx 标签:

如何使用nginx配置负载均衡

2019年6月14日 没有评论

负载均衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx是一种流行的Web服务器软件,可以配置为简单但功能?#30475;?#30340;负载均衡器,以提高服务器?#35797;?#30340;可用性和效?#30465;?#22312;负载平衡配置中,nginx充当在多个单独服务器上工作的分布式Web应用程序的单个入口点。

在Web场上进行负载平衡

本文介绍如何使用nginx为云服务器配置负载均衡。作为先决条件,您需要至少安装?#25945;?#20027;机并安装Web服务器软件,?#21592;?#20102;解负载均衡器的优势。

安装nginx

目前,最新版本的CentOS,Debian和Ubuntu都提供nginx软件包,可以使用命令快速安装nginx。

#Debian和Ubuntu 
sudo apt-get update
#然后安装Nginx开源版
sudo apt-get install nginx
#CentOS 
#安装额外的软件包存储库
sudo yum install epel-release
#更新存储库并安装Nginx
sudo yum update
sudo yum install nginx

安装完成后,进入nginx主配置文件夹。

cd /etc/nginx/

根据您的操作系统不同,Web服务器配置文件将位于两个位置之一。

Ubuntu和Debian遵循在 /etc/nginx/sites-available/, 中存储虚拟主机文件的规则,这些规则 通过符号链接启用到 /etc/nginx/sites-enabled/。您可以使用以下命令启用任何新的虚拟主机文件。

sudo ln -s /etc/nginx/sites-available/vhost /etc/nginx/sites-enabled/vhost

CentOS?#27809;?#21487;以在/etc/nginx/conf.d/下找到其主机配置文件,加载了任何.conf类型的虚拟主机文件。

检查您是否可以找到至少默认配置,然后重新启动nginx。

sudo systemctl restart nginx

通过在Web浏览器中打开负载均衡器服务器的IP地址来测试服务器是否回复HTTP请求。当您看到nginx的默认欢迎页面时,安装成功。

Nginx默认欢迎页面。

如果您在加载页面时遇到问题,请检查防火墙是否阻止了您的连接。例如,在CentOS 7上,默认防火墙规则不允许HTTP流量,请使用以下命令启用它。

sudsudo firewall-cmd --add-service=http --permanent 
sudo firewall-cmd --reload

然后尝试重新加载浏览器。

将nginx配置为负载均衡器

安?#23433;?#27979;试nginx后,您可以开始配置它以实现负载平衡。从本质上讲,您需要做的就是设置nginx,其中包含要监听的连接类型以及重定向位置的说明。要实现此目的,请使用您?#19981;?#30340;任何文本编辑器创建新的配置文件,例如使用vi

sudo vi /etc/nginx/conf.d/load-balancer.conf

load-balancer.conf中,您需要定义以下两个段:上游服务器,请参阅下面的示例。

#定义要包含在负载均衡方案中的服务器。  
#最好使用服务器的私有IP以获得更好的性能和安全性。
http {
upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}

#该服务器接受到端口80的所有流量并将其传递给上游。
#请注意,上游名称和proxy_pass需要匹配。
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}

然后保存文件并退出编辑器。

接下来,您需要禁用先前在安装后测试的默认服务器配置。同样取决于您的操作系统,这部分略有不同。

在Debian和Ubuntu系统上,您需要从启用站点的文件夹中删除默认符号链接。

sudo rm /etc/nginx/sites-enabled/default

CentOS的主机不使用相同的链接,而是简单地将重命名default.confconf.d /目录下的东西,不是结束的.conf,例如:

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled

然后使用以下命令重新启动nginx。

sudo systemctl restart nginx

检查nginx是否成功启动。如果重新启动失败,请查看刚刚创建的  /etc/nginx/conf.d/load-balancer.conf,以确保没有错误类型或缺少分号。

在Web浏览器中输入负载均衡器的公共IP地址时,您现在应该被传递到其中一个后端服务器。

负载均衡方法

如果没有定义其他方法,默认情况下使用nginx进行负载均衡会使用循环算法,如上面的第一个示例所?#23613;?#20351;用循环方案,将根据您在load-balancer.conf  文件中设置的顺序轮流选择每个服务器。这平衡了短期操作的请求数量。

基于最少连接的负载平衡是另一种简单的方法。顾名思义,此方法将请求定向到当?#26412;?#26377;最少活动连接的服务器。对于请求有时可能需要更长时间才能完成的应用程序,它比循环法更有效。

要启用最少连接平衡方法,请将参数least_conn添加到上游  部分,如下例所?#23613;?/p>

upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}

虽然循环和最少连接平衡方案是公平的并且有其用途,但是它们不能提供会话持久性。如果您的Web应用程序要求?#27809;?#38543;后被定向到与之前连接相同的后端服务器,则应使用IP哈希方法。IP哈希使用访?#25910;逫P地址作为密钥来确定应选择哪个主机来为请求提供服务。这允许访?#25910;?#27599;次被定向到同一服务器,被授予服务器可用且访?#25910;?#30340;IP地址未被更改。

要使用此方法,请将ip_hash 添加到上游  段,如下面的示例所?#23613;?/p>

upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}

在不同主机之间的可用?#35797;?#19981;相等的服务器设置中,可能希望某些服务器优先于其他服务器。定义服务器权重允许您使用nginx进一步微调负载平衡。负载均衡器中权重最高的服务器最常选择。

upstream backend {
server 10.1.0.101 weight=4;
server 10.1.0.102 weight=2;
server 10.1.0.103;
}

例如,在上面?#20801;?#30340;配置中,第一个服务器的选择频率是第二个服务器的两倍,与第三个服务器相比,它再次获得两倍的请求。

启用HTTPS的负载均衡

为您的网站启用HTTPS是保护访?#25910;?#21450;其数据的好方法。如果您?#24418;?#22312;网络主机上实施?#29992;埽?#25105;们强烈建议您查看我们的指?#24076;?a rel="noreferrer noopener" href="https://upcloud.com/community/tutorials/install-lets-encrypt-nginx/" target="_blank">了解如何在nginx上安装Let's Encrypt

在负载均衡器中使用?#29992;?#27604;您想象的要容易。您需要做的就是在负载均衡器配置文件中添加另一个服务器部分,该文件使用SSL侦听端口443上的HTTPS流量,并为上游段设置proxy_pass,就像上一个示例中的HTTP一样。

再次打开配置文件进行编辑。

sudo vi /etc/nginx/conf.d/load-balancer.conf

然后将以下服务器段添加到文件末尾。

server {
listen 443 ssl;
  server_name domain_name;
  ssl_certificate /etc/letsencrypt/live/domain_name/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  location / {
     proxy_pass http://backend;
  }
}

然后保存文件,退出编辑器并再次重新启动nginx。

sudo systemctl restart nginx

健康检查

为了知道哪些服务器可用,nginx的反向代理实现包括被动服务器健康检查。如果服务器无法响应请求或回复错误,nginx将注意服务器已失败,并将尝?#21592;?#20813;一段时间转发到该服务器的连接。

通过将参数max_fails设置为服务器行,可以在负载均衡器配置文件中定义特定时间段内连续不成功的连接尝试次数。默认情况下,如果未指定max_fails,则将此值设置为1.(可选)将max_fails设置为0将禁用对该服务器的运行状况检查。

如果将max_fails设置为大于1的值,则后续失败必须在特定时间?#27573;?#20869;发生,?#21592;?#26080;法计数。此时间?#27573;?#30001;参数fail_timeout指定,该参数还定义服务器应被视为失败的时间。默认情况下,fail_timeout设置为10秒。

在服务器标记失败并且fail_timeout设置的时间已过后,nginx将开始使用客户端请求正常探测服务器。如果探测返回成功,则服务器再次标记为实时并且正常包含在负载平衡中。

upstream backend {
server 10.1.0.101 weight=5;
server 10.1.0.102 max_fails=3 fail_timeout=30s;
server 10.1.0.103;
}

使用运行状况检查可以根据需要通过启动或关闭主机来使服务器后端适应当前需求。在高流量期间启动其他服务器可以在新?#35797;?#33258;动供负载均衡器使用时轻松提高应用程序性能。

结论

如果您希望提高Web应用程序的性能和可用性,那么设置负载均衡器绝对值得考虑。使用nginx进行负载均衡功能?#30475;?#19988;设置相对简单,并且与简单的?#29992;?#35299;决方案(例如Let's Encrypt客户端)一起使用,它为您的Web场提供了一个很好的前端。

虽然使用多个主机可?#21592;?#25252;您的Web服务具有冗余,但负载均衡器本身仍然可以留下单点?#25910;稀?#24744;可以通过在多个负载平衡器之间设置浮动IP来进一?#25945;?#39640;高可用性。

分类: nginx 标签:

推荐一个微信公众号

2019年6月8日 没有评论

程序员翻身

作者简介:程序员翻身,一个彪悍的程序员。曾在某大厂做过码农,后转型做产品。选择有时比努力重要,永远保持学习的热情,与你共成长。欢迎大家与我?#21019;睿?#35299;答你的职?#21040;?#21319;困惑,记录你我的?#36866;隆?/em>

分类: 杂谈 标签:

Markdown快速人门

2019年6月5日 没有评论

标题:使用#后面加题目标识标题:

#标题
##主要标题
###小标题
####第4级副标题

重点:

粗体:__string__或者**string**,斜体:_string_或者*string*,删除线:~~string~~

缩进引用:使用大于号(>)然后使用空格,然后键入文本。

无序列表: 使用横线(-)然后使用空格,然后键入文本。

编号列表: 使用数字(1. )然后使用空格,然后键入文本。

表格:

| Heading | Heading |
| ----| ----|
| text| text |
| text| text |

?#35745;?/strong>![Alt text](url/filename.gif "Title text")

水平线:使用三个星号:***

外部链接:[link text](http://url)

分类: 小技巧 标签:

如何让别人发现自己的才能

2019年5月18日 1 条评论

再小的个体也有品牌,尤其是在网红经济下的今天,高曝光意味着高收入,在那些躺着挣钱的大V带动下,很多搞技术的人也开始希望自己能被更多人认知认可,提高知名度的同时能交一些朋友,互相学习提高技术水平,朋友多了路好走。

可选择的路子很多,比如常见的:

  • 写博客,现在坚持的人不多,搜索引擎被csdn、jianshu等网站?#20113;?/li>
  • 写公众号,新注册的号没有留言功能,少了沟通手段
  • ?#27425;?#21338;...

选择哪一条路或者同时都选,记录感受、写些总结的东西是我们自然而然的选择。我觉得比较最简单的路子是专注于某一个技术,写出一些列的文章,从基础功能、高级功能、进?#23376;?#21270;形成一个体系比较好,比东一下西一下会更容?#20934;?#25345;下去,而且容易吸引?#25945;?#31881;支持,还能为自己的履历增加一个亮点。

如果不知道写什么好呢?可以借助百?#20154;?#32034;指数或者微信指数来辅助选出自己擅长同时又比?#20808;?#38376;的方向,搜索指数高意味着关注的人多,容易找到人互相交流。

百度上更多人redis相关的主题
微信上关注spring主题的更多

我有两个主题在写,如果有?#34892;?#36259;的可以一起?#30784;?/p>

  • nginx主题:www.nfnh.tw
  • redis主题:www.redis.com.cn

无论选择什么主题,最好提前写好提纲或者更新频?#22987;?#21010;,这样才能长久的坚持下?#30784;?#20889;任何主题都有江郎才尽的时候,从微信公众号就可以看出来,大V们动不动就让大家投票、分享,让你花钱入群讲?#36866;攏?#26368;后拿着你的?#36866;?#21435;吸引新人入群,这种套路就如同淘金路上卖水的,你想着入群去找金子,其?#31561;思?#26159;把水卖给了你,可发财的总是卖水。

最后,如果你不能合理规划时间,本着满足自己兴趣和理想的信念,大把时间投在这上面,我还是劝你先去赚钱,把工作做好,有了钱才能更好的谈兴趣。毕竟那些微博、微信大号明星是少数,多少怀揣着明星梦的人,最后只是为别人做嫁衣。

ps:品牌很重要,如果你没想好自己的品牌(合适的网名)前,建议不要开始?#30784;?#19981;要像我一样没有品牌。欢迎大家关注我的公众号:程序员翻身,大家可以发消息给我交流,我有时间都会回?#30784;?/p>

分类: 杂谈 标签:

linux安装boost库

2019年4月23日 没有评论

安装前准备

yum -y install gcc gcc-c++ python python-devel libicu libicu-devel zlib zlib-devel bzip2 bzip2-devel

编译boost

wget https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.tar.gz
tar zxvf boost_1_64_0.tar.gz
cd boost_1_64_0.tar.gz
./bootstrap.sh --with-libraries=all --with-toolset=gcc
##--with-libraries指定编译哪些boost库,all的话就是全部编译,只想编译部分库的话就把库的名称写上,之间用 , 号分隔即可,可指定的库下面介绍。--with-toolset指定编译时使用哪种编译器,Linux下使用gcc即可,如果系统中安装了多个版本的gcc,在这里可以指定gcc的版本,比如--with-toolset=gcc-4.4
./b2

安装boost

./b2 install 

设置环境变量

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
分类: c++ 标签:

批处理获取昨天日期

2019年2月22日 2 条评论

系统的数据按日期写成文件,每天需要处理前一天的文件。ps已经有获取昨天日期的功能,但是bat脚本没有这个功能,网上想要实现这个功能,需要调用脚本获取数据之类的方法。

通过分析我们可以使用变通的方法使用纯批处理程序获取到昨天的日期对应的文件。获取最新的文件来代表前一天的文件。

分类: 小技巧 标签:

mac下nginx开启80端口

2019年2月9日 没有评论

mac系统不允许?#27809;?#36827;程使用1024以下端口,配置文件写了80端口也不会生效。

把这个/usr/local/opt/nginx/homebrew.mxcl.nginx.plist文件复制到?/Library/LaunchDaemons?下, 接着执行launchctl load -w,如下:

sudo cp /usr/local/opt/nginx/*.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

重启系统后nginx可以使用80端口了。

分类: 苹果 标签:

mac自带的php-fpm页面空白以及错误日至输出

2019年2月8日 没有评论

配置好nginx、php-fpm之后,访问html页面正常,访问php后台?#20801;?#31354;白页面。

起初怀疑php-fpm问题,关闭php-fpm后在访?#26102;╣ateway错误,说明php-fpm是正常的。

重新检查nginx的配置,发现少了一句。fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

server {
        listen 8081;
        server_name localhost;
        root /Users/chenhe/Project/cx/;

        error_log  logs/error.log;

        index index.php index.html;


        location ~ \.php$ {
            include        fastcgi.conf;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        error_page 404 /404.html;
}

添加后重启nginx?#25351;?#27491;常。

运行之后发现php-fpm不输出php错误日?#23613;?/strong>

1. 修改 php-fpm.conf 文件,添加(或修?#27169;?#22914;下配置:

catch_workers_output = yes

2. 修改 php.ini 文件,添加(或修?#27169;?#22914;下配置:

  log_errors = On
  error_log = /usr/local/etc/php/5.4/php_errors.log
  error_reporting=E_ALL&~E_NOTICE

3. 重启 php-fpm

还是不输出日志,期间尝试很多办法,最后发现可能是权限问题。把启动php-fpm的方式修改为普通?#27809;?#26435;限就解决问题了。

sudo php-fpm -D 改为 php-fpm -D

默认时区提示

PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0

在php.ini 中修改

data.timezone = Asia/Shanghai

分类: php 标签:

mac安装docker

2019年2月7日 没有评论

mac系统不能像Linux系统安装docker那样一条命令完成,需要安装docker公司开发的软件,提供了一个虚拟化的环境来运行docker,安装完成之后1个多G。

1.首先确认系统版本,docker要求2010年以后的系统,10.12的操作系统可以安装Docker Desktop for Mac。老版的系统可以安装docker-Toolbox。

2.不能安装4.3.30以前版本的virtualbox,会有冲突,之后较新版本可以安装

3.注册docker hub账户,下载Docker.dmg需要先登录。

docker mac版下载地址https://download.docker.com/mac/stable/Docker.dmg

下载完成后双击安装包,拖动小鲸鱼到appications文件?#22411;?#25104;安装。

启动docker:launchPad->Docker (单击小鲸鱼图标)

首次打开会提示验证安装,点击打开


如果系统不符合要求,会有对应的最低操作系统版本要求提示,可以安装docker-Toolbox

分类: 苹果 标签:
北京快乐8几点开奖

<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div>

<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div><dl id="b56cf"><menu id="b56cf"><small id="b56cf"></small></menu></dl>

<sup id="b56cf"></sup>

<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div>

<div id="b56cf"><tr id="b56cf"><object id="b56cf"></object></tr></div><dl id="b56cf"><menu id="b56cf"><small id="b56cf"></small></menu></dl>

<sup id="b56cf"></sup>
河北20选5开奖结果查询结果 3d组选249前后关系 江苏体彩e球彩走势图 淘宝广酉快三开奖结果 足球胜负彩历史赔率 中湖北30选5大奖 2019主四码防四码 双色球历史开奖号码(按出球顺序) 内蒙古快三基本走势图手机版 光头强公式规律196796com 期六合彩特码资料 福彩3d精选列表 内蒙古11选五走势图 辽宁35选7好运中奖 福彩快乐二十分钟