-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
764 lines (549 loc) · 63.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#33363b">
<meta name="msapplication-TileColor" content="#33363b">
<meta name="keywords" content="Life, ARIA, Hexo">
<link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="/favicons/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png">
<link rel="mask-icon" href="/favicons/safari-pinned-tab.svg" color="#33363b">
<link rel="manifest" href="/favicons/site.webmanifest">
<meta name="msapplication-config" content="/favicons/browserconfig.xml">
<link rel="alternate" href="/atom.xml" title="个人博客" type="application/atom+xml">
<link rel="shortcut icon" type="image/x-icon" href="/favicons/favicon.ico">
<link rel="stylesheet" type="text/css" href="/css/normalize.css">
<link rel="stylesheet" type="text/css" href="/css/index.css">
<link rel="stylesheet" type="text/css" href="/css/sidebar.css">
<link rel="stylesheet" type="text/css" href="/css/page.css">
<link rel="stylesheet" type="text/css" href="/css/post.css">
<link rel="stylesheet" type="text/css" href="/css/custom.css">
<link rel="stylesheet" type="text/css" href="/css/atom-one-dark.css">
<link rel="stylesheet" type="text/css" href="/css/lightgallery.min.css">
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script defer type="text/javascript" src="/js/util.js"></script>
<script defer type="text/javascript" src="/js/clipboard.min.js"></script>
<script defer type="text/javascript" src="/js/scrollspy.js"></script>
<script defer type="text/javascript" src="/js/fontawesome-all.min.js"></script>
<script defer type="text/javascript" src="/js/lightgallery.min.js"></script>
<script defer type="text/javascript" src="/js/lg-fullscreen.min.js"></script>
<script defer type="text/javascript" src="/js/lg-hash.min.js"></script>
<script defer type="text/javascript" src="/js/lg-pager.min.js"></script>
<script defer type="text/javascript" src="/js/lg-thumbnail.min.js"></script>
<script defer type="text/javascript" src="/js/lg-zoom.min.js"></script>
<script defer src="/js/busuanzi.pure.mini.js"></script>
<script defer type="text/javascript" src="/js/search.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var searchPath = "search.xml";
if (searchPath.length === 0) {
searchPath = "search.xml";
}
var path = "/" + searchPath;
searchFunc(path, "search-input", "search-result");
});
</script>
<script defer type="text/javascript" src="/js/index.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var cb = null;
var els = $(".post figure.highlight");
if (els.length) {
// Enabled Hexo highlight line number.
$(els).each(function (i, e) {
$(e).before("<button class=\"copy button\">复制</button>");
});
cb = new ClipboardJS("button.copy", {
"target": function (trigger) {
// Get target element by DOM API.
// nextElementSibling is figure,highlight.
// And following is the sequence of Hexo's internal
// highlight layout with line number.
return trigger.nextElementSibling.firstChild.firstChild.firstChild.lastChild.firstChild.firstChild;
}
});
} else {
// Disabled Hexo highlight line number.
els = $(".post pre code");
$(els).each(function (i, e) {
// Add button before pre, not code.
$(e).parent().before("<button class=\"copy button\">复制</button>");
});
cb = new ClipboardJS("button.copy", {
"target": function (trigger) {
// Get target element by DOM API.
// nextElementSibling is figure,highlight.
// And following is the sequence of Hexo's internal
// highlight layout without line number.
return trigger.nextElementSibling.firstChild;
}
});
}
cb.on("success", function (e) {
e.clearSelection();
var trigger = e.trigger;
// Change button text as a user tip.
trigger.innerHTML = "已复制";
$(trigger).addClass("copied");
// Change button text back;
setTimeout(function () {
trigger.innerHTML = "复制";
$(trigger).removeClass("copied");
}, 1500);
});
});
</script>
<script defer type="text/javascript" src="/js/custom.js"></script>
<title>个人博客</title>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh_CN" data-spy="scroll" data-target=".list-group">
<header id="header" class="header" style="background: #33363b;">
<div class="container">
<div class="header-container">
<div class="header-title">
<h1 class="title"><a href="/">个人博客</a></h1>
<h2 class="subtitle"></h2>
</div>
<div class="logo">
<img src="/images/logo.png" alt="logo">
</div>
</div>
<nav id="nav" class="nav">
<a id="nav-toggle" class="nav-toggle" aria-hidden="true"><i class="fas fa-bars" aria-label="切换导航栏"></i></a>
<ul id="menu" role="menubar" aria-hidden="false">
<li role="menuitem"><a href="/" class="current"><i class="fas fa-home"></i><span class="menu-text">首页</span></a></li>
<li role="menuitem"><a href="/archives/"><i class="fas fa-archive"></i><span class="menu-text">归档</span></a></li>
<li role="menuitem"><a href="/categories/"><i class="fas fa-th-list"></i><span class="menu-text">分类</span></a></li>
<li role="menuitem"><a href="/tags/"><i class="fas fa-tags"></i><span class="menu-text">标签</span></a></li>
<li role="menuitem"><a href="/about/"><i class="fas fa-user-edit"></i><span class="menu-text">关于</span></a></li>
</ul>
</nav>
</div>
</header>
<main id="main" class="main">
<div class="container">
<div class="main-container">
<div class="content">
<div id="index" class="index page">
<article class="article post card animate" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2019/12/21/Centos安装教程/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="郑永荣">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/myavatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="个人博客">
</span>
</div>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link post-title-link-external" href="/2019/12/21/Centos安装教程/" itemprop="url">Centos安装教程</a>
</h1>
<div class="post-meta">
<span class="post-date">
<i class="far fa-calendar-plus"></i><span><time title="post-date" itemprop="dateCreated datePublished" datetime="2019-12-21T10:10:19+08:00">2019-12-21 10:10:19</time></span>
</span>
<span class="post-meta-divider divider">|</span>
<span class="post-categories">
<i class="far fa-folder-open"></i><span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Linux/" itemprop="url" rel="index"><span itemprop="name">Linux</span></a></span>
</span>
</div>
</header>
<main class="post-main" itemprop="articleBody">
<h3 id="1、CentOS-7镜像下载"><a href="#1、CentOS-7镜像下载" class="headerlink" title="1、CentOS 7镜像下载"></a>1、CentOS 7镜像下载</h3><p>阿里云站点:<a href="http://mirrors.aliyun.com/centos/7/isos/x86_64/" target="_blank" rel="noopener">http://mirrors.aliyun.com/centos/7/isos/x86_64/</a><br>各个版本的ISO镜像文件说明:<br><img src="https://img-blog.csdnimg.cn/20191220093618493.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="站点截图"></p>
<ul>
<li>CentOS-7-x86_64-DVD-1708.iso 标准安装版(推荐)</li>
<li>CentOS-7-x86_64-Everything-1708.iso 完整版,集成所有软件</li>
<li>CentOS-7-x86_64-Minimal-1708.iso 精简版,自带的软件最少</li>
</ul>
<h3 id="2、centos7安装教程"><a href="#2、centos7安装教程" class="headerlink" title="2、centos7安装教程"></a>2、centos7安装教程</h3><p><a href="https://blog.csdn.net/qq_42570879/article/details/82853708" target="_blank" rel="noopener">使用VMware安装centos教程</a></p>
<h3 id="3、xshell连接centos"><a href="#3、xshell连接centos" class="headerlink" title="3、xshell连接centos"></a>3、xshell连接centos</h3><p><strong>查看IP:</strong><a href="https://www.cnblogs.com/technology-huangyan/p/9146699.html" target="_blank" rel="noopener">参考链接</a><br><strong>发现 ens33 没有 inet 这个属性的</strong><br><img src="https://img-blog.csdnimg.cn/20191220094439252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="终端截图"></p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">vi /etc/sysconfig/network-scripts/ifcfg-ens33<br></code></pre></td></tr></table></figure>
<p><img src="https://img-blog.csdnimg.cn/20191220094545828.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt><br><strong>把这一项改为YES(ONBOOT=yes)</strong><br><img src="https://img-blog.csdnimg.cn/20191220094636963.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt><br><strong>使用xshell连接:</strong><br><img src="https://img-blog.csdnimg.cn/20191220094831687.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt></p>
<h3 id="4-、JDK安装教程"><a href="#4-、JDK安装教程" class="headerlink" title="4 、JDK安装教程"></a>4 、JDK安装教程</h3><p><a href="https://blog.csdn.net/github_38336924/article/details/82221258" target="_blank" rel="noopener">参考文章</a></p>
<h5 id="一、检查是否已安装JDK及卸载"><a href="#一、检查是否已安装JDK及卸载" class="headerlink" title="一、检查是否已安装JDK及卸载"></a>一、检查是否已安装JDK及卸载</h5><figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta">#</span> (以下命令二选一)<br>yum list installed | grep [java][jdk]<br>rpm -qa | grep [java][jdk][gcj]<br></code></pre></td></tr></table></figure>
<p><img src="https://img-blog.csdnimg.cn/20191220095752351.png" alt><br>执行命令出现如上图所示,需要卸载,反之即不用</p>
<ul>
<li>卸载JAVA环境<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum -y remove java-1.8.0-openjdk* //表时卸载所有openjdk相关文件输入<br>yum -y remove tzdata-java.noarch //卸载tzdata-java<br></code></pre></td></tr></table></figure>
</li>
</ul>
<h5 id="二、安装JDK"><a href="#二、安装JDK" class="headerlink" title="二、安装JDK"></a>二、安装JDK</h5><ul>
<li><p>查看JDK软件包列表</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum search java | grep -i --color jdk<br></code></pre></td></tr></table></figure>
</li>
<li><p>选择版本安装</p>
</li>
</ul>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel<br></code></pre></td></tr></table></figure>
<ul>
<li>或者如下命令,安装jdk1.8.0的所有文件</li>
</ul>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum install -y java-1.8.0-openjdk*<br></code></pre></td></tr></table></figure>
<ul>
<li>查看JDK是否安装成功</li>
</ul>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">java -version<br></code></pre></td></tr></table></figure>
<h5 id="三、配置环境变量"><a href="#三、配置环境变量" class="headerlink" title="三、配置环境变量"></a>三、配置环境变量</h5><ul>
<li>JDK默认安装路径/usr/lib/jvm<br><img src="https://img-blog.csdnimg.cn/20191220100155757.png" alt></li>
<li>使用vi /etc/profile命令添加如下配置<figure class="hljs highlight crystal"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment"># set java environment </span><br>JAVA_HOME=<span class="hljs-regexp">/usr/lib</span><span class="hljs-regexp">/jvm/java</span>-<span class="hljs-number">1.8</span>.<span class="hljs-number">0</span>-openjdk-<span class="hljs-number">1.8</span>.<span class="hljs-number">0.181</span>-<span class="hljs-number">3</span>.b13.el7_5.x86_64<br>PATH=$<span class="hljs-symbol">PATH:</span>$JAVA_HOME/bin <br>CLASSPATH=.:$JAVA_HOME/<span class="hljs-class"><span class="hljs-keyword">lib</span>/<span class="hljs-title">dt</span>.<span class="hljs-title">jar</span>:$<span class="hljs-title">JAVA_HOME</span>/<span class="hljs-title">lib</span>/<span class="hljs-title">tools</span>.<span class="hljs-title">jar</span> </span><br>export JAVA_HOME CLASSPATH PATH<br></code></pre></td></tr></table></figure>
</li>
</ul>
<p>保存关闭profile文件,执行如下命令生效</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">source /etc/profile<br></code></pre></td></tr></table></figure>
<p>使用如下命令,查看JDK变量</p>
<figure class="hljs highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-built_in">echo</span> <span class="hljs-variable">$JAVA_HOME</span><br><span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span><br><span class="hljs-built_in">echo</span> <span class="hljs-variable">$CLASSPATH</span><br></code></pre></td></tr></table></figure>
<p><img src="https://img-blog.csdnimg.cn/20191220100344353.png" alt></p>
<h3 id="5、SpringBoot-项目在linux后台守护进程运行"><a href="#5、SpringBoot-项目在linux后台守护进程运行" class="headerlink" title="5、SpringBoot 项目在linux后台守护进程运行"></a>5、SpringBoot 项目在linux后台守护进程运行</h3><p><a href="https://blog.csdn.net/qq_42714869/article/details/88550501" target="_blank" rel="noopener">参考链接</a></p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">nohup java -jar /usr/actuator-0.0.1-SNAPSHOT.jar --server.port=8080 >logName.log 2>&1 &<br></code></pre></td></tr></table></figure>
<p><strong>命令详解:</strong></p>
<ul>
<li><p>nohup:不挂断地运行命令,退出帐户之后继续运行相应的进程。</p>
</li>
<li><p>logName.log :是nohup把command的输出重定向到当前目录的指定的“日志文件名.log”文件中,即输出内容不打印到屏幕上,而是输出到”日志文件名.log”文件中。不指定文件名会在当前目录创建nohup.out,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。</p>
</li>
<li><p>2>&1:2就是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出么。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的“日志文件名.log”文件中。</p>
</li>
<li><p>java -jar springbootProjectName.jar:执行springboot的项目,如果单单只执行该命令,linux只会短暂的运行该项目,当退出控制台后会自动关闭该项目。</p>
</li>
<li><p>最后的&:让该项目在后台运行。</p>
</li>
</ul>
<p><strong>注意:</strong> bash: nohup: command not found解决方法:<br><a href="https://blog.csdn.net/leisure_life/article/details/80533492" target="_blank" rel="noopener">参考链接</a></p>
<ul>
<li>查看本地是否有<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">which nohup<br></code></pre></td></tr></table></figure>
</li>
</ul>
<p><img src="https://img-blog.csdnimg.cn/20191220104642199.png" alt></p>
<ul>
<li>到当前用户的根目录(我的是root)</li>
</ul>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">cd ~<br>vi .bash_profile<br></code></pre></td></tr></table></figure>
<p>在原来后边加上:/usr/bin,保存,退出<br><img src="https://img-blog.csdnimg.cn/20191220104832839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt></p>
<ul>
<li>使文件立刻生效</li>
</ul>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">source ~/.bash_profile<br></code></pre></td></tr></table></figure>
<ul>
<li>查看是否成功<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">nohup --version<br></code></pre></td></tr></table></figure>
</li>
</ul>
<p><img src="https://img-blog.csdnimg.cn/20191220105011963.png" alt><br>如果第一步就没有发现nohup,先安装,再配置</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum install coreutils<br></code></pre></td></tr></table></figure>
<h3 id="6、外部访问项目"><a href="#6、外部访问项目" class="headerlink" title="6、外部访问项目"></a>6、外部访问项目</h3><figure class="hljs highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta"># 虚拟机内部链接测试(确保项目运行正常):</span><br>curl http:<span class="hljs-comment">//localhost:8080/hello</span><br></code></pre></td></tr></table></figure>
<p><img src="https://img-blog.csdnimg.cn/20191220110927898.png" alt></p>
<h4 id="外部访问必须关闭防火墙或者开放相应的端口"><a href="#外部访问必须关闭防火墙或者开放相应的端口" class="headerlink" title="外部访问必须关闭防火墙或者开放相应的端口"></a>外部访问必须关闭防火墙或者开放相应的端口</h4><ul>
<li><p><a href="https://jingyan.baidu.com/article/ff42efa9fd8c1cc19e2202bb.html" target="_blank" rel="noopener">关闭防火墙</a></p>
</li>
<li><p><a href="https://www.linuxidc.com/Linux/2019-06/159104.htm" target="_blank" rel="noopener">开放端口(开放端口需要重启防火墙)</a></p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs shell">开启端口<br>[root@centos7 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent<br><br>查询端口号80 是否开启:<br>[root@centos7 ~]# firewall-cmd --query-port=80/tcp<br><br>重启防火墙:<br>[root@centos7 ~]# firewall-cmd --reload<br><br>查询有哪些端口是开启的:<br>[root@centos7 ~]# firewall-cmd --list-port<br><br>命令含义:<br>--zone #作用域<br>--add-port=80/tcp #添加端口80,格式为:端口/通讯协议<br>--permanent #永久生效,没有此参数重启后失效<br></code></pre></td></tr></table></figure>
</li>
</ul>
<figure class="hljs highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-number">1.</span>启动防火墙<br>systemctl start firewalld <br><span class="hljs-number">2.</span>禁用防火墙<br>systemctl stop firewalld<br><span class="hljs-number">3.</span>设置开机启动<br>systemctl enable firewalld<br><span class="hljs-number">4.</span>停止并禁用开机启动<br>sytemctl disable firewalld<br><span class="hljs-number">5.</span>重启防火墙<br>firewall-cmd --reload<br><span class="hljs-number">6.</span>查看状态<br>systemctl status firewalld或者 firewall-cmd --<span class="hljs-section">state</span><br></code></pre></td></tr></table></figure>
<ul>
<li>端口被占用解决方法:<figure class="hljs highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta"># 查看正在使用的端口</span><br>netstat -tanlp<br><span class="hljs-meta"># 杀死进程</span><br>kill pid<br></code></pre></td></tr></table></figure></li>
</ul>
</main>
<footer class="post-footer">
<div class="post-tags">
<a class="post-tag button" href="/tags/Linux/" rel="tag"><i class="fas fa-tags"></i>Linux</a>
</div>
</footer>
</article>
<article class="article post card animate" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2019/12/21/docker学习笔记/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="郑永荣">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/myavatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="个人博客">
</span>
</div>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link post-title-link-external" href="/2019/12/21/docker学习笔记/" itemprop="url">docker学习笔记</a>
</h1>
<div class="post-meta">
<span class="post-date">
<i class="far fa-calendar-plus"></i><span><time title="post-date" itemprop="dateCreated datePublished" datetime="2019-12-21T10:00:49+08:00">2019-12-21 10:00:49</time></span>
</span>
<span class="post-meta-divider divider">|</span>
<span class="post-categories">
<i class="far fa-folder-open"></i><span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Linux/" itemprop="url" rel="index"><span itemprop="name">Linux</span></a></span>
</span>
</div>
</header>
<main class="post-main" itemprop="articleBody">
<h2 id="1、简介"><a href="#1、简介" class="headerlink" title="1、简介"></a>1、简介</h2><p><strong>Docker</strong>是一个开源的应用容器引擎;是一个轻量级容器技术;</p>
<p>Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;</p>
<p>运行中的这个镜像称为容器,容器启动是非常快速的。<br><img src="https://img-blog.csdnimg.cn/2019120709145317.png" alt="docker"><br><img src="https://img-blog.csdnimg.cn/20191207091505219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="windows镜像系统"></p>
<h2 id="2、核心概念"><a href="#2、核心概念" class="headerlink" title="2、核心概念"></a>2、核心概念</h2><p>docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);</p>
<p>docker客户端(Client):连接docker主机进行操作;</p>
<p>docker仓库(Registry):用来保存各种打包好的软件镜像;</p>
<p>docker镜像(Images):软件打包好的镜像;放在docker仓库中;</p>
<p>docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用<br><img src="https://img-blog.csdnimg.cn/2019120709154056.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="核心概念"></p>
<p>使用Docker的步骤:</p>
<p>1)、安装Docker</p>
<p>2)、去Docker仓库找到这个软件对应的镜像;</p>
<p>3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;</p>
<p>4)、对容器的启动停止就是对软件的启动停止;</p>
<h2 id="3、安装Docker"><a href="#3、安装Docker" class="headerlink" title="3、安装Docker"></a>3、安装Docker</h2><h4 id="1)、安装linux虚拟机(或者使用阿里云服务器)"><a href="#1)、安装linux虚拟机(或者使用阿里云服务器)" class="headerlink" title="1)、安装linux虚拟机(或者使用阿里云服务器)"></a>1)、安装linux虚拟机(或者使用阿里云服务器)</h4><pre><code>1)、VMWare、VirtualBox(安装);
2)、导入虚拟机文件;
3)、双击启动linux虚拟机;使用 root/ 123456登陆
4)、使用客户端连接linux服务器进行命令操作;
5)、设置虚拟机网络;
桥接网络===选好网卡====接入网线;
6)、设置好网络以后使用命令重启虚拟机的网络</code></pre><figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">service network restart<br></code></pre></td></tr></table></figure>
<pre><code>7)、查看linux的ip地址</code></pre><figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">ip addr<br></code></pre></td></tr></table></figure>
<pre><code>8)、使用客户端连接linux;</code></pre><h4 id="2)、在linux虚拟机上安装docker"><a href="#2)、在linux虚拟机上安装docker" class="headerlink" title="2)、在linux虚拟机上安装docker"></a>2)、在linux虚拟机上安装docker</h4><p>一、<strong>配置阿里云yum源(提高docker软件下载速度):</strong> <a href="https://www.cnblogs.com/operationhome/p/11094493.html" target="_blank" rel="noopener">参考连接</a><br>1、备份</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup<br></code></pre></td></tr></table></figure>
<p>2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/<br>CentOS 7</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo<br></code></pre></td></tr></table></figure>
<p>或者</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo<br></code></pre></td></tr></table></figure>
<p>3、生成新的缓存</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum clean all<br>yum makecache<br>yum update<br></code></pre></td></tr></table></figure>
<p>二、安装docker步骤:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs shell">1、检查内核版本,必须是3.10及以上<br>uname -r<br><br>2、使用 root 权限登录 Centos。确保 yum 包更新到最新。<br>yum update<br><br>3、卸载旧版本(如果安装过旧版本的话)<br><span class="hljs-meta">$</span><span class="bash"> yum remove docker docker-common docker-selinux docker-engine</span><br><br>4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的<br><span class="hljs-meta">$</span><span class="bash"> yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><br>5、设置yum源<br><span class="hljs-meta">$</span><span class="bash"> sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span><br><br>6、可以查看所有仓库中所有docker版本,并选择特定版本安装<br><span class="hljs-meta">$</span><span class="bash"> yum list docker-ce --showduplicates | sort -r</span><br><br>7、安装docker<br><span class="hljs-meta">$</span><span class="bash"> yum install docker-ce-17.12.0.ce <span class="hljs-comment">#由于repo中默认只开启stable仓库,这里安装的是稳定版17.12.0</span></span><br><br>8、启动docker<br>[root@localhost ~] systemctl start docker<br>[root@localhost ~] docker -v<br>Docker version 1.12.6, build 3e8e77d/1.12.6<br><br>9、开机启动docker<br>[root@localhost ~] systemctl enable docker<br>Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.<br><br>10、停止docker<br>systemctl stop docker<br></code></pre></td></tr></table></figure>
<h2 id="4、Docker常用命令-amp-操作"><a href="#4、Docker常用命令-amp-操作" class="headerlink" title="4、Docker常用命令&操作"></a>4、Docker常用命令&操作</h2><h3 id="1)、镜像操作"><a href="#1)、镜像操作" class="headerlink" title="1)、镜像操作"></a>1)、镜像操作</h3><table>
<thead>
<tr>
<th>操作</th>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>检索</td>
<td>docker search 关键字 eg:docker search redis</td>
<td>我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。</td>
</tr>
<tr>
<td>拉取</td>
<td>docker pull 镜像名:tag</td>
<td>:tag是可选的,tag表示标签,多为软件的版本,默认是latest</td>
</tr>
<tr>
<td>列表</td>
<td>docker images</td>
<td>查看所有本地镜像</td>
</tr>
<tr>
<td>删除</td>
<td>docker rmi image-id</td>
<td>删除指定的本地镜像</td>
</tr>
</tbody></table>
<p><strong>镜像查找:</strong> <a href="https://hub.docker.com/(包含具体镜像的操作命令)" target="_blank" rel="noopener">https://hub.docker.com/(包含具体镜像的操作命令)</a><br><strong>docker改国内官方镜像(提升镜像pull速度):</strong><br>编辑文件/etc/docker/daemon.json,没有就新建。加入以下项目</p>
<figure class="hljs highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs json">{<br> <span class="hljs-attr">"registry-mirrors"</span>: [<span class="hljs-string">"https://registry.docker-cn.com"</span>,<span class="hljs-string">"http://hub-mirror.c.163.com"</span>]<br>}<br></code></pre></td></tr></table></figure>
<p>本身daemon.json文件已经有项目,就额外增加registry-mirrors项</p>
<p>重启docker daemon</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">systemctl restart docker<br></code></pre></td></tr></table></figure>
<h3 id="2)、容器操作"><a href="#2)、容器操作" class="headerlink" title="2)、容器操作"></a>2)、容器操作</h3><p>软件镜像(QQ安装程序)—-运行镜像—-产生一个容器(正在运行的软件,运行的QQ);</p>
<p>步骤:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs shell">1、搜索镜像<br>[root@localhost ~] docker search tomcat<br>2、拉取镜像<br>[root@localhost ~] docker pull tomcat<br>3、根据镜像启动容器<br>docker run --name mytomcat -d tomcat:latest<br>4、docker ps <br>查看运行中的容器<br>5、 停止运行中的容器<br>docker stop 容器的id<br>6、查看所有的容器(包括没有运行的)<br>docker ps -a<br>7、启动容器<br>docker start 容器id<br>8、删除一个容器<br> docker rm 容器id<br>9、启动一个做了端口映射的tomcat<br>[root@localhost ~]# docker run -d -p 8888:8080 tomcat<br>-d:后台运行<br>-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口<br><br>10、为了演示简单关闭了linux的防火墙<br>service firewalld status ;查看防火墙状态<br>service firewalld stop:关闭防火墙<br>11、查看容器的日志<br>docker logs container-name/container-id<br></code></pre></td></tr></table></figure>
<p><strong>更多命令参看</strong><br><a href="https://docs.docker.com/engine/reference/commandline/docker/" target="_blank" rel="noopener">https://docs.docker.com/engine/reference/commandline/docker/</a><br>可以参考每一个镜像的文档</p>
<h3 id="3)、安装MySQL示例"><a href="#3)、安装MySQL示例" class="headerlink" title="3)、安装MySQL示例"></a>3)、安装MySQL示例</h3><figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker pull mysql:5.7<br></code></pre></td></tr></table></figure>
<p>正确的启动:做了端口映射</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs shell">[root@localhost ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql<br>ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434<br>[root@localhost ~]# docker ps<br>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br>ad10e4bc5c6a mysql "docker-entrypoint.sh" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql02<br></code></pre></td></tr></table></figure>
<p>几个其他的高级操作</p>
<figure class="hljs highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined">docker <span class="hljs-builtin-name">run</span> --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e <span class="hljs-attribute">MYSQL_ROOT_PASSWORD</span>=my-secret-pw -d mysql:tag<br>把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面<br>改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)<br><br>docker <span class="hljs-builtin-name">run</span> --name some-mysql -e <span class="hljs-attribute">MYSQL_ROOT_PASSWORD</span>=my-secret-pw -d mysql:tag <span class="hljs-attribute">--character-set-server</span>=utf8mb4 <span class="hljs-attribute">--collation-server</span>=utf8mb4_unicode_ci<br>指定mysql的一些配置参数<br></code></pre></td></tr></table></figure>
<p><strong>docker安装mysql后外部无法访问,解决办法:</strong></p>
<ol>
<li>记得开启阿里云相应的端口号</li>
<li>修改权限<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs shell">使用bash窗口<br>docker exec -it mysqlDB bash<br><br>登陆mysql<br>mysql -uroot -p123456;<br><br>修改权限<br><span class="hljs-meta">></span><span class="bash"> use mysql;</span><br><span class="hljs-meta">></span><span class="bash"> update user <span class="hljs-built_in">set</span> authentication_string = password(<span class="hljs-string">'123456'</span>) <span class="hljs-built_in">where</span> user = <span class="hljs-string">'root'</span>;</span><br><span class="hljs-meta">></span><span class="bash"> grant all privileges on *.* to <span class="hljs-string">'root'</span>@<span class="hljs-string">'%'</span> identified by <span class="hljs-string">'123456'</span> with grant option;</span><br><span class="hljs-meta">></span><span class="bash"> flush privileges;</span><br><span class="hljs-meta">></span><span class="bash"> <span class="hljs-built_in">exit</span>;</span><br></code></pre></td></tr></table></figure>
</li>
</ol>
<h3 id="4)、安装redis"><a href="#4)、安装redis" class="headerlink" title="4)、安装redis"></a>4)、安装redis</h3><figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker pull redis:5.0.7<br></code></pre></td></tr></table></figure>
<p>正确的启动:做了端口映射</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs shell">[root@localhost ~] docker run -d -p 6381:6379 --name myredis redis:5.0.7 --requirepass "123456"<br><span class="hljs-meta">#</span><span class="bash"> --requirepass <span class="hljs-string">"123456"</span> 设置密码</span><br><span class="hljs-meta">#</span><span class="bash"> -p 6381:6379:映射容器服务的 6379 端口到宿主机的 681 端口。外部可以直接通过宿主机ip:6381 访问到 Redis 的服务</span><br>[root@localhost ~] docker ps<br>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br>dff3d4e7ef6b redis:5.0.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:6381->6379/tcp myredis<br>[root@localhost ~] docker exec -it myredis bash <br><span class="hljs-meta">#</span><span class="bash">docker <span class="hljs-built_in">exec</span> -it xxx bash 这个命令是表示进入容器的,xxx是服务名称也可以是容器的id</span><br></code></pre></td></tr></table></figure>
<p>几个其他的高级操作</p>
<figure class="hljs highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"># docker run -<span class="hljs-keyword">p</span> <span class="hljs-number">6382</span>:<span class="hljs-number">6379</span> --name myredis -v $PWD/redis.<span class="hljs-keyword">conf</span>:/etc/redis/redis.<span class="hljs-keyword">conf</span> -v $PWD/dat<span class="hljs-variable">a:</span>/data -d <span class="hljs-keyword">redi</span><span class="hljs-variable">s:5</span>.<span class="hljs-number">0.7</span> redis-server /etc/redis/redis.<span class="hljs-keyword">conf</span> --appendonly yes<br> 命令说明:<br> --name myredis : 指定容器名称,这个最好加上,不然在看docker进程的时候会很尴尬。<br> -<span class="hljs-keyword">p</span> <span class="hljs-number">6699</span>:<span class="hljs-number">6379</span> : 端口映射,默认redis启动的是<span class="hljs-number">6379</span>,至于外部端口,随便玩吧,不冲突就行。<br> -v $PWD/redis.<span class="hljs-keyword">conf</span>:/etc/redis/redis.<span class="hljs-keyword">conf</span> : 将主机中当前目录下的redis.<span class="hljs-keyword">conf</span>配置文件映射。<br> -v $PWD/dat<span class="hljs-variable">a:</span>/data -d <span class="hljs-keyword">redi</span><span class="hljs-variable">s:3</span>.<span class="hljs-number">2</span> : 将主机中当前目录下的data挂载到容器的/data<br> --redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置\<br></code></pre></td></tr></table></figure>
<p><strong>docker安装redis后外部无法访问,解决办法:</strong> 记得开启阿里云相应的端口号.</p>
<h3 id="5)、安装Elasticsearch"><a href="#5)、安装Elasticsearch" class="headerlink" title="5)、安装Elasticsearch"></a>5)、安装Elasticsearch</h3><p><a href="https://blog.csdn.net/qq_32101993/article/details/100021002" target="_blank" rel="noopener">参考文章:https://blog.csdn.net/qq_32101993/article/details/100021002</a><br>拉取镜像:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker pull elasticsearch:tag(6.8.5)<br></code></pre></td></tr></table></figure>
<p>启动:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs shell">[root@localhost ~] docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 --name ES01 elasticsearch:版本号(如果是latest则不写) <br>[root@localhost ~] docker ps<br><span class="hljs-meta">#</span><span class="bash"> 查看是否成功</span><br>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br>c3f23945d1ed elasticsearch:6.8.5 "/usr/local/bin/dock…" 6 minutes ago Up 53 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp ES01<br></code></pre></td></tr></table></figure>
<p><strong>此时已经可以正常外部访问网址:域名:端口号</strong></p>
<p>配置跨域:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs shell">1.首先进入容器<br>docker exec -it ES01 /bin/bash<br>2.安装vim<br>yum -y install vim*<br>3.编辑/config/elasticsearch.ym<br>vim elasticsearch.yml <br>4.添加内容<br>cluster.name: "qfcwx-cluster" <br>network.host: 0.0.0.0<br>http.cors.enabled: true<br>http.cors.allow-origin: "*"<br>5.exit<br>6.重启<br>docker restart ES01(容器id或者name)<br></code></pre></td></tr></table></figure>
<ol>
<li>cluster.name:自定义集群名称。</li>
<li>network.host:当前es节点绑定的ip地址,默认127.0.0.1,如果需要开放对外访问这个属性必须设置。</li>
<li>http.cors.enabled:是否支持跨域,默认为false。</li>
<li>http.cors.allow-origin:当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/201912071557173.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="elasticsearch.yml"><br>访问截图:</p>
<p><img src="https://img-blog.csdnimg.cn/20191207155655168.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="访问截图"></p>
<h3 id="5)、安装rabbitMQ"><a href="#5)、安装rabbitMQ" class="headerlink" title="5)、安装rabbitMQ"></a>5)、安装rabbitMQ</h3><p><a href="https://www.cnblogs.com/yufeng218/p/9452621.html" target="_blank" rel="noopener">参考文章:https://www.cnblogs.com/yufeng218/p/9452621.html</a><br>拉取镜像:选择带有<strong>mangement</strong>的版本(<strong>包含web管理页面</strong>)</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker pull rabbitmq:management<br></code></pre></td></tr></table></figure>
<p>启动:</p>
<figure class="hljs highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs shell">[root@localhost ~] docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 6bd1749b8197<br>[root@izlnxqoeytyh4fz ~]# docker ps<br>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br>c6575d289410 6bd1749b8197 "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, 0.0.0.0:15673->5672/tcp rabbitmq<br></code></pre></td></tr></table></figure>
<ul>
<li>-v 映射目录或文件;</li>
<li>–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);</li>
<li>-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)</li>
</ul>
<figure class="hljs highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment"># 进入控制台</span><br>docker exec -<span class="hljs-keyword">it</span> rabbitmq /bin/bash<br></code></pre></td></tr></table></figure>
<p><strong>此时已经可以正常外部访问网址:域名:端口号</strong></p>
<p>访问截图:<br><img src="https://img-blog.csdnimg.cn/20191218105031534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM0MjcwMg==,size_16,color_FFFFFF,t_70" alt="访问截图"></p>
</main>
<footer class="post-footer">
<div class="post-tags">
<a class="post-tag button" href="/tags/Linux/" rel="tag"><i class="fas fa-tags"></i>Linux</a>
</div>
</footer>
</article>
<article class="article post card animate" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2019/08/28/乐观锁与悲观锁/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="郑永荣">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/myavatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="个人博客">
</span>
</div>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link post-title-link-external" href="/2019/08/28/乐观锁与悲观锁/" itemprop="url">乐观锁与悲观锁</a>
</h1>
<div class="post-meta">
<span class="post-date">
<i class="far fa-calendar-plus"></i><span><time title="post-date" itemprop="dateCreated datePublished" datetime="2019-08-28T12:16:41+08:00">2019-08-28 12:16:41</time></span>
</span>
<span class="post-meta-divider divider">|</span>
<span class="post-categories">
<i class="far fa-folder-open"></i><span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/面试/" itemprop="url" rel="index"><span itemprop="name">面试</span></a></span>
</span>
</div>
</header>
<main class="post-main" itemprop="articleBody">
<h3 id="何谓悲观锁与乐观锁"><a href="#何谓悲观锁与乐观锁" class="headerlink" title="何谓悲观锁与乐观锁"></a>何谓悲观锁与乐观锁</h3><p>乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。</p>
<h3 id="悲观锁"><a href="#悲观锁" class="headerlink" title="悲观锁"></a>悲观锁</h3><p>总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。</p>
<h3 id="乐观锁"><a href="#乐观锁" class="headerlink" title="乐观锁"></a>乐观锁</h3><p>总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。</p>
<h4 id="两种锁的使用场景"><a href="#两种锁的使用场景" class="headerlink" title="两种锁的使用场景"></a>两种锁的使用场景</h4><p>从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。</p>
<h4 id="乐观锁常见的两种实现方式"><a href="#乐观锁常见的两种实现方式" class="headerlink" title="乐观锁常见的两种实现方式"></a>乐观锁常见的两种实现方式</h4><p>乐观锁一般会使用版本号机制或CAS算法实现。</p>
<ol>
<li>版本号机制<br>一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。</li>
</ol>
<p>举一个简单的例子:<br>假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。</p>
<p>操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50( $100-$50 )。<br>在操作员 A 操作的过程中,操作员B 也读入此用户信息( version=1 ),并从其帐户余额中扣除 $20 ( $100-$20 )。<br>操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。<br>操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 当前最后更新的version与操作员第一次的版本号相等 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。<br>这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作员A 的操作结果的可能。</p>
<ol start="2">
<li>CAS算法<br>即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数</li>
</ol>
<ul>
<li>需要读写的内存值 V</li>
<li>进行比较的值 A</li>
<li>拟写入的新值 B<blockquote>
<p>当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。</p>
</blockquote>
</li>
</ul>
</main>
<footer class="post-footer">
<div class="post-tags">
<a class="post-tag button" href="/tags/Java/" rel="tag"><i class="fas fa-tags"></i>Java</a>
<a class="post-tag button" href="/tags/面试/" rel="tag"><i class="fas fa-tags"></i>面试</a>
<a class="post-tag button" href="/tags/多线程/" rel="tag"><i class="fas fa-tags"></i>多线程</a>
</div>
</footer>
</article>
<nav class="pagination">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">…</span><a class="page-number" href="/page/6/">6</a><a class="extend next" rel="next" href="/page/2/"><i class="fas fa-angle-right" aria-label="下一页"></i></a>
</nav>
<div class="comments" id="comments">
</div>
</div>
</div>
<aside class="sidebar" id="sidebar" style="background: url(/images/background.png);">
<div class="search">
<div class="form-group">
<i class="fas fa-search"></i><input type="search" id="search-input" name="q" results="0" placeholder="搜索" class="form-control">
</div>
</div>
<div class="search-result-box" id="search-result"></div>
<div class="info sidebar-item" id="info">
<img class="author-avatar" src="/images/myavatar.png" alt="郑永荣">
<h1 class="author-name">郑永荣</h1>
<h2 class="author-description"></h2>
<div class="site-count">
<div class="archives-count count-block">
<div class="site-count-title">归档</div>
<div><a href="/archives/">16</a></div>
</div>
<div class="categories-count count-block">
<div class="site-count-title">分类</div>
<div><a href="/categories/">8</a></div>
</div>
<div class="tags-count count-block">
<div class="site-count-title">标签</div>
<div><a href="/tags/">9</a></div>
</div>
</div>
<div class="rss">
<a class="rss-link button sidebar-item" href="/atom.xml"><i class="fas fa-rss"></i>RSS</a>
</div>
</div>
<div class="sidebar-sticky">
<hr>
<div class="social-link sidebar-item">
<div><i class="far fa-address-card"></i>社交链接<p></p></div>
<ul>
<li><i class="fas fa-envelope"></i><a href="mailto:[email protected]" target="_blank">E-Mail</a></li>
<li><i class="fab fa-github"></i><a href="https://github.com/ZhengYongrong" target="_blank">GitHub</a></li>
<li><i class="fab fa-cuttlefish"></i><a href="https://me.csdn.net/weixin_42342702" target="_blank">CSDN</a></li>
<li><i class="fab fa-weibo"></i><a href="https://weibo.com/" target="_blank">Weibo</a></li>
</ul>
</div>
<hr>
<div class="blogroll sidebar-item">
<div><i class="fas fa-link"></i>友情链接</div>
<ul>
<li><i class="fas fa-link"></i><a href="https://github.com/" target="_blank">GitHub</a></li>
<li><i class="fas fa-link"></i><a href="https://developer.mozilla.org/" target="_blank">MDN</a></li>
<li><i class="fas fa-link"></i><a href="https://mvnrepository.com/" target="_blank">Maven</a></li>
</ul>
</div>
</div>
</aside>
</div>
</div>
</main>
<footer id="footer" class="footer" style="background: #33363b;">
<div class="container">
<div class="back-to-top">
<button id="back-to-top"><i class="fas fa-angle-double-up" aria-label="回到顶部"></i></button>
</div>
<div class="footer-container">
<div class="footer-left">
<div class="copyright">
<span class="author">郑永荣</span><span class="year"><i class="far fa-copyright"></i>2017 - 2019</span>
</div>
<div class="busuanzi">
<span id="busuanzi_container_site_pv"><i class="fas fa-eye" aria-label="站点点击量" aria-hidden="false"></i><span id="busuanzi_value_site_pv"></span></span><span id="busuanzi_container_site_uv"><i class="fas fa-user" aria-label="站点用户数" aria-hidden="false"></i><span id="busuanzi_value_site_uv"></span></span><span id="busuanzi_container_page_pv"><i class="far fa-file-alt"></i><span id="busuanzi_value_page_pv" aria-label="页面点击量" aria-hidden="false"></span></span>
</div>
</div>
<div class="footer-right">
<div class="custom-info">
托管于<i class="fab fa-github-alt"></i><a href="https://pages.github.com/" target="_blank">GitHub Pages</a>
</div>
<div class="powered-by">
由 <a href="https://hexo.io/" target="_blank">Hexo</a> 强力驱动 | 主题 <a href="https://github.com/AlynxZhou/hexo-theme-aria/" target="_blank">ARIA</a>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>