forked from zyb0408/zyb0408.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2016-03-13-docker入门实战笔记.html
1328 lines (773 loc) · 83.1 KB
/
2016-03-13-docker入门实战笔记.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
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="theme-next pisces use-motion" lang="zh-Hans">
<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="#222">
<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
<link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">
<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">
<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">
<meta name="keywords" content="docker,">
<meta name="description" content="什么是docker?========== docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行; Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主">
<meta name="keywords" content="docker">
<meta property="og:type" content="article">
<meta property="og:title" content="docker入门实战笔记">
<meta property="og:url" content="https://zyb0408.github.io/2016-03-13-docker入门实战笔记.html">
<meta property="og:site_name" content="小蜜蜂">
<meta property="og:description" content="什么是docker?========== docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行; Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主">
<meta property="og:locale" content="zh-Hans">
<meta property="og:updated_time" content="2016-03-13T15:15:51.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="docker入门实战笔记">
<meta name="twitter:description" content="什么是docker?========== docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行; Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主">
<script type="text/javascript" id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Pisces',
version: '5.1.4',
sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":true,"onmobile":false},
fancybox: true,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
duoshuo: {
userId: '0',
author: '博主'
},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<link rel="canonical" href="https://zyb0408.github.io/2016-03-13-docker入门实战笔记.html">
<title>docker入门实战笔记 | 小蜜蜂</title>
</head>
<body itemscope="" itemtype="http://schema.org/WebPage" lang="zh-Hans">
<div class="container sidebar-position-left page-post-detail">
<div class="headband"></div>
<header id="header" class="header" itemscope="" itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta custom-logo">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">小蜜蜂</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle">Don't Hack Me</p>
</div>
<div class="site-nav-toggle">
<button>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section">
<i class="menu-item-icon fa fa-fw fa-home"></i> <br>
首页
</a>
</li>
<li class="menu-item menu-item-about">
<a href="/about/" rel="section">
<i class="menu-item-icon fa fa-fw fa-user"></i> <br>
关于
</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section">
<i class="menu-item-icon fa fa-fw fa-tags"></i> <br>
标签
</a>
</li>
<li class="menu-item menu-item-categories">
<a href="/categories/" rel="section">
<i class="menu-item-icon fa fa-fw fa-th"></i> <br>
分类
</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section">
<i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
归档
</a>
</li>
<li class="menu-item menu-item-search">
<a href="javascript:;" class="popup-trigger">
<i class="menu-item-icon fa fa-search fa-fw"></i> <br>
搜索
</a>
</li>
</ul>
<div class="site-search">
<div class="popup search-popup local-search-popup">
<div class="local-search-header clearfix">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<span class="popup-btn-close">
<i class="fa fa-times-circle"></i>
</span>
<div class="local-search-input-wrapper">
<input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
</div>
</div>
<div id="local-search-result"></div>
</div>
</div>
</nav>
</div>
</header>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<div id="posts" class="posts-expand">
<article class="post post-type-normal" itemscope="" itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://zyb0408.github.io/2016-03-13-docker入门实战笔记.html">
<span hidden itemprop="author" itemscope="" itemtype="http://schema.org/Person">
<meta itemprop="name" content="小蜜蜂">
<meta itemprop="description" content="">
<meta itemprop="image" content="/images/favicon-32x32-next.png">
</span>
<span hidden itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization">
<meta itemprop="name" content="小蜜蜂">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">docker入门实战笔记</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建于" itemprop="dateCreated datePublished" datetime="2016-03-13T23:15:51+08:00">
2016-03-13
</time>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于:</span>
<time title="更新于" itemprop="dateModified" datetime="2016-03-13T23:15:51+08:00">
2016-03-13
</time>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope="" itemtype="http://schema.org/Thing">
<a href="/categories/运维/" itemprop="url" rel="index">
<span itemprop="name">运维</span>
</a>
</span>
</span>
<span class="post-meta-divider">|</span>
<span class="page-pv"><i class="fa fa-file-o"></i>
<span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
</span>
<div class="post-wordcount">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-file-word-o"></i>
</span>
<span class="post-meta-item-text">字数统计:</span>
<span title="字数统计">
4.9k
</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-clock-o"></i>
</span>
<span class="post-meta-item-text">阅读时长 ≈</span>
<span title="阅读时长">
19
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<div>
<div>
<div style="text-align:center;color: #636363;font-size:14px;letter-spacing: 10px">���Ľ�����<i class="fa fa-bell"></i>��л�����Ķ�</div>
</div>
</div>
<h2 id="什么是docker?"><a href="#什么是docker?" class="headerlink" title="什么是docker?"></a>什么是docker?</h2><p>==========</p>
<p>docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行; Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存; Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等; Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并; Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展; Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image; Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等; docker运用场景: web应用的自动化打包和发布; 自动化测试和持续集成、发布; 在服务型环境中部署和调整数据库或其他的后台应用; 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。 可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义: Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、 OpenStack 集群和其他的基础应用平台。 意思很明显了.按照我的理解,先不考虑docker的实现方式,其实docker就是一个包含运行环境的应用,由于自身带有所有需要的运行环境促成了他的可移植性和快速部署. docker应用环境的集成是通过一层一层的镜像叠加实现的,这种方式可以使得底层镜像多次复用,结构清晰.这里不赘述docker的具体实现原理,实战过后想来都会有一些理解.</p>
<h2 id="docker安装"><a href="#docker安装" class="headerlink" title="docker安装"></a>docker安装</h2><p>========</p>
<p>不同的linux系统安装docker会有些许不同,新版的redhat和centos7自带有docker包,直接安装即可.具体参考:<a href="http://www.cnblogs.com/garfieldcgf/p/5466137.html" target="_blank" rel="noopener">docker安装</a> ubuntu14.04 docker:<br><figure class="highlight q"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt-<span class="built_in">get</span> <span class="keyword">update</span></span><br></pre></td></tr></table></figure></p>
<p>安装所有必须和可选的包<br><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt-<span class="built_in">get</span> install linux-<span class="built_in">image</span>-generic-lts-trusty</span><br></pre></td></tr></table></figure></p>
<p>重启系统<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo reboot</span><br></pre></td></tr></table></figure></p>
<p>查看你是否安装了wget<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> <span class="built_in">which</span> wget</span></span><br></pre></td></tr></table></figure></p>
<p>如果wget没有安装,先升级包管理器,然后再安装它。<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt-<span class="builtin-name">get</span> update $ sudo apt-<span class="builtin-name">get</span> install wget</span><br></pre></td></tr></table></figure></p>
<p>获取最新版本的 Docker 安装包<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ wget -qO- http<span class="variable">s:</span>//<span class="built_in">get</span>.docker.<span class="keyword">com</span>/ | <span class="keyword">sh</span></span><br></pre></td></tr></table></figure></p>
<p>系统会提示你输入sudo密码,输入完成之后,就会下载脚本并且安装Docker及依赖包。 验证 Docker 是否被正确的安装<br><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo docker <span class="keyword">run</span><span class="bash"> hello-world</span></span><br></pre></td></tr></table></figure></p>
<p>上边的命令会下载一个测试镜像,并在容器内运行这个镜像。 正常情况下以下内容可以不看 Ubuntu Docker可选配置 这部分主要介绍了 Docker 的可选配置项,使用这些配置能够让 Docker 在 Ubuntu 上更好的工作。 创建 Docker 用户组 调整内存和交换空间(swap accounting) 启用防火墙的端口转发(UFW) 为 Docker 配置DNS服务 创建 Docker 用户组 docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于root用户,当然其他用户可以使用sudo方式来访问。因为这个原因, docker 进程就一直是root用户运行的。 为了在使用 docker 命令的时候前边不再加sudo,我们需要创建一个叫 docker 的用户组,并且为用户组添加用户。然后在 docker 进程启动的时候,我们的 docker 群组有了 Unix Socket 的所有权,可以对 Socket 文件进行读写。 注意:docker 群组就相当于root用户。有关系统安全影响的细节,请查看 Docker 进程表面攻击细节 创建 docker 用户组并添加用户 使用具有sudo权限的用户来登录你的Ubuntu。 在这过程中,我们假设你已经登录了Ubuntu。 创建 docker 用户组并添加用户。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo usermod -aG docker ubuntu</span><br></pre></td></tr></table></figure></p>
<p>注销登录并重新登录 这里要确保你运行用户的权限。 验证 docker 用户不使用 sudo 命令开执行 Docker<br><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker <span class="keyword">run</span><span class="bash"> hello-world</span></span><br></pre></td></tr></table></figure></p>
<p>调整内存和交换空间(swap accounting) 当我们使用 Docker 运行一个镜像的时候,我们可能会看到如下的信息提示:<br><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">WARNING: </span>Your kernel does not support cgroup swap limit. WARNING: Your</span><br><span class="line">kernel does not support swap limit capabilities. Limitation discarded.</span><br></pre></td></tr></table></figure></p>
<p>为了防止以上错误信息提示的出现,我们需要在系统中启用内存和交换空间。我们需要修改系统的 GUN GRUB (GNU GRand Unified Bootloader) 来启用内存和交换空间。开启方法如下: 使用具有sudo权限的用户来登录你的Ubuntu。 编辑 /etc/default/grub 文件 设置 GRUB_CMDLINE_LINUX 的值如下:<br><figure class="highlight sqf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GRUB\<span class="variable">_CMDLINE</span>\<span class="variable">_LINUX</span>=<span class="string">"cgroup_enable=memory swapaccount=1"</span></span><br></pre></td></tr></table></figure></p>
<p>保存和关闭文件 更新 GRUB<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo update-grub</span><br></pre></td></tr></table></figure></p>
<p>重启你的系统。 允许UFW端口转发 当你在运行 docker 的宿主主机上使用UFW(简单的防火墙)。你需要做一些额外的配置。Docker 使用桥接的方式来管理网络。默认情况下,UFW 过滤所有的端口转发策略。因此,当在UFW启用的情况下使用 docker ,你必须适当的设置UFW的端口转发策略。 默认情况下UFW是过滤掉所有的入站规则。如果其他的主机能够访问你的容器。你需要允许Docker的默认端口(2375)的所有连接。 设置 UFW 允许Docker 端口的入站规则: 使用具有sudo权限的用户来登录你的Ubuntu。 验证UFW的安装和启用状态<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo ufw status</span><br></pre></td></tr></table></figure></p>
<p>打开和编辑/etc/default/ufw文件<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo nano <span class="regexp">/etc/</span><span class="keyword">default</span><span class="regexp">/ufw</span></span><br></pre></td></tr></table></figure></p>
<p>设置 DEFAULT_FORWARD_POLICY 如下:<br><figure class="highlight sqf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DEFAULT</span>\<span class="variable">_FORWARD</span>\<span class="variable">_POLICY</span>=<span class="string">"ACCEPT"</span></span><br></pre></td></tr></table></figure></p>
<p>保存关闭文件。 重新加载UFW来使新规则生效。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo ufw reload</span><br></pre></td></tr></table></figure></p>
<p>允许 Docker 端口的入站规则<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo ufw allow <span class="number">2375</span>/tcp</span><br></pre></td></tr></table></figure></p>
<h2 id="Docker-配置-DNS-服务"><a href="#Docker-配置-DNS-服务" class="headerlink" title="Docker 配置 DNS 服务"></a>Docker 配置 DNS 服务</h2><p>================</p>
<p>无论是Ubuntu还是Ubuntu 桌面繁衍版在系统运行的时候都是使用/etc/resolv.conf配置文件中的127.0.0.1作为域名服务器(nameserver)。NetworkManager设置dnsmasq使用真实的dns服务器连接,并且设置 /etc/resolv.conf的域名服务为127.0.0.1。 在桌面环境下使用这些配置来运行 docker 容器的时候, Docker 用户会看到如下的警告:<br><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">WARNING: </span>Local (127.0.0.1) DNS resolver found in resolv.conf and containers</span><br><span class="line">can't use it. Using default external servers : \[8.8.8.8 8.8.4.4\]</span><br></pre></td></tr></table></figure></p>
<p>该警告是因为 Docker 容器不能使用本地的DNS服务。相反 Docker 使用一个默认的外部域名服务器。 为了避免此警告,你可以给 Docker 容器指定一个DNS服务器。或者你可以禁用 NetworkManager 的 dnsmasq。不过当禁止 dnsmasq 可能使某些网络的DNS解析速度变慢。 为 Docker 指定一个DNS服务器 使用具有sudo权限的用户来登录你的Ubuntu。 打开并编辑 /etc/default/docker<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo nano <span class="regexp">/etc/</span><span class="keyword">default</span><span class="regexp">/docker</span></span><br></pre></td></tr></table></figure></p>
<p>添加设置<br><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">DOCKER_OPTS</span>=<span class="string">"--dns 8.8.8.8"</span></span><br></pre></td></tr></table></figure></p>
<p>使用8.8.8.8替换如192.168.1.1的本地DNS服务器。你可以指定多个DNS服务器,多个DNS服务器使用空格分割例如<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">--dns</span> 8<span class="selector-class">.8</span><span class="selector-class">.8</span><span class="selector-class">.8</span> <span class="selector-tag">--dns</span> 192<span class="selector-class">.168</span><span class="selector-class">.1</span><span class="selector-class">.1</span></span><br></pre></td></tr></table></figure></p>
<p>警告:如果你正在使用的电脑需要连接到不同的网络,一定要选择一个公共DNS服务器。 保存关闭文件。 重启 Docker 进程<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo restart docker</span><br></pre></td></tr></table></figure></p>
<p>或者,作为替代先前的操作过程,禁止NetworkManager中的dnsmasq(这样会使你的网络变慢) 打开和编辑 /etc/default/docker<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo nano <span class="regexp">/etc/</span>NetworkManager<span class="regexp">/NetworkManager.conf</span></span><br></pre></td></tr></table></figure></p>
<p>注释掉 dns = dsnmasq: 保存关闭文件 重启NetworkManager 和 Docker<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>sudo restart network-manager <span class="variable">$ </span>sudo restart docker</span><br></pre></td></tr></table></figure></p>
<h2 id="升级Docker"><a href="#升级Docker" class="headerlink" title="升级Docker"></a>升级Docker</h2><p>========</p>
<p>在wget的时候使用-N参数来安装最新版本的Docker:<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ wget -<span class="keyword">N</span> http<span class="variable">s:</span>//<span class="built_in">get</span>.docker.<span class="keyword">com</span>/ | <span class="keyword">sh</span></span><br></pre></td></tr></table></figure></p>
<p>正常情况下以上内容可以不看 安装镜像方法一</p>
<h2 id="下载镜像"><a href="#下载镜像" class="headerlink" title="下载镜像"></a>下载镜像</h2><p>首先,访问 Docker 中文网,在首页中搜索名为“centos”的镜像,在搜索的结果中,有一个“官方镜像”,它就是我们所需的。 然后,进入 CentOS 官方镜像页面,在“Pull this repository”输入框中,有一段命令,把它复制下来,在自己的命令行上运行该命令,随后将立即下载该镜像。 查看本地所有的镜像:<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">docker images</span></span><br></pre></td></tr></table></figure></p>
<p>当下载完成后,您应该会看到:<br><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">REPOSITORY <span class="keyword">TAG</span> <span class="title">IMAGE</span> ID CREATED VIRTUAL SIZE</span><br><span class="line">docker.cn/docker/centos centos6 <span class="number">25</span>c5298b1a36 <span class="number">7</span> weeks ago <span class="number">215.8</span> MB</span><br></pre></td></tr></table></figure></p>
<p>如果看到以上输出,说明您可以使用“docker.cn/docker/centos”这个镜像了,或将其称为仓库(Repository),该镜像有一个名为“centos6”的标签(Tag),此外还有一个名为“25c5298b1a36 ”的镜像 ID(可能您所看到的镜像 ID 与此处的不一致,那是正常现象,因为这个数字是随机生成的)。此外,我们可以看到该镜像只有 215.8 MB,非常小巧,而不像虚拟机的镜像文件那样庞大。 现在镜像已经有了,我们下面就需要使用该镜像,来启动容器。</p>
<h2 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h2><p>只需使用以下命令即可启动容器:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -i -t -v /root/software/<span class="symbol">:/mnt/software/</span> <span class="number">25</span>c5298b1a36 /bin/bash</span><br></pre></td></tr></table></figure></p>
<p>这条命令比较长,我们稍微分解一下,其实包含以下三个部分: docker run <相关参数> <镜像 ID> <初始命令> 其中,相关参数包括: -i:表示以“交互模式”运行容器 -t:表示容器启动后会进入其命令行 -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录> 假设我们的所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。 需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6。 初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。</p>
<h2 id="安装相关软件"><a href="#安装相关软件" class="headerlink" title="安装相关软件"></a>安装相关软件</h2><p>为了搭建 Java Web 运行环境,我们需要安装 JDK 与 Tomcat,下面的过程均在容器内部进行。我们不妨选择/opt/目录作为安装目录,首先需要通过cd /opt/命令进入该目录</p>
<h2 id="安装-JDK"><a href="#安装-JDK" class="headerlink" title="安装 JDK"></a>安装 JDK</h2><p>首先,解压 JDK 程序包:<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -zxf /mnt/software/jdk-<span class="number">7</span>u67-linux-x64<span class="selector-class">.tar</span><span class="selector-class">.gz</span> -C .</span><br></pre></td></tr></table></figure></p>
<p>然后,重命名 JDK 目录:<br><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mv jdk1<span class="number">.7</span><span class="number">.0</span>_67/ jdk/</span><br></pre></td></tr></table></figure></p>
<h2 id="安装-Tomcat"><a href="#安装-Tomcat" class="headerlink" title="安装 Tomcat"></a>安装 Tomcat</h2><p>首先,解压 Tomcat 程序包:<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -zxf /mnt/software/apache-tomcat-<span class="number">7.0</span>.<span class="number">55</span><span class="selector-class">.tar</span><span class="selector-class">.gz</span> -C .</span><br></pre></td></tr></table></figure></p>
<p>然后,重命名 Tomcat 目录:<br><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mv apache-tomcat<span class="number">-7.0</span><span class="number">.55</span>/ tomcat/</span><br></pre></td></tr></table></figure></p>
<h2 id="设置环境变量"><a href="#设置环境变量" class="headerlink" title="设置环境变量"></a>设置环境变量</h2><p>首先,编辑.bashrc文件<br><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~<span class="string">/.bashrc</span></span><br></pre></td></tr></table></figure></p>
<p>然后,在该文件末尾添加如下配置:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="builtin-name">export</span> <span class="attribute">JAVA_HOME</span>=/opt/jdk</span><br><span class="line"><span class="builtin-name">export</span> <span class="attribute">PATH</span>=<span class="variable">$PATH</span>:$JAVA_HOME</span><br></pre></td></tr></table></figure></p>
<p>最后,需要使用source命令,让环境变量生效:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure></p>
<h2 id="编写运行脚本"><a href="#编写运行脚本" class="headerlink" title="编写运行脚本"></a>编写运行脚本</h2><p>我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下: 首先,创建运行脚本:<br><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /root/<span class="keyword">run</span>.<span class="bash">sh</span></span><br></pre></td></tr></table></figure></p>
<p>然后,编辑脚本内容如下:<br><figure class="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><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line">sh /opt/tomcat/bin/catalina.sh run</span><br></pre></td></tr></table></figure></p>
<p>注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。 最后,为运行脚本添加执行权限:<br><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod u+x /root/<span class="keyword">run</span>.<span class="bash">sh</span></span><br></pre></td></tr></table></figure></p>
<h2 id="退出容器"><a href="#退出容器" class="headerlink" title="退出容器"></a>退出容器</h2><hr>
<p>当以上步骤全部完成后,可使用exit命令,退出容器。 随后,可使用如下命令查看正在运行的容器:<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">docker ps</span></span><br></pre></td></tr></table></figure></p>
<p>此时,您应该看不到任何正在运行的程序,因为刚才已经使用exit命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">docker ps -a</span></span><br></pre></td></tr></table></figure></p>
<p>输出如下内容:<br><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line"><span class="number">57</span>c312bbaad1 docker.cn<span class="regexp">/docker/</span><span class="string">centos:</span>centos6 <span class="string">"/bin/bash"</span> <span class="number">27</span> minutes ago Exited (<span class="number">0</span>) <span class="number">19</span> seconds ago naughty_goldstine</span><br></pre></td></tr></table></figure></p>
<p>记住以上CONTAINER ID(容器 ID),随后我们将通过该容器,创建一个可运行 Java Web 的镜像。 创建 Java Web 镜像 使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">docker</span> <span class="selector-tag">commit</span> 57<span class="selector-tag">c312bbaad1</span> <span class="selector-tag">javaweb</span><span class="selector-pseudo">:0.1</span></span><br></pre></td></tr></table></figure></p>
<p>该容器的 ID 是“57c312bbaad1”,所创建的镜像名是“javaweb:0.1”,随后可使用镜像来启动 Java Web 容器。 启动 Java Web 容器 有必要首先使用docker images命令,查看当前所有的镜像:<br><figure class="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></pre></td><td class="code"><pre><span class="line">REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE</span><br><span class="line">javaweb <span class="number">0.1</span> fc826a4706af <span class="number">38</span> seconds ago <span class="number">562.8</span> MB</span><br><span class="line">docker.cn/docker/centos centos6 <span class="number">25</span>c5298b1a36 <span class="number">7</span> weeks ago <span class="number">215.8</span> MB</span><br></pre></td></tr></table></figure></p>
<p>可见,此时已经看到了最新创建的镜像“javaweb:0.1”,其镜像 ID 是“fc826a4706af”。正如上面所描述的那样,我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:<br><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="keyword">run</span> -<span class="keyword">d</span> -p 58080:8080 --name javaweb javaweb:0.1 /root/<span class="keyword">run</span>.<span class="keyword">sh</span></span><br></pre></td></tr></table></figure></p>
<p>稍作解释: -d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。 -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。 –name:表示容器名称,用一个有意义的名称命名即可。 关于 Docker 网桥的内容,需要补充说明一下。实际上 Docker 在宿主机与容器之间,搭建了一座网络通信的桥梁,我们可通过宿主机 IP 地址与端口号来映射容器内部的 IP 地址与端口号, 当运行以上命令后,会立即输出一长串“容器 ID”,我们可通过docker ps命令来查看当前正在运行的容器。<br><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">82f47923f926 javaweb:<span class="number">0.1</span> <span class="string">"/root/run.sh"</span> <span class="number">4</span> seconds ago <span class="meta">Up</span> <span class="number">3</span> seconds <span class="number">0.0</span><span class="meta">.0</span><span class="meta">.0</span>:<span class="number">58080</span>-><span class="number">8080</span>/tcp javaweb</span><br></pre></td></tr></table></figure></p>
<p>在浏览器中,输入以下地址,即可访问 Tomcat 首页: <a href="http://192.168.65.132:58080/" target="_blank" rel="noopener">http://192.168.65.132:58080/</a> 注意:这里使用的是宿主机的 IP 地址,与对外暴露的端口号 58080,它映射容器内部的端口号 8080。 由于我测试的虚拟机采用nat映射连接,如果采用这种方法测试则需要重新将58080端口映射到宿主主机才能够访问 安装镜像方法二 导入镜像centos7: docker load -i centos7 导入本地仓库 编写安装jdk的Dockerfile</p>
<h2 id="dockerfile语法"><a href="#dockerfile语法" class="headerlink" title="dockerfile语法"></a>dockerfile语法</h2><hr>
<figure class="highlight dockerfile"><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><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">Dockerfile关键字</span><br><span class="line"></span><br><span class="line">\<span class="comment"># CommentINSTRUCTION arguments</span></span><br><span class="line"><span class="keyword">FROM</span></span><br><span class="line">基于哪个镜像</span><br><span class="line"></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"></span></span><br><span class="line"><span class="bash">安装软件用</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">MAINTAINER</span></span><br><span class="line"><span class="bash">镜像创建者</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">CMD</span></span><br><span class="line"><span class="bash">container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">CMD主要用于container时启动指定的服务,当docker run <span class="built_in">command</span>的命令匹配到CMD <span class="built_in">command</span>时,会替换CMD执行的命令。如:</span></span><br><span class="line"><span class="bash">Dockerfile:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">CMD <span class="built_in">echo</span> hello world</span></span><br><span class="line"><span class="bash">运行一下试试:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd</span></span><br><span class="line"><span class="bash">hello world</span></span><br><span class="line"><span class="bash">一旦命令匹配:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd <span class="built_in">echo</span> hello edwardsbean</span></span><br><span class="line"><span class="bash">hello edwardsbean</span></span><br><span class="line"><span class="bash">ENTRYPOINT</span></span><br><span class="line"><span class="bash">container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ENTRYPOINT没有CMD的可替换特性</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">USER</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">使用哪个用户跑container</span></span><br><span class="line"><span class="bash">如:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ENTRYPOINT \[<span class="string">"memcached"</span>\]</span></span><br><span class="line"><span class="bash">USER daemon</span></span><br><span class="line"><span class="bash">EXPOSE</span></span><br><span class="line"><span class="bash">container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">docker run -d -p 127.0.0.1:33301:22 centos6-ssh</span></span><br><span class="line"><span class="bash">container ssh服务的22端口被映射到主机的33301端口</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ENV</span></span><br><span class="line"><span class="bash">用来设置环境变量,比如:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ENV LANG en\_US.UTF-8 ENV LC\_ALL en_US.UTF-8</span></span><br><span class="line"><span class="bash">ADD</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">将文件<src>拷贝到container的文件系统对应的路径<dest></span></span><br><span class="line"><span class="bash">所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0</span></span><br><span class="line"><span class="bash">如果文件是可识别的压缩格式,则docker会帮忙解压缩</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">docker build github.com/creack/docker-firefox</span></span><br><span class="line"><span class="bash">docker-firefox目录下必须有Dockerfile和要ADD的文件</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file.</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">VOLUME</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">可以将本地文件夹或者其他container的文件夹挂载到container中。</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">WORKDIR</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">切换目录用,可以多次切换(相当于<span class="built_in">cd</span>命令),对RUN,CMD,ENTRYPOINT生效</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ONBUILD</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行</span></span><br></pre></td></tr></table></figure>
<h2 id="dockerfile语法-1"><a href="#dockerfile语法-1" class="headerlink" title="dockerfile语法"></a>dockerfile语法</h2><p>============</p>
<p>脚本1<br><figure class="highlight clean"><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><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">\# Version: <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">\# Create Time: <span class="number">2015</span><span class="number">-10</span><span class="number">-16</span> <span class="number">09</span>:<span class="number">04</span></span><br><span class="line">\# Author: baibai</span><br><span class="line">\# Description: 在最新版本的ubuntu系统中安装jdk,构建可执行java的环境</span><br><span class="line"></span><br><span class="line">FROM index.tenxcloud.com/tenxcloud/ubuntu:latest </span><br><span class="line">MAINTAINER Li Siqi <span class="string">"[email protected]"</span></span><br><span class="line"></span><br><span class="line">\# 将jdk安装压缩包解压到/home/jdk1<span class="number">.8</span><span class="number">.0</span>_51</span><br><span class="line">ADD jdk<span class="number">-8</span>u51-linux-x64.tar.gz /home/</span><br><span class="line"></span><br><span class="line">\# 安装中文语言包</span><br><span class="line">#RUN locale-gen zh_CN.UTF<span class="number">-8</span></span><br><span class="line"></span><br><span class="line">\# 设置java环境变量</span><br><span class="line">ENV JAVA\_HOME /home/jdk1<span class="number">.8</span><span class="number">.0</span>\_51</span><br><span class="line">ENV CLASSPATH .:$JAVA\_HOME/lib/dt.jar:$JAVA\_HOME/lib/tools.jar</span><br><span class="line">ENV PATH $PATH:$JAVA_HOME/bin</span><br><span class="line"></span><br><span class="line">\# 设置语言环境变量</span><br><span class="line">ENV LANG zh_CN.UTF<span class="number">-8</span></span><br><span class="line">ENV LANGUAGE zh_CN:zh</span><br><span class="line">###########脚本###########################</span><br><span class="line">运行命令</span><br><span class="line">docker build -t 自定义名称 路径</span><br><span class="line">生成一个镜像</span><br><span class="line">docker images 查看当前所有镜像</span><br><span class="line">接下来用同样的方式运行tomcat</span><br><span class="line">###########脚本###########################</span><br><span class="line">\# Version: <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">\# Create Time: <span class="number">2015</span><span class="number">-12</span><span class="number">-25</span> <span class="number">11</span>:<span class="number">04</span></span><br><span class="line">\# Author: Lin Nan</span><br><span class="line"></span><br><span class="line">\# 基于已经配置好的jdk1<span class="number">.8</span>版本进行操作</span><br><span class="line">FROM jdk:latest</span><br><span class="line">MAINTAINER Li Nan <<span class="number">593158016</span>@qq.com></span><br><span class="line"></span><br><span class="line">\# 创建目录</span><br><span class="line">#RUN mkdir -p -m <span class="number">777</span> /home</span><br><span class="line"></span><br><span class="line">\# 将context中的压缩包迁移到容器中并解压</span><br><span class="line">ADD tomcat8.tar.gz /home/tomcat8/</span><br><span class="line"></span><br><span class="line">\# 暴露文件目录</span><br><span class="line">#VOLUME \[<span class="string">"/home/docker/file/distfirstout"</span>, <span class="string">"/home/docker/file/input/D001"</span>\]</span><br><span class="line">#VOLUME \[<span class="string">"/app/tomcat8/webapps/"</span>\]</span><br><span class="line"></span><br><span class="line">\# 暴露网络端口</span><br><span class="line">EXPOSE <span class="number">8881</span></span><br><span class="line"></span><br><span class="line">\# 启动服务</span><br><span class="line">ENTRYPOINT \[<span class="string">"/home/tomcat8/apache-tomcat-8.0.24/bin/catalina.sh"</span>, <span class="string">"run"</span>\]</span><br></pre></td></tr></table></figure></p>
<p>脚本2</p>
<figure class="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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">执行命令 docker build <span class="attribute">--no-cache</span>=<span class="literal">true</span> -t tomcat8 路径</span><br><span class="line"></span><br><span class="line">docker <span class="builtin-name">run</span> -d -p 8881:8080 <span class="attribute">--name</span>=tomcat8 tomcat8</span><br></pre></td></tr></table></figure>
<p>安装镜像方法二结束 完</p>
<h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h2><hr>
<figure class="highlight sql"><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><span class="line">docker images 查看镜像</span><br><span class="line">docker ps 查看容器</span><br><span class="line">docker ps -a 查看所有容器,包括没有运行的</span><br><span class="line">docker rm 删除容器</span><br><span class="line">docker rmi 删除镜像</span><br><span class="line">docker build 新建镜像</span><br><span class="line">docker run 运行容器</span><br><span class="line">docker <span class="keyword">stop</span> 停止容器</span><br><span class="line">docker <span class="keyword">logs</span> 查看日志</span><br><span class="line">docker <span class="keyword">load</span> 导入镜像</span><br><span class="line">docker <span class="keyword">save</span> 导出镜像</span><br><span class="line">docker <span class="keyword">commit</span> 容器生成镜像</span><br></pre></td></tr></table></figure>
<p>用一行命令大扫除:<br><figure class="highlight gcode"><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><span class="line">docker kill $<span class="comment">(docker ps -q)</span> ; </span><br><span class="line">docker rm $<span class="comment">(docker ps -a -q)</span> ; </span><br><span class="line">docker rmi $<span class="comment">(docker images -q -a)</span></span><br></pre></td></tr></table></figure></p>
</div>
<div>
<ul class="post-copyright">
<li class="post-copyright-author">
<strong>本文作者:</strong>
小蜜蜂
</li>
<li class="post-copyright-link">
<strong>本文链接:</strong>
<a href="https://zyb0408.github.io/2016-03-13-docker入门实战笔记.html" title="docker入门实战笔记">https://zyb0408.github.io/2016-03-13-docker入门实战笔记.html</a>
</li>
<li class="post-copyright-license">
<strong>版权声明: </strong>
本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/" rel="external nofollow" target="_blank">CC BY-NC-SA 3.0</a> 许可协议。转载请注明出处!
</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-tags">
<a href="/tags/docker/" rel="tag"># docker</a>
</div>
<div class="post-nav">
<div class="post-nav-next post-nav-item">
<a href="/2016-03-02-Nginx负载均衡.html" rel="next" title="Nginx负载均衡">
<i class="fa fa-chevron-left"></i> Nginx负载均衡
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
<a href="/2016-03-28-Docker-Nginx.html" rel="prev" title="Docker-Nginx">
Docker-Nginx <i class="fa fa-chevron-right"></i>
</a>
</div>
</div>
</footer>
</div>
</article>
<div class="post-spread">
</div>
</div>
</div>
</div>
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
文章目录
</li>
<li class="sidebar-nav-overview" data-target="site-overview-wrap">
站点概览
</li>
</ul>
<section class="site-overview-wrap sidebar-panel">
<div class="site-overview">
<div class="site-author motion-element" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" src="/images/favicon-32x32-next.png" alt="小蜜蜂">
<p class="site-author-name" itemprop="name">小蜜蜂</p>
<p class="site-description motion-element" itemprop="description">小蜜蜂学计算机</p>
</div>
<nav class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">52</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<a href="/categories/index.html">
<span class="site-state-item-count">18</span>
<span class="site-state-item-name">分类</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/index.html">
<span class="site-state-item-count">22</span>
<span class="site-state-item-name">标签</span>
</a>
</div>
</nav>
<div class="links-of-author motion-element">
<span class="links-of-author-item">
<a href="https://github.com/zyb0408" target="_blank" title="GitHub">
<i class="fa fa-fw fa-github"></i>GitHub</a>
</span>
</div>
<div class="links-of-blogroll motion-element links-of-blogroll-block">
<div class="links-of-blogroll-title">
<i class="fa fa-fw fa-link"></i>
Links
</div>
<ul class="links-of-blogroll-list">
<li class="links-of-blogroll-item">
<a href="https://dhupxd.github.io" title="学姐" target="_blank">学姐</a>
</li>
<li class="links-of-blogroll-item">
<a href="https://ztt001.github.io" title="学妹" target="_blank">学妹</a>
</li>
</ul>
</div>
</div>
</section>
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
<div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#什么是docker?"><span class="nav-number">1.</span> <span class="nav-text">什么是docker?</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#docker安装"><span class="nav-number">2.</span> <span class="nav-text">docker安装</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Docker-配置-DNS-服务"><span class="nav-number">3.</span> <span class="nav-text">Docker 配置 DNS 服务</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#升级Docker"><span class="nav-number">4.</span> <span class="nav-text">升级Docker</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#下载镜像"><span class="nav-number">5.</span> <span class="nav-text">下载镜像</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#启动容器"><span class="nav-number">6.</span> <span class="nav-text">启动容器</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#安装相关软件"><span class="nav-number">7.</span> <span class="nav-text">安装相关软件</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#安装-JDK"><span class="nav-number">8.</span> <span class="nav-text">安装 JDK</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#安装-Tomcat"><span class="nav-number">9.</span> <span class="nav-text">安装 Tomcat</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#设置环境变量"><span class="nav-number">10.</span> <span class="nav-text">设置环境变量</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#编写运行脚本"><span class="nav-number">11.</span> <span class="nav-text">编写运行脚本</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#退出容器"><span class="nav-number">12.</span> <span class="nav-text">退出容器</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#dockerfile语法"><span class="nav-number">13.</span> <span class="nav-text">dockerfile语法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#dockerfile语法-1"><span class="nav-number">14.</span> <span class="nav-text">dockerfile语法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#常用命令"><span class="nav-number">15.</span> <span class="nav-text">常用命令</span></a></li></ol></div>
</div>
</section>
<!--/noindex-->
</div>
</aside>
</div>
</main>
<footer id="footer" class="footer">
<div class="footer-inner">
<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<div class="copyright">© 2017 — <span itemprop="copyrightYear">2019</span>
<span class="with-love">
<i class="fa fa-user"></i>
</span>
<span class="author" itemprop="copyrightHolder">小蜜蜂</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-area-chart"></i>
</span>
<span class="post-meta-item-text">Site words total count:</span>
<span title="Site words total count">88.8k</span>
</div>
<div class="powered-by">
<i class="fa fa-user-md"></i><span id="busuanzi_container_site_uv">
本站访客数:<span id="busuanzi_value_site_uv"></span>
</span>
</div>
<script>
var seconds = 1000;
var minutes = seconds * 60;
var hours = minutes * 60;
var days = hours * 24;
var years = days * 365;
var birthDay = Date.UTC(2017,09,17,00,00,00); // 这里设置建站时间
setInterval(function() {
var today = new Date();
var todayYear = today.getFullYear();
var todayMonth = today.getMonth()+1;
var todayDate = today.getDate();
var todayHour = today.getHours();
var todayMinute = today.getMinutes();
var todaySecond = today.getSeconds();
var now = Date.UTC(todayYear,todayMonth,todayDate,todayHour,todayMinute,todaySecond);
var diff = now - birthDay;
var diffYears = Math.floor(diff/years);
var diffDays = Math.floor((diff/days)-diffYears*365);
var diffHours = Math.floor((diff-(diffYears*365+diffDays)*days)/hours);
var diffMinutes = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours)/minutes);
var diffSeconds = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours-diffMinutes*minutes)/seconds);
document.getElementById('showDays').innerHTML="本站已运行 "+diffYears+" 年 "+diffDays+" 天 "+diffHours+" 小时 "+diffMinutes+" 分钟 "+diffSeconds+" 秒";
}, 1000);
</script>
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
<div class="busuanzi-count">
<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<span class="site-uv">
<i class="fa fa-user"></i>
<span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
</span>
<span class="site-pv">
<i class="fa fa-eye"></i>
<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
</span>
</div>
</div>
</footer>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span id="scrollpercent"><span>0</span>%</span>
</div>
</div>
<script type="text/javascript">
if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
window.Promise = null;
}
</script>
<script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
<script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
<script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
<script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
<script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
<script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
<script type="text/javascript" src="/lib/canvas-nest/canvas-nest.min.js"></script>
<script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>
<script type="text/javascript">
// Popup Window;
var isfetched = false;
var isXml = true;
// Search DB path;
var search_path = "search.xml";
if (search_path.length === 0) {
search_path = "search.xml";
} else if (/json$/i.test(search_path)) {
isXml = false;
}
var path = "/" + search_path;
// monitor main search box;
var onPopupClose = function (e) {
$('.popup').hide();
$('#local-search-input').val('');