88 Commits

Author SHA1 Message Date
yeasy
59da0ff5ad Merge pull request #25 from philipz/master
From 台灣繁體版
2014-11-25 11:49:31 +08:00
philipz
51c7819ce1 Merge pull request #19 from ensky/fix-cntw
修正多個用詞
2014-11-24 23:06:32 +08:00
Ensky Lin
a795bf863a 修正多個用詞
"s/程序/程式/g" "s/性能/效能/g" "s/如下/以下/g" "s/加載/載入/g" "s/獲取/取得/g" "s/服務器/伺服器/g" "s/信息/訊息/g" "s/註釋/註解/g" "s/裏/裡/g" "s/構建/建立/g" "s/配置/設定/g"
2014-11-24 22:54:30 +08:00
Ensky Lin
9d0330915d 修正多個用詞 2014-11-24 22:37:20 +08:00
philipz
4789287f30 Merge pull request #17 from pcedison/master
修改第三、第五章用詞
2014-11-24 08:16:22 +08:00
philipz
8b9dbd74c5 Merge pull request #18 from suensummit/develop
replace terms (with R)
2014-11-24 08:15:19 +08:00
Marcus
44b5532042 修正多個用詞 2014-11-24 02:49:38 +08:00
Marcus
291217dd58 修改名詞 2014-11-24 02:39:47 +08:00
Marcus
fe155633ec 模塊->模組,存儲->儲存,默認->預設,變量->變數 2014-11-24 02:38:56 +08:00
Marcus
2b44ab2f6b 鏡像->映像檔,服務器->伺服器,批量->批次,訪問->連結,源碼->原始碼 2014-11-24 02:27:10 +08:00
Marcus
b3bcdf7166 鏡像-> 映像檔, 服務器->伺服器 2014-11-24 02:14:50 +08:00
Marcus
bf8719d551 修飾用詞 2014-11-24 01:39:07 +08:00
Marcus
05cfded4e1 修飾用詞 2014-11-24 01:35:54 +08:00
Summit Suen
ba64651d59 replace terms 2014-11-23 02:13:46 +08:00
Marcus
2c4ede2b99 修飾用詞 2014-11-22 15:36:09 +08:00
Marcus
b14f5217f1 修飾用詞 2014-11-22 15:32:36 +08:00
Marcus
73dd27f79e 修飾用詞 2014-11-22 15:25:43 +08:00
Marcus
237130150b 潤飾一些用詞 2014-11-22 15:13:30 +08:00
Marcus
17d03df446 對應的->換句話說 2014-11-22 14:59:47 +08:00
Marcus
8aa09dd966 源->套件庫, 自帶->內建 2014-11-22 14:55:29 +08:00
Marcus
dbfa8c8b82 源->套件庫 2014-11-22 14:52:37 +08:00
philipz
b19309a9c2 replace '鏡像' as '映像檔' 2014-11-22 01:01:45 +08:00
philipz
8723a52ebc replace '鏡像' as '映像檔' 2014-11-22 01:00:43 +08:00
philipz
ac2661cbd5 Merge pull request #15 from pcedison/master
第一、二章名詞修正
2014-11-22 00:52:32 +08:00
Marcus
686b3427a6 鏡像 -> 映像檔 2014-11-21 16:28:36 +08:00
Marcus
6215bd5b02 鏡像 -> 映像檔 2014-11-21 16:25:41 +08:00
Marcus
d25a602382 鏡像 -> 映像檔 2014-11-21 16:24:39 +08:00
Marcus
3d485d0432 鏡像 -> 映像檔 2014-11-21 16:22:28 +08:00
Marcus
86438891e0 鏡像->映像檔 2014-11-21 16:20:04 +08:00
Marcus
6dc91f4153 修改用詞、潤飾 2014-11-21 16:16:25 +08:00
philipz
4e1f82eee6 Fix word 2014-11-20 14:12:07 +08:00
philipz
6f4669c26c Merge pull request #14 from suensummit/develop
fix README.md
2014-11-20 14:10:20 +08:00
Summit Suen
9651db6a34 fix README.md 2014-11-20 13:18:03 +08:00
philipz
439d569c8b Merge pull request #12 from jasteralan/develop
Translate Dockerfile Chapter
2014-11-20 12:57:55 +08:00
jaster.chung@hwtrek.com
d090630f7f Translate Dockerfile chapter 2014-11-20 10:30:45 +08:00
philipz
939e98b040 Merge pull request #10 from a504082002/master
replace some words
2014-11-20 08:58:53 +08:00
a504082002
893e0f8bb7 replace '網絡' as '網路' 2014-11-20 01:06:47 +08:00
a504082002
d24b44076b replace '進程' as '程序' 2014-11-20 01:05:42 +08:00
a504082002
45acb9c3c3 replace '運行' as '執行' 2014-11-20 01:04:25 +08:00
a504082002
0f699adab0 replace '只讀' as '唯讀' 2014-11-20 01:03:05 +08:00
a504082002
d4ba34df99 merge master and develop 2014-11-20 00:59:41 +08:00
a504082002
3741994aef replace '操作系統' as '作業系統' 2014-11-20 00:09:22 +08:00
philipz
4a288084e1 Merge pull request #9 from laneser/master
translate readme, list, pull of image chapter.
2014-11-19 22:49:25 +08:00
lane
7a3b6fe171 translate readme, list, pull of image chapter. 2014-11-19 17:58:04 +08:00
lane
20289b49fc fix terms in container chapter. 2014-11-19 11:23:42 +08:00
philipz
5799061793 Merge pull request #7 from laneser/master
translate basic concept to traditional chinese
2014-11-19 11:16:51 +08:00
philipz
88950a428c Fix Github URL 2014-11-19 10:44:48 +08:00
lane
c21fd41952 translate basic concept to traditional chinese 2014-11-19 10:42:21 +08:00
philipz
1b900e1281 Fix contributors of README 2014-11-19 10:05:04 +08:00
philipz
fb1a111705 Update README.md 2014-11-19 09:55:29 +08:00
philipz
0fab5a33c8 Merge pull request #5 from laneser/master
translate install to traditional chinese
2014-11-19 09:16:34 +08:00
philipz
82845dbfb2 Merge pull request #4 from ChihChengLiang/master
summary translated
2014-11-19 09:16:26 +08:00
philipz
acdd28a5c6 Merge pull request #3 from suensummit/develop
update: /dockerfile/build_image.md
2014-11-19 09:16:06 +08:00
a504082002
6b168bced1 translate underly into traditional chinese 2014-11-19 01:03:13 +08:00
a504082002
cb4963b8fa translate security into traditional chinese 2014-11-19 01:01:35 +08:00
a504082002
47d4f30697 translate repository into traditional chinese 2014-11-19 01:00:04 +08:00
a504082002
2c7762fecc translate network into traditional chinese 2014-11-19 00:59:10 +08:00
a504082002
96c9b574dd translate introduction into traditional chinese 2014-11-19 00:58:33 +08:00
a504082002
0bd4106ed4 translate install into traditional chinese 2014-11-19 00:56:12 +08:00
a504082002
423781aec5 translate image into traditional chinese 2014-11-19 00:55:23 +08:00
a504082002
1d0a49ca31 translate dockerfile into traditional chinese 2014-11-19 00:53:01 +08:00
a504082002
e3085090b4 translate data_management into traditional chinese 2014-11-18 23:07:04 +08:00
Summit Suen
37dbe623bd fix update: /dockerfile/build_image.md again 2014-11-18 22:40:50 +08:00
Summit Suen
6850986efb fix update: /dockerfile/build_image.md & basic_structure.md 2014-11-18 22:37:05 +08:00
a504082002
b16ff0610b translate container into traditional chinese 2014-11-18 21:06:39 +08:00
a504082002
54ad70f9fd translate cases into traditional chinese 2014-11-18 21:05:06 +08:00
a504082002
f6073d41af translate basic_concept into traditional chinese 2014-11-18 21:03:58 +08:00
a504082002
c56ccb9c8a translate appendix_repo and appendix_resources into traditional chinese 2014-11-18 21:01:27 +08:00
a504082002
0a084995ce translate appendix_command into traditional chinese 2014-11-18 20:57:26 +08:00
a504082002
4926d0c337 translate advanced_network into traditional chinese 2014-11-18 20:54:05 +08:00
lane
bd9010f28d Merge remote-tracking branch 'baseremote/master' 2014-11-18 18:04:46 +08:00
lane
cb374089ba install translate to traditional chinese 2014-11-18 17:56:15 +08:00
Summit Suen
f6542a2fcb fix update: /dockerfile/build_image.md & basic_structure.md 2014-11-18 17:53:10 +08:00
Summit Suen
484340326b fix update: /dockerfile/build_image.md 2014-11-18 17:38:00 +08:00
SatoshiLiang
f4ba04c1c0 summary translated 2014-11-18 17:00:05 +08:00
Summit Suen
20c3941826 update: /dockerfile/build_image.md 2014-11-18 16:10:26 +08:00
Summit Suen
216059f835 update: /dockerfile/build_image.md 2014-11-18 16:05:07 +08:00
philipz
665e06c473 fix reference 2014-11-18 15:57:05 +08:00
philipz
4eee9fe9f5 Merge pull request #2 from suensummit/develop
test commit: /dockerfile/README.md & basic_structure.md
2014-11-18 15:53:35 +08:00
Summit Suen
fd748e30e0 test commit: /dockerfile/README.md & basic_structure.md 2014-11-18 15:46:57 +08:00
philipz
93f3edd62b Merge pull request #1 from laneser/master
introduction 正體化
2014-11-18 15:19:26 +08:00
lane
84e5cf1f58 fix table again. 2014-11-18 15:14:40 +08:00
lane
1655c2458d fix why table. 2014-11-18 15:11:19 +08:00
lane
01ba8b47a6 introduction 正體化 2014-11-18 15:05:50 +08:00
philipz
2d0b4da76e Update README.md 2014-11-18 14:58:26 +08:00
philipz
2ee6b1edfe Update README.md 2014-11-18 14:55:28 +08:00
philipz
a933cd5423 Update README.md 2014-11-18 13:40:49 +08:00
philipz
9ecb1194ca Update README.md 2014-11-18 13:32:24 +08:00
146 changed files with 1004 additions and 4869 deletions

1
.gitignore vendored
View File

@@ -5,4 +5,3 @@
_book/
*.swp
*.edx
.DS_Store

146
README.md
View File

@@ -1,85 +1,95 @@
Docker —— 从入门到实践
Docker —— 從入門到實踐
===============
v0.6.0
v0.2.9
[Docker](http://www.docker.com) 是个很有意思的开源项目,它彻底释放了虚拟化的威力,极大降低了云计算资源供应的成本,同时让应用的部署、测试和分发都变得前所未有的高效和轻松
[Docker](docker.com) 是個偉大的項目,它徹底釋放了虛擬化的,讓應用程式的分派、部署和管理都變得前所未有的有效率和輕鬆
书既适用于具备基础 Linux 知的 Docker 初者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例11 ~ 13 章介绍关于 Docker 实现的相关细节技术。后续章节则分别介绍一些相关的热门开源项目
書既適用於具備基礎 Linux 知的 Docker 初者,也可供希望理解原理和實做的進階使用者參考。同時,書中給出的實踐案例,可供在進行實際部署時借鑒
在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [DockerPool](http://dockerpool.com/static/books/docker_practice/index.html)
本書源於 [WaitFish](github.com/qcpm1983) 的《[Docker 學習手冊 v1.0](https://github.com/yeasy/docker_practice/raw/master/_local/docker_manual_waitfish.pdf)》內容。後來,[yeasy](github.com/yeasy)
根據最新 Docker 版本對內容進行了修訂和重寫,並增加內容;經協商將所有內容開源,採用網路合作的方式進行維護。
欢迎关注 DockerPool 社区微博 [@dockerpool](http://weibo.com/u/5345404432),或加入 Docker 技术交流 QQ 群或微信组,分享 Docker 资源,交流 Docker 技术
前六章為基礎內容,供使用者理解 Docker 的基本概念和操作7 ~ 9 章介紹一些進階操作;第 10 章給出典型的應用場景和實踐案例11 ~ 13 章介紹關於 Docker 實做的相關技術
* QQ 群I 已满341410255
* QQ 群II 已满419042067
* QQ 群III可加210028779
最新版本線上閱讀:[正體版](https://www.gitbook.io/book/philipzheng/docker_practice)、[簡體版](https://www.gitbook.io/book/yeasy/docker_practice) 或 [DockerPool](http://dockerpool.com/static/books/docker_practice/index.html)。
![Docker 技术入门与实战](docker_primer.png)
另外,歡迎加入 [Docker.Taipei](https://www.facebook.com/groups/docker.taipei/) 和 [Meetup](http://www.meetup.com/Docker-Taipei/) ,分享 Docker 資源,交流 Docker 技術。
《[Docker 技术入门与实战](http://item.jd.com/11598400.html)》一书已经正式出版,包含大量第一手实战案例和更为深入的技术剖析,欢迎大家阅读使用并帮忙反馈建议。
* [China-Pub](http://product.china-pub.com/3770833)
* [京东图书](http://item.jd.com/11598400.html)
* [当当图书](http://product.dangdang.com/23620853.html)
* [亚马逊图书](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00R5MYI7C/ref=lh_ni_t?ie=UTF8&psc=1&smid=A1AJ19PSB66TGU)
本書原始碼在 Github 上維護,歡迎參與: [https://github.com/philipz/docker_practice](https://github.com/philipz/docker_practice)
## 主要版本历史
* 0.6.0: 2015-12-24
* 补充 Machine 项目
* 修正若干 bug
* 0.5: 2015-06-29
* 添加 Compose 项目
* 添加 Machine 项目
* 添加 Swarm 项目
* 完善 Kubernetes 项目内容
* 添加 Mesos 项目内容
* 0.4: 2015-05-08
* 添加 Etcd 项目
* 添加 Fig 项目
* 添加 CoreOS 项目
* 添加 Kubernetes 项目
* 0.3: 2014-11-25
* 完成仓库章节;
* 重写安全章节;
* 修正底层实现章节的架构、名字空间、控制组、文件系统、容器格式等内容;
* 添加对常见仓库和镜像的介绍;
* 添加 Dockerfile 的介绍;
* 重新校订中英文混排格式。
* 修订文字表达。
* 发布繁体版本分支zh-Hant。
感謝所有的 [貢獻者](https://github.com/philipz/docker_practice/graphs/contributors)。
## 主要版本歷史
* 0.3: 2014-10-TODO
* 完成倉庫章節;
* 重寫安全章節;
* 修正底層實做章節的架構、名字空間、控制組、檔案系統、容器格式等內容;
* 新增對常見倉庫和鏡像的介紹;
* 新增 Dockerfile 的介紹;
* 重新校訂中英文混排格式。
* 0.2: 2014-09-18
* 照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章
* 添加底层实现章节
* 添加命令查询和资源链接章节
* 照官方文檔重寫介紹、基本概念、安裝、鏡像、容器、倉庫、資料管理、網路等章
* 新增底層實做章節
* 新增命令查詢和資源連結章節
* 其它修正。
* 0.1: 2014-09-05
* 添加基本容;
* 修正错别字和表不通的地方。
* 新增基本容;
* 修正錯別字和表不通的地方。
## 貢獻力量
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。源码开源托管在 Github 上,欢迎参与维护:[https://github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice)。贡献者 [名单](https://github.com/yeasy/docker_practice/graphs/contributors)。
如果想做出貢獻的話,你可以:
## 参加步骤
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```
$ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice
$ git config user.name "yourname"
$ git config user.email "your email"
```
* 修改代码后提交,并推送到自己的仓库。
```
$ #do some change on the content
$ git commit -am "Fix issue #1: change helo to hello"
$ git push
```
* 在 GitHub 网站上提交 pull request。
* 定期使用项目仓库内容更新自己仓库内容。
```
$ git remote add upstream https://github.com/yeasy/docker_practice
$ git fetch upstream
$ git checkout master
$ git rebase upstream/master
$ git push -f origin master
```
- 幫忙校對,挑錯別字、語病等等
- 提出修改建議
- 提出術語翻譯建議
## 翻譯建議
如果你願意一起校對的話,請仔細閱讀:
- 使用 markdown 進行翻譯,文件名必須使用英文,因為中文的話 gitbook 編譯的時候會出問題
- 引號請使用「」和『』
- fork 過去之後新建一個分支進行翻譯,完成後 pull request 這個分支,沒問題的話我會合併到 master 分支中
- 有其他任何問題都歡迎發 issue我看到了會盡快回覆
謝謝!
## 關於術語
翻譯術語的時候請參考這個流程:
- 盡量保證與台灣習慣術語和已翻譯的內容一致
- 盡量先搜尋,一般來說程式語言的大部分術語是一樣的,可以參考[這個網站](http://jjhou.boolan.com/terms.htm)
- 如果以上兩條都沒有找到合適的結果,請自己決定一個合適的翻譯或者直接使用英文原文,後期校對的時候會進行統一
- 校稿時,若有發現沒有被翻譯成台灣術語的大陸術語,可以將它新增到 translation.json 中
- 可以主動提交替換過的文本給我,或是僅提交新增過的 translation.json 也可,我會再進行文本的替換
- 請務必確定提交的翻譯對照組不會造成字串循環替代ex: 因為「類」->「類別」,造成下次再執行自動翻譯時「類別」又變成「類別別」)
對翻譯有任何意見都歡迎發 issue我看到了會盡快回覆
## 參加步驟
參考 [Swift 說明](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/),欲翻譯章節就直接在 github 上發 Issue 中註明或直接發Pull Request 修改。m(_ _)m
有些朋友可能不太清楚如何幫忙翻譯,我這裡寫一個簡單的流程,大家可以參考一下:
1. 首先 fork 我的項目
2. 把 fork 過去的項目也就是你的項目 clone 到你的本地
3. 在命令行執行 `git branch develop` 來建立一個新分支
4. 執行 `git checkout develop` 來切換到新分支
5. 執行 `git remote add upstream https://github.com/philipz/docker_practice` 把我的庫新增為遠端庫
6. 執行 `git remote update`更新
7. 執行 `git fetch upstream master` 拉取我的庫的更新到本地
8. 執行 `git rebase upstream/master` 將我的更新合並到你的分支
這是一個初始化流程,只需要做一遍就行,之後請一直在 develop 分支進行修改。
如果修改過程中我的庫有了更新,請重復 6、7、8 步。
修改之後,首先 push 到你的庫,然後登錄 GitHub在你的 repo 的首頁可以看到一個 `pull request` 按鈕,點擊它,填寫一些說明資訊,然後提交即可。
## 原出處及參考資料
1. [Docker —— 从入门到实践](https://github.com/yeasy/docker_practice/)
2. [《The Swift Programming Language­》正體中文版](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/)

View File

@@ -1,121 +1,76 @@
# Summary
* [前言](README.md)
* [Docker ](introduction/README.md)
* [是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md)
* [Docker ](introduction/README.md)
* [是 Docker](introduction/what.md)
* [為什麼要用 Docker](introduction/why.md)
* [基本概念](basic_concept/README.md)
* [镜像](basic_concept/image.md)
* [映像檔](basic_concept/image.md)
* [容器](basic_concept/container.md)
* [仓库](basic_concept/repository.md)
* [](install/README.md)
* [倉庫](basic_concept/repository.md)
* [](install/README.md)
* [Ubuntu](install/ubuntu.md)
* [CentOS](install/centos.md)
* [镜像](image/README.md)
* [获取镜像](image/pull.md)
* [映像檔](image/README.md)
* [取得映像檔](image/pull.md)
* [列出](image/list.md)
* [](image/create.md)
* [存出和](image/save_load.md)
* [](image/create.md)
* [存出和](image/save_load.md)
* [移除](image/rmi.md)
* [实现原理](image/internal.md)
* [實做原理](image/internal.md)
* [容器](container/README.md)
* [启动](container/run.md)
* [护态运](container/daemon.md)
* [](container/stop.md)
* [入容器](container/enter.md)
* [导出和导](container/import_export.md)
* [](container/rm.md)
* [仓库](repository/README.md)
* [啟動](container/run.md)
* [護態執](container/daemon.md)
* [](container/stop.md)
* [入容器](container/enter.md)
* [導出與導](container/import_export.md)
* [](container/rm.md)
* [倉庫](repository/README.md)
* [Docker Hub](repository/dockerhub.md)
* [私有仓库](repository/local_repo.md)
* [配置文件](repository/config.md)
* [数据管理](data_management/README.md)
* [数据](data_management/volume.md)
* [数据卷容器](data_management/container.md)
* [份、恢复、迁移数据](data_management/management.md)
* [使用网络](network/README.md)
* [外部访问容器](network/port_mapping.md)
* [容器互](network/linking.md)
* [高级网络配置](advanced_network/README.md)
* [快速配置指南](advanced_network/quick_guide.md)
* [配置 DNS](advanced_network/dns.md)
* [容器访问控制](advanced_network/access_control.md)
* [端口映射实现](advanced_network/port_mapping.md)
* [配置 docker0 网桥](advanced_network/docker0.md)
* [自定义网桥](advanced_network/bridge.md)
* [工具和示](advanced_network/example.md)
* [编辑网络配置文件](advanced_network/config_file.md)
* [例:创建一个点到点连](advanced_network/ptp.md)
* [实战案例](cases/README.md)
* [使用 Supervisor 管理](cases/supervisor.md)
* [建 tomcat/weblogic 集群](cases/tomcat.md)
* [多台物理主机之间的容器互](cases/container_connect.md)
* [标准化开发测试和生产环](cases/environment.md)
* [私有倉庫](repository/local_repo.md)
* [設定文件](repository/config.md)
* [數據管理](data_management/README.md)
* [數據](data_management/volume.md)
* [數據卷容器](data_management/container.md)
* [份、恢復、遷移數據](data_management/management.md)
* [使用網路](network/README.md)
* [外部訪問容器](network/port_mapping.md)
* [容器互](network/linking.md)
* [進階網路設定](advanced_network/README.md)
* [快速設定指南](advanced_network/quick_guide.md)
* [設定 DNS](advanced_network/dns.md)
* [容器訪問控制](advanced_network/access_control.md)
* [端口映射實做](advanced_network/port_mapping.md)
* [設定 docker0 網橋](advanced_network/docker0.md)
* [自定義網橋](advanced_network/bridge.md)
* [工具與範](advanced_network/example.md)
* [編輯網路設定文件](advanced_network/config_file.md)
* [例:創造一個點對點連](advanced_network/ptp.md)
* [實戰案例](cases/README.md)
* [使用 Supervisor 管理程](cases/supervisor.md)
* [ tomcat/weblogic 集群](cases/tomcat.md)
* [多台實體主機之間的容器互](cases/container_connect.md)
* [標準化開發測試和生產環](cases/environment.md)
* [安全](security/README.md)
* [内核名字空间](security/kernel_ns.md)
* [控制](security/control_group.md)
* [端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [总结](security/summary.md)
* [內核命名空間](security/kernel_ns.md)
* [控制](security/control_group.md)
* [服端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [總結](security/summary.md)
* [Dockerfile](dockerfile/README.md)
* [基本结构](dockerfile/basic_structure.md)
* [基本結構](dockerfile/basic_structure.md)
* [指令](dockerfile/instructions.md)
* [创建镜像](dockerfile/build_image.md)
* [层实现](underly/README.md)
* [基本架](underly/arch.md)
* [名字空间](underly/namespace.md)
* [控制](underly/cgroups.md)
* [联合文件系](underly/ufs.md)
* [建立映像檔](dockerfile/build_image.md)
* [層實做](underly/README.md)
* [基本架](underly/arch.md)
* [命名空間](underly/namespace.md)
* [控制](underly/cgroups.md)
* [Union 文件系](underly/ufs.md)
* [容器格式](underly/container_format.md)
* [网络](underly/network.md)
* [Docker Compose 项目](compose/README.md)
* [简介](compose/intro.md)
* [安装](compose/install.md)
* [使用](compose/usage.md)
* [命令说明](compose/commands.md)
* [YAML 模板文件](compose/yaml_file.md)
* [Docker Machine 项目](machine/README.md)
* [简介](machine/intro.md)
* [安装](machine/install.md)
* [使用](machine/usage.md)
* [Docker Swarm 项目](swarm/README.md)
* [简介](swarm/intro.md)
* [安装](swarm/install.md)
* [使用](swarm/usage.md)
* [调度器](swarm/scheduling.md)
* [过滤器](swarm/filter.md)
* [Etcd 项目](etcd/README.md)
* [简介](etcd/intro.md)
* [安装](etcd/install.md)
* [使用 etcdctl](etcd/etcdctl.md)
* [Fig 项目](fig/README.md)
* [简介](fig/intro.md)
* [安装](fig/install.md)
* [命令参考](fig/cli_ref.md)
* [fig.yml参考](fig/yml_ref.md)
* [环境变量参考](fig/env_ref.md)
* [实战 Django](fig/django.md)
* [实战 Rails](fig/rails.md)
* [实战 wordpress](fig/wordpress.md)
* [CoreOS 项目](coreos/README.md)
* [简介](coreos/intro.md)
* [工具](coreos/intro_tools.md)
* [快速搭建CoreOS集群](coreos/quickstart.md)
* [Kubernetes 项目](kubernetes/README.md)
* [简介](kubernetes/intro.md)
* [快速上手](kubernetes/quickstart.md)
* [基本概念](kubernetes/concepts.md)
* [kubectl 使用](kubernetes/kubectl.md)
* [架构设计](kubernetes/design.md)
* [Mesos 项目](mesos/README.md)
* [简介](mesos/intro.md)
* [安装与使用](mesos/installation.md)
* [原理与架构](mesos/architecture.md)
* [配置项解析](mesos/configuration.md)
* [常见框架](mesos/framework.md)
* [附录一:命令查询](appendix_command/README.md)
* [附录二:常见仓库介绍](appendix_repo/README.md)
* [網路](underly/network.md)
* [附錄一:命令查詢](appendix_command/README.md)
* [附錄二:常見倉庫介紹](appendix_repo/README.md)
* [Ubuntu](appendix_repo/ubuntu.md)
* [CentOS](appendix_repo/centos.md)
* [MySQL](appendix_repo/mysql.md)
@@ -124,5 +79,5 @@
* [Nginx](appendix_repo/nginx.md)
* [WordPress](appendix_repo/wordpress.md)
* [Node.js](appendix_repo/nodejs.md)
* [三:有用的资源](appendix_resources/README.md)
* [三:資源連結](appendix_resources/README.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

View File

@@ -1,374 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="562.78589"
height="134.62993"
id="svg2"
xml:space="preserve"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><g
transform="matrix(1.25,0,0,-1.25,-169.2546,1414.8444)"
id="g10"><g
transform="matrix(0,0.18092,-0.18275,0,0,0)"
id="g12"><path
d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z"
id="path14"
style="fill:none;stroke:#ffffff;stroke-width:118.52590179;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 190.7198,1121.0876 35.725,-17.0586 8.8274,-38.3391 -24.7181,-30.7489 -39.6505,0 -24.7249,30.7434 8.8192,38.3412 35.7219,17.0665 z"
id="path16"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0,0.18092,-0.18275,0,0,0)"
id="g18"><path
d="m 6196.6587,-1043.6173 -94.2888,-195.4939 -211.9141,-48.3046 -169.9603,135.2593 -0.025,216.9723 169.9297,135.2942 211.9237,-48.2572 94.3353,-195.4701 z"
id="path20"
style="fill:none;stroke:#336ee5;stroke-width:74.74790192;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><g
transform="scale(0.18275,0.18275)"
id="g22"><path
d="m 1013.0746,6022.3961 c 73.5242,16.6963 146.8298,-29.4129 163.7263,-102.9881 16.9013,-73.5693 -29.0033,-146.7459 -102.5258,-163.4409 -73.5273,-16.6903 -146.8343,29.4189 -163.7325,102.9867 -16.8967,73.5769 29.0047,146.7505 102.532,163.4423 z"
id="path24"
style="fill:none;stroke:#ffffff;stroke-width:30.78089905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 188.4186,1104.8074 2.7468,-0.01 0.1749,-20.1918 -4.0657,-0.038 1.144,20.236 z"
id="path26"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="scale(0.17178,0.18275)"
id="g28"><path
d="m 1096.8024,6045.6095 15.9899,-0.036 1.0191,-110.4894 -23.6699,-0.2094 6.6609,110.7345 z"
id="path30"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 193.0309,1104.8074 -2.7474,-0.01 -0.1703,-20.1918 4.0654,-0.037 -1.1477,20.2354 z"
id="path32"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="scale(0.17178,0.18275)"
id="g34"><path
d="m 1123.6518,6045.6098 -15.993,-0.036 -0.991,-110.4894 23.6681,-0.2029 -6.6841,110.7283 z"
id="path36"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 192.8625,1112.4315 c 0,-1.3119 -0.9576,-2.3758 -2.1382,-2.3758 -1.1806,0 -2.1379,1.0639 -2.1379,2.3752 0,1.3119 0.9564,2.3754 2.1379,2.3763 1.1806,0 2.1382,-1.0636 2.1382,-2.3757"
id="path38"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.16447,2e-5,-2e-5,0.18275,0,0)"
id="g40"><path
d="m 1173.5053,6087.183 c -8e-4,-7.1804 -5.8238,-12.9997 -13.0019,-12.9988 -7.1785,8e-4 -12.998,5.8229 -12.9969,12.9971 0,7.1819 5.817,13.0011 13.0006,13.0031 7.1781,-6e-4 12.9994,-5.8229 12.9982,-13.0014 z"
id="path42"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 188.5873,1112.4629 c 5e-4,-0.1876 -0.009,-0.458 -0.003,-0.6389 0.0289,-0.7566 0.1945,-1.3368 0.294,-2.0344 0.1797,-1.4922 0.3311,-2.7289 0.2381,-3.8781 -0.0851,-0.5757 -0.4184,-0.8028 -0.6959,-1.0689 l 3.3721,-2.2315 -0.5069,9.8354 -2.6988,0.016 z"
id="path44"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0,-0.17178,0.18275,0,0,0)"
id="g46"><path
d="m -6476.0579,1031.9675 c 1.0925,0 2.6666,-0.048 3.7194,-0.014 4.4045,0.1568 7.7839,1.0641 11.8431,1.6087 8.6865,0.9819 15.8862,1.8102 22.5791,1.3028 3.3483,-0.4652 4.6701,-2.2896 6.2212,-3.8095 l 12.9884,18.4555 -57.257,-2.7751 -0.094,-14.7685 z"
id="path48"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 192.8625,1112.4629 c -0.001,-0.1876 0.008,-0.458 0.002,-0.6389 -0.0289,-0.7566 -0.1942,-1.3368 -0.2934,-2.0344 -0.1797,-1.4922 -0.3311,-2.7289 -0.2384,-3.8781 0.0847,-0.5757 0.4184,-0.8028 0.6959,-1.0689 l -3.3724,-2.2315 0.5074,9.8354 2.6989,0.016 z"
id="path50"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0,-0.17178,0.18275,0,0,0)"
id="g52"><path
d="m -6476.0579,1055.3604 c 1.0925,0 2.6666,0.046 3.7194,0.011 4.4045,-0.1534 7.7839,-1.0624 11.8431,-1.6022 8.6865,-0.9867 15.8862,-1.815 22.5791,-1.3076 3.3483,0.4669 4.6701,2.291 6.2212,3.8081 l 12.9884,-18.4541 -57.257,2.7765 -0.094,14.7685 z"
id="path54"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><g
transform="scale(0.18275,0.18275)"
id="g56"><path
d="m 1073.7275,5865.2637 -30.1062,-14.4303 -30.1,14.438 -7.4344,32.4422 20.8395,26.0065 33.4099,0 20.8321,-26.0175 -7.4409,-32.4374 z"
id="path58"
style="fill:none;stroke:#ffffff;stroke-width:30.34600067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 166.9153,1092.2468 1.7178,2.1436 15.8952,-12.4532 -2.5049,-3.2023 -15.1081,13.5119 z"
id="path60"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1071,0.1343,-0.14288,0.11394,0,0)"
id="g62"><path
d="m 5577.0313,3012.37 15.9908,-0.036 1.0134,-110.4917 -23.6665,-0.2083 6.6623,110.7357 z"
id="path64"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 169.7905,1095.853 -1.7074,-2.1523 15.6805,-12.723 2.5636,3.1561 -16.5367,11.7192 z"
id="path66"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1071,0.1343,-0.14288,0.11394,0,0)"
id="g68"><path
d="m 5603.8799,3012.3729 -15.9928,-0.039 -0.9944,-110.4931 23.6693,-0.2001 -6.6821,110.7321 z"
id="path70"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 163.7252,1100.4746 c 1.0258,-0.8183 1.2608,-2.2297 0.5247,-3.1529 -0.7368,-0.9233 -2.1651,-1.0089 -3.191,-0.1908 -1.0256,0.8181 -1.2606,2.2292 -0.5238,3.1524 0.7358,0.9235 2.1642,1.0086 3.1901,0.1913"
id="path72"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.10253,0.1286,-0.14289,0.11392,0,0)"
id="g74"><path
d="m 5852.363,3053.3992 c 0,-7.181 -5.8216,-13.0011 -13.0009,-13.0005 -7.1815,0 -13.0025,5.8227 -13.0013,13.0025 0,7.1796 5.8198,12.9977 13.0013,12.9949 7.1799,0 12.998,-5.8198 13.0009,-12.9969 z"
id="path76"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 161.0351,1097.1516 c 0.1474,-0.1171 0.3518,-0.2931 0.4986,-0.4005 0.6089,-0.4496 1.1656,-0.6818 1.7734,-1.0387 1.2781,-0.7894 2.3397,-1.4428 3.1807,-2.232 0.3969,-0.4249 0.3662,-0.8268 0.4008,-1.2104 l 3.8472,1.2453 -8.0047,5.7356 -1.696,-2.0993 z"
id="path78"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1343,-0.1071,0.11394,0.14288,0,0)"
id="g80"><path
d="m -3249.2299,5243.3232 c 1.0919,-9e-4 2.6612,-0.054 3.7205,-0.014 4.403,0.1539 7.7794,1.0602 11.8417,1.6056 8.6817,0.9844 15.8837,1.8121 22.5768,1.3042 3.3486,-0.4641 4.6681,-2.2882 6.2175,-3.8109 l 12.9912,18.4518 -57.2536,-2.7726 -0.094,-14.7639 z"
id="path82"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 163.6999,1100.4936 c 0.1472,-0.1176 0.3643,-0.278 0.5012,-0.3965 0.574,-0.4944 0.9247,-0.9851 1.4077,-1.4979 1.0548,-1.0709 1.9275,-1.9601 2.8842,-2.6039 0.5026,-0.2928 0.8876,-0.1737 1.2691,-0.1221 l -0.3586,-4.0275 -7.3732,6.5273 1.6696,2.1206 z"
id="path84"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1343,-0.1071,0.11394,0.14288,0,0)"
id="g86"><path
d="m -3249.2341,5266.7113 c 1.0978,-3e-4 2.6671,0.053 3.7204,0.013 4.4068,-0.1565 7.7837,-1.0596 11.8432,-1.6053 8.6876,-0.983 15.8876,-1.8099 22.5782,-1.2999 3.3503,0.462 4.6704,2.2847 6.2195,3.8072 l 12.9884,-18.4521 -57.2517,2.768 -0.098,14.7688 z"
id="path88"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 163.3717,1067.5885 -0.6052,2.6796 19.6464,4.6636 0.9419,-3.9555 -19.9831,-3.3877 z"
id="path90"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03823,-0.16747,0.17816,0.04067,0,0)"
id="g92"><path
d="m -5847.3595,2171.5736 -15.992,0.034 -1.017,110.4899 23.669,0.2087 -6.66,-110.7329 z"
id="path94"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 162.3444,1072.0845 0.6182,-2.6767 19.7238,4.3271 -0.8685,3.9719 -19.4735,-5.6223 z"
id="path96"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03823,-0.16747,0.17816,0.04067,0,0)"
id="g98"><path
d="m -5874.2073,2171.5679 15.9931,0.04 0.9924,110.4916 -23.6673,0.203 6.6818,-110.7349 z"
id="path100"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 154.9497,1070.2236 c 1.2787,0.2928 2.529,-0.4039 2.7921,-1.5551 0.2625,-1.1509 -0.561,-2.3213 -1.8405,-2.6127 -1.2785,-0.2928 -2.5285,0.4039 -2.7919,1.5551 -0.2625,1.1509 0.5613,2.3207 1.8403,2.6127"
id="path102"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03662,-0.16034,0.17816,0.04069,0,0)"
id="g104"><path
d="m -6133.9467,2130.5761 c 0,7.1782 5.8161,12.9985 12.9991,12.9988 7.1756,-3e-4 12.9985,-5.8192 12.9951,-13.0005 0.01,-7.1753 -5.8189,-12.9966 -12.9988,-12.9988 -7.1773,5e-4 -12.9963,5.8218 -12.9954,13.0005 z"
id="path106"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 155.8706,1066.049 c 0.1829,0.042 0.4488,0.093 0.6234,0.14 0.7316,0.1962 1.2606,0.4867 1.9182,0.7387 1.4148,0.508 2.5869,0.9301 3.7281,1.0951 0.58,0.046 0.8745,-0.2282 1.1968,-0.4405 l 1.4247,3.7842 -9.4759,-2.6816 0.5847,-2.6359 z"
id="path108"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.16747,0.03823,-0.04067,0.17816,0,0)"
id="g110"><path
d="m 2265.6285,5497.4356 c 1.0922,0 2.6666,-0.045 3.7177,-0.01 4.4093,0.1534 7.7862,1.0596 11.8448,1.603 8.6851,0.9845 15.8865,1.8117 22.5771,1.3023 3.3483,-0.4592 4.6676,-2.2825 6.2201,-3.8072 l 12.9895,18.4535 -57.2534,-2.7672 -0.096,-14.7744 z"
id="path112"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 154.9191,1070.2165 c 0.1834,0.042 0.4447,0.1106 0.6224,0.1451 0.7447,0.1404 1.3471,0.1078 2.0489,0.1661 1.4947,0.1571 2.7338,0.2849 3.8339,0.6313 0.5428,0.2106 0.6894,0.5859 0.8867,0.9165 l 2.9262,-2.791 -9.701,-1.696 -0.6171,2.628 z"
id="path114"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.16747,0.03823,-0.04067,0.17816,0,0)"
id="g116"><path
d="m 2265.6266,5520.8273 c 1.0955,0 2.6674,0.048 3.7193,0.017 4.4096,-0.1585 7.7859,-1.0659 11.8448,-1.6093 8.6865,-0.9822 15.8843,-1.809 22.5766,-1.3005 3.3536,0.4626 4.6684,2.287 6.2195,3.8092 l 12.9917,-18.4527 -57.2533,2.7683 -0.099,14.7682 z"
id="path118"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 180.4031,1049.4196 -2.473,1.1973 8.6032,18.2685 3.6802,-1.73 -9.8104,-17.7358 z"
id="path120"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.15477,-0.07453,0.07929,0.16465,0,0)"
id="g122"><path
d="m -1704.3131,5602.1797 -15.9959,0.035 -1.0171,110.4913 23.6718,0.2081 -6.6588,-110.7343 z"
id="path124"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 176.2469,1051.4203 2.4784,-1.1858 8.9141,18.1179 -3.6474,1.7978 -7.7451,-18.7299 z"
id="path126"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.15477,-0.07453,0.07929,0.16465,0,0)"
id="g128"><path
d="m -1731.1657,5602.1774 15.9936,0.038 0.9918,110.4882 -23.669,0.2044 6.6836,-110.7309 z"
id="path130"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 173.0911,1044.4779 c 0.5695,1.1824 1.8927,1.7255 2.9568,1.2132 1.0642,-0.5122 1.4653,-1.8858 0.8964,-3.0676 -0.5687,-1.1826 -1.8933,-1.7252 -2.9569,-1.2132 -1.0644,0.5122 -1.4655,1.8856 -0.8963,3.0676"
id="path132"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.14819,-0.07134,0.07926,0.16466,0,0)"
id="g134"><path
d="m -1806.2371,5560.6799 c 3e-4,7.1804 5.821,12.9988 13.0023,13.0011 7.1781,0 12.9974,-5.8221 12.9957,-12.9997 0.01,-7.1801 -5.821,-12.9991 -12.9974,-12.9994 -7.1822,-5e-4 -13.0014,5.819 -13.0006,12.998 z"
id="path136"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 176.9292,1042.5954 c 0.0817,0.1695 0.207,0.4085 0.2792,0.5749 0.3033,0.6934 0.4057,1.2883 0.6183,1.9596 0.4853,1.4227 0.8858,2.6025 1.468,3.5974 0.3266,0.4819 0.7249,0.542 1.0908,0.6614 l -2.0698,3.4733 -3.8107,-9.0808 2.4242,-1.1858 z"
id="path138"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.07453,0.15477,-0.16465,0.07929,0,0)"
id="g140"><path
d="m 5915.209,1602.9547 c 1.0953,0 2.6649,-0.05 3.7202,-0.012 4.4056,0.1519 7.7811,1.0601 11.8409,1.605 8.6862,0.9844 15.8865,1.8127 22.5763,1.3028 3.3508,-0.4666 4.6717,-2.2873 6.222,-3.8084 l 12.9909,18.4516 -57.2547,-2.7709 -0.096,-14.7685 z"
id="path142"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 173.0784,1044.4501 c 0.0813,0.169 0.1902,0.4165 0.2744,0.5766 0.354,0.6698 0.7554,1.12 1.1471,1.7059 0.8099,1.266 1.482,2.3145 1.8975,3.3905 0.1735,0.5553 -0.0286,0.904 -0.1644,1.2646 l 4.0071,0.5473 -4.7237,-8.6411 -2.438,1.1562 z"
id="path144"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.07453,0.15477,-0.16465,0.07929,0,0)"
id="g146"><path
d="m 5915.2107,1626.3439 c 1.0917,0 2.6638,0.052 3.7171,0.016 4.4073,-0.1553 7.7822,-1.0655 11.8432,-1.6064 8.6876,-0.9845 15.8853,-1.8102 22.5771,-1.3051 3.3499,0.4646 4.6689,2.2873 6.22,3.8141 l 12.9887,-18.4575 -57.2528,2.7737 -0.093,14.7653 z"
id="path148"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 205.2142,1051.4548 -2.4778,-1.1863 -8.9186,18.1171 3.6467,1.798 7.7497,-18.7288 z"
id="path150"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.15477,0.07454,-0.0793,0.16465,0,0)"
id="g152"><path
d="m 3732.232,4696.5288 -15.992,0.035 -1.0145,110.4942 23.669,0.2069 -6.6625,-110.7357 z"
id="path154"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 201.0589,1049.4533 2.4729,1.1988 -8.6082,18.2661 -3.6797,-1.7314 9.815,-17.7335 z"
id="path156"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.15477,0.07454,-0.0793,0.16465,0,0)"
id="g158"><path
d="m 3705.3822,4696.5274 15.9982,0.038 0.9873,110.4936 -23.6687,0.201 6.6832,-110.7329 z"
id="path160"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 204.5188,1042.6575 c -0.5697,1.1821 -0.1686,2.5563 0.8952,3.0685 1.0636,0.5122 2.3879,-0.03 2.9574,-1.2124 0.5689,-1.182 0.1684,-2.5554 -0.8952,-3.0682 -1.0644,-0.5125 -2.3876,0.031 -2.9574,1.2121"
id="path162"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.14817,0.07138,-0.07932,0.16464,0,0)"
id="g164"><path
d="m 3871.7606,4654.3567 c -9e-4,7.1818 5.8221,13.0025 13.0017,13.0022 7.1767,0 12.9999,-5.8209 12.9991,-13.002 0,-7.1784 -5.8212,-12.9977 -13,-12.9996 -7.183,0 -12.9977,5.8215 -13.0008,12.9994 z"
id="path166"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 208.3836,1044.4844 c -0.0811,0.1698 -0.1896,0.4167 -0.2747,0.5775 -0.354,0.6698 -0.7554,1.1199 -1.1472,1.7056 -0.8095,1.2665 -1.4819,2.3142 -1.8978,3.3908 -0.1732,0.5553 0.029,0.9037 0.1636,1.2639 l -4.0059,0.5477 4.7233,-8.6411 2.4387,1.1556 z"
id="path168"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.07454,-0.15477,0.16465,0.0793,0,0)"
id="g170"><path
d="m -4951.7391,3507.378 c -1.097,5e-4 -2.6659,0.055 -3.7224,0.017 -4.4059,-0.1556 -7.7822,-1.065 -11.844,-1.6073 -8.6868,-0.9827 -15.8817,-1.8093 -22.5771,-1.3039 -3.35,0.4646 -4.665,2.2876 -6.2153,3.8089 l -12.992,-18.4507 57.2536,2.7686 0.097,14.7677 z"
id="path172"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 204.5333,1042.6297 c -0.0825,0.1693 -0.2072,0.4091 -0.2801,0.5746 -0.3024,0.6945 -0.405,1.2895 -0.6179,1.9602 -0.4859,1.423 -0.8861,2.6022 -1.4684,3.5983 -0.3265,0.4816 -0.7248,0.5408 -1.091,0.6599 l 2.0701,3.4738 3.8112,-9.0802 -2.4239,-1.1866 z"
id="path174"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.07454,-0.15477,0.16465,0.0793,0,0)"
id="g176"><path
d="m -4951.7379,3483.9904 c -1.0953,0 -2.6683,-0.049 -3.7196,-0.014 -4.4074,0.1565 -7.7871,1.0633 -11.8438,1.6036 -8.687,0.987 -15.8847,1.8128 -22.5799,1.3073 -3.3508,-0.4663 -4.6681,-2.2904 -6.2186,-3.8114 l -12.989,18.4538 57.2508,-2.7706 0.1001,-14.7688 z"
id="path178"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 219.1056,1072.1339 -0.6173,-2.6771 -19.7252,4.3226 0.868,3.9727 19.4745,-5.6182 z"
id="path180"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03822,0.16747,-0.17816,0.04066,0,0)"
id="g182"><path
d="m 6368.633,136.4414 -15.9914,0.0349 -1.0165,110.4948 23.6699,0.206 -6.662,-110.7357 z"
id="path184"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 218.0798,1067.6375 0.6046,2.6794 -19.6481,4.659 -0.9405,-3.9555 19.984,-3.3829 z"
id="path186"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03822,0.16747,-0.17816,0.04066,0,0)"
id="g188"><path
d="m 6341.7858,136.44 15.9894,0.0363 0.993,110.4933 -23.6673,0.2019 6.6849,-110.7315 z"
id="path190"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 225.5496,1066.1054 c -1.279,0.2923 -2.103,1.4613 -1.8405,2.6127 0.2631,1.1517 1.5126,1.8479 2.7913,1.5562 1.2793,-0.2914 2.1036,-1.4609 1.8411,-2.6127 -0.2631,-1.1514 -1.5123,-1.8482 -2.7919,-1.5562"
id="path192"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.03657,0.16035,-0.17817,0.04063,0,0)"
id="g194"><path
d="m 6624.6812,93.8699 c 0,7.1821 5.8189,12.9977 13.0011,12.9988 7.1796,-0.003 12.9974,-5.8215 12.9971,-12.9986 0,-7.1795 -5.8161,-13.0019 -12.9985,-13.0013 -7.1813,0.0022 -13.0012,5.8223 -12.9997,13.0011 z"
id="path196"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 226.531,1070.2664 c -0.1826,0.042 -0.4439,0.1105 -0.6225,0.1443 -0.7435,0.1411 -1.3462,0.1085 -2.048,0.1669 -1.4947,0.1562 -2.7346,0.2844 -3.8345,0.6305 -0.5422,0.2103 -0.6891,0.5862 -0.8869,0.9164 l -2.9251,-2.7918 9.7005,-1.6937 0.6165,2.6274 z"
id="path198"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.16748,-0.03822,0.04066,0.17817,0,0)"
id="g200"><path
d="m -100.5092,5985.5941 c -1.0916,-2e-4 -2.6645,0.05 -3.7196,0.012 -4.4028,-0.1522 -7.7808,-1.0598 -11.8414,-1.6029 -8.684,-0.9862 -15.8879,-1.8139 -22.5803,-1.3054 -3.3477,0.4654 -4.6655,2.2895 -6.2161,3.8103 l -12.9872,-18.4544 57.2485,2.7726 0.0961,14.7679 z"
id="path202"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 225.5803,1066.0992 c -0.1834,0.042 -0.4485,0.093 -0.624,0.14 -0.731,0.1953 -1.26,0.4859 -1.9176,0.7379 -1.4148,0.5074 -2.5869,0.93 -3.7281,1.0953 -0.5794,0.046 -0.8754,-0.2288 -1.1965,-0.4405 l -1.4247,3.7839 9.4748,-2.6821 -0.5839,-2.6345 z"
id="path204"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.16748,-0.03822,0.04066,0.17817,0,0)"
id="g206"><path
d="m -100.5077,5962.2049 c -1.0954,6e-4 -2.6652,-0.052 -3.7225,-0.013 -4.4022,0.1536 -7.7803,1.0581 -11.8358,1.6027 -8.6899,0.9836 -15.8896,1.8116 -22.5808,1.3036 -3.3505,-0.4626 -4.6715,-2.2858 -6.22,-3.8066 l -12.9867,18.4527 57.2477,-2.7737 0.0981,-14.766 z"
id="path208"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 211.6429,1095.893 1.7084,-2.1515 -15.6779,-12.7267 -2.5639,3.1547 16.5334,11.7235 z"
id="path210"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.10711,-0.1343,0.14287,0.11395,0,0)"
id="g212"><path
d="m -4219.3791,4644.5956 15.993,-0.032 1.012,-110.4928 -23.6625,-0.208 6.6575,110.7329 z"
id="path214"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 214.52,1092.2873 -1.7192,2.1436 -15.8913,-12.4566 2.5053,-3.2014 15.1052,13.5144 z"
id="path216"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.10711,-0.1343,0.14287,0.11395,0,0)"
id="g218"><path
d="m -4192.5257,4644.6018 -15.9959,-0.041 -0.9899,-110.4863 23.6639,-0.2055 -6.6781,110.7329 z"
id="path220"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 220.3747,1097.1729 c -1.0256,-0.8181 -2.4542,-0.7331 -3.1901,0.1902 -0.7364,0.9229 -0.5017,2.3349 0.5233,3.1529 1.0261,0.8181 2.4542,0.7331 3.1909,-0.1899 0.7359,-0.923 0.5018,-2.3352 -0.5241,-3.1532"
id="path222"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.10257,-0.12857,0.14286,0.11397,0,0)"
id="g224"><path
d="m -4379.2058,4686.834 c -3e-4,-7.1787 -5.8215,-12.9999 -13,-12.9971 -7.179,-6e-4 -13,5.8218 -13.0017,12.998 0,7.1813 5.8204,13.0011 13.0009,13.0005 7.1778,-5e-4 13.0022,-5.8192 13.0008,-13.0014 z"
id="path226"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 217.7337,1100.5347 c -0.1471,-0.1173 -0.364,-0.2786 -0.5012,-0.3962 -0.5737,-0.4938 -0.9241,-0.9859 -1.4068,-1.4976 -1.0554,-1.0718 -1.9273,-1.9613 -2.8843,-2.6053 -0.5026,-0.2925 -0.8872,-0.1735 -1.2691,-0.1216 l 0.3586,-4.028 7.3724,6.5284 -1.6696,2.1203 z"
id="path228"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1343,0.10711,-0.11395,0.14287,0,0)"
id="g230"><path
d="m 4985.5978,3965.3263 c -1.097,8e-4 -2.6683,0.052 -3.7208,0.016 -4.4036,-0.1551 -7.7842,-1.0647 -11.8383,-1.6067 -8.6933,-0.9845 -15.8919,-1.8139 -22.5811,-1.3048 -3.3517,0.4632 -4.6689,2.2839 -6.2198,3.8098 l -12.9886,-18.4561 57.2496,2.7757 0.099,14.7665 z"
id="path232"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 220.3994,1097.193 c -0.1474,-0.1171 -0.3532,-0.2926 -0.4984,-0.4006 -0.6088,-0.4498 -1.1664,-0.6814 -1.7733,-1.0391 -1.2784,-0.7898 -2.34,-1.4429 -3.1811,-2.2323 -0.3968,-0.4247 -0.3662,-0.8266 -0.4008,-1.2101 l -3.8472,1.2452 8.0045,5.7362 1.6963,-2.0993 z"
id="path234"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
transform="matrix(0.1343,0.10711,-0.11395,0.14287,0,0)"
id="g236"><path
d="m 4985.5986,3941.9357 c -1.0956,0 -2.6665,-0.048 -3.7216,-0.013 -4.4042,0.1528 -7.7836,1.0656 -11.8429,1.6047 -8.6839,0.9848 -15.887,1.8114 -22.5788,1.3028 -3.3499,-0.4629 -4.6672,-2.2867 -6.2169,-3.8072 l -12.9903,18.4524 57.2507,-2.7706 0.1,-14.7687 z"
id="path238"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><path
d="m 187.367,1086.9849 c -0.0426,-1.0035 -0.868,-1.8049 -1.8822,-1.8049 -0.4156,0 -0.7988,0.1338 -1.1101,0.3606 l -0.489,-0.2324 1.0012,-2.0696 4.3855,2.1152 -0.9958,2.0693 -0.9096,-0.4382 z"
id="path240"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 180.2086,1080.3039 c 0.7586,-0.6588 0.8697,-1.8043 0.2379,-2.5971 -0.2591,-0.3243 -0.603,-0.5409 -0.9746,-0.6429 l -0.1227,-0.5276 2.2419,-0.5076 1.0811,4.7477 -2.2393,0.5119 -0.2243,-0.9844 z"
id="path242"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 180.9609,1070.5462 c 0.9874,0.182 1.9525,-0.4448 2.1782,-1.4335 0.0927,-0.4045 0.0476,-0.8087 -0.1052,-1.1628 l 0.3365,-0.4243 1.7952,1.4357 -3.039,3.805 -1.7958,-1.4315 0.6301,-0.7886 z"
id="path244"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 189.059,1065.0538 c 0.4731,0.8861 1.5653,1.2495 2.4786,0.8095 0.3739,-0.1797 0.6613,-0.4665 0.8438,-0.8064 l 0.5415,0 -0.004,2.2986 -4.8699,0 0,-2.2975 1.0097,6e-4 z"
id="path246"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 198.3934,1067.993 c -0.3971,0.9233 -8e-4,2.003 0.9131,2.4426 0.3739,0.1809 0.777,0.2262 1.1562,0.1562 l 0.3391,0.4227 -1.7989,1.4309 -3.0339,-3.8095 1.7954,-1.4326 0.629,0.7897 z"
id="path248"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 201.9577,1077.1194 c -0.9688,0.2648 -1.5661,1.2481 -1.3408,2.2366 0.0922,0.4045 0.3079,0.7489 0.5987,1.0023 l -0.1182,0.5284 -2.2399,-0.5148 1.0862,-4.7472 2.2394,0.5103 -0.2254,0.9844 z"
id="path250"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 197.0442,1085.5809 c -0.811,-0.5922 -1.9525,-0.4462 -2.5844,0.3469 -0.2588,0.324 -0.394,0.7073 -0.4104,1.0928 l -0.4868,0.2369 -0.9935,-2.0726 4.388,-2.1104 0.9975,2.0695 -0.9104,0.4369 z"
id="path252"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 281.6892,1072.3652 c 0.7671,0.8949 1.5449,1.8431 2.3332,2.8442 0.7883,1.0015 1.5554,2.035 2.3012,3.1003 0.7458,1.0653 1.4595,2.0988 2.1413,3.1003 0.682,1.0014 1.2784,1.9496 1.7898,2.8445 l 9.4603,0 c -0.767,-0.9802 -1.6407,-2.0455 -2.6206,-3.196 -0.9802,-1.1506 -1.9922,-2.3228 -3.0365,-3.5159 -1.044,-1.1931 -2.088,-2.3436 -3.132,-3.4517 -1.044,-1.1078 -1.9922,-2.1305 -2.8445,-3.0682 1.0655,-1.0228 2.2161,-2.2479 3.4517,-3.6754 1.2359,-1.4276 2.4503,-2.9084 3.6437,-4.4425 1.1931,-1.5341 2.2903,-3.0682 3.2918,-4.6023 1.0015,-1.5341 1.8003,-2.8979 2.397,-4.091 l -9.0127,0 c -0.5114,1.0653 -1.1827,2.2692 -2.0138,3.6116 -0.8308,1.3423 -1.7149,2.6632 -2.6526,3.9632 -0.9375,1.2997 -1.8856,2.5353 -2.8443,3.7074 -0.959,1.1718 -1.8431,2.1413 -2.653,2.9083 l 0,-14.1905 -7.9262,0 0,43.0189 7.9262,1.3422 0,-26.2074 z"
id="path254"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 329.694,1055.2343 c -1.4491,-0.3836 -3.2069,-0.7671 -5.2736,-1.1506 -2.0668,-0.3835 -4.3146,-0.5752 -6.7436,-0.5752 -2.4719,0 -4.4958,0.3408 -6.0727,1.0225 -1.5766,0.682 -2.823,1.6515 -3.7392,2.9086 -0.9161,1.2572 -1.5449,2.738 -1.8859,4.4425 -0.3407,1.7045 -0.5113,3.5796 -0.5113,5.625 l 0,16.7474 7.8624,0 0,-15.7246 c 0,-2.77 0.3302,-4.826 0.9907,-6.1685 0.6605,-1.3422 1.9497,-2.0134 3.8673,-2.0134 1.1931,0 2.3862,0.1066 3.5796,0.3194 l 0,23.5871 7.9263,0 0,-29.0202 z"
id="path256"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 355.7095,1069.4248 c 0,2.8125 -0.4581,4.9646 -1.3743,6.4559 -0.9161,1.4916 -2.3119,2.2374 -4.1867,2.2374 -0.8524,0 -1.694,-0.1174 -2.5248,-0.3518 -0.8312,-0.2341 -1.5449,-0.5219 -2.1416,-0.8629 l 0,-16.2997 c 0.5967,-0.1279 1.2251,-0.2132 1.8859,-0.2557 0.6604,-0.043 1.2251,-0.064 1.6937,-0.064 2.0454,0 3.6649,0.6925 4.858,2.0775 1.1931,1.385 1.7898,3.7395 1.7898,7.0634 z m 7.9903,-0.1919 c 0,-2.3862 -0.3198,-4.5491 -0.959,-6.488 -0.6392,-1.9389 -1.5766,-3.59 -2.8125,-4.9538 -1.2359,-1.3637 -2.7485,-2.4182 -4.5383,-3.164 -1.7898,-0.7458 -3.8353,-1.1186 -6.1364,-1.1186 -2.0455,0 -4.1338,0.1491 -6.2643,0.4473 -2.1308,0.2982 -3.9206,0.6818 -5.3694,1.1506 l 0,42.124 7.8622,1.3422 0,-15.0214 c 1.108,0.5114 2.1733,0.8629 3.196,1.0548 1.0228,0.1916 2.0455,0.2877 3.0683,0.2877 1.9604,0 3.6861,-0.373 5.1777,-1.1188 1.4913,-0.7458 2.738,-1.8111 3.7392,-3.1961 1.0015,-1.3847 1.7581,-3.0362 2.2694,-4.9538 0.5114,-1.9176 0.7671,-4.0481 0.7671,-6.3921"
id="path258"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 367.5986,1068.9772 c 0,2.6422 0.405,4.9646 1.2146,6.9676 0.8096,2.0026 1.8751,3.6754 3.1961,5.0176 1.3209,1.3425 2.8338,2.3544 4.5382,3.0364 1.7048,0.6818 3.4518,1.0228 5.2416,1.0228 4.4319,0 7.7984,-1.3105 10.0995,-3.9314 2.3012,-2.6206 3.4518,-6.4451 3.4518,-11.4738 0,-0.5114 -0.0108,-1.044 -0.0321,-1.5979 -0.0212,-0.5542 -0.0532,-1.0015 -0.0958,-1.3425 l -19.4958,0 c 0,-1.9601 0.8096,-3.505 2.429,-4.634 1.6192,-1.1294 3.7074,-1.694 6.2643,-1.694 1.5766,0 3.0787,0.1703 4.5062,0.5113 1.4278,0.341 2.6314,0.6818 3.6116,1.0228 l 1.0868,-6.7119 c -1.3637,-0.4686 -2.8125,-0.8629 -4.3466,-1.1823 -1.5341,-0.3198 -3.2601,-0.4794 -5.1778,-0.4794 -2.5568,0 -4.8472,0.3303 -6.8714,0.9907 -2.0242,0.6605 -3.75,1.6407 -5.1775,2.9404 -1.4275,1.2997 -2.5251,2.9084 -3.2922,4.826 -0.767,1.9176 -1.1505,4.1547 -1.1505,6.7116 z m 20.1353,3.1323 c 0,0.8096 -0.1066,1.5874 -0.3198,2.3329 -0.2131,0.7458 -0.5538,1.417 -1.0227,2.0137 -0.4686,0.5964 -1.0653,1.0761 -1.7898,1.438 -0.7242,0.3623 -1.6191,0.5434 -2.6847,0.5434 -1.0227,0 -1.9069,-0.1703 -2.6526,-0.5113 -0.7458,-0.341 -1.3638,-0.8096 -1.8536,-1.4063 -0.4901,-0.5967 -0.8737,-1.2784 -1.1506,-2.0455 -0.2772,-0.767 -0.4581,-1.5553 -0.5434,-2.3649 l 12.0172,0 z"
id="path260"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 425.5109,1076.2642 c -0.5113,0.1279 -1.1185,0.2557 -1.8218,0.3835 -0.703,0.1279 -1.4168,0.2452 -2.1413,0.3515 -0.7245,0.1066 -1.4275,0.1812 -2.1092,0.224 -0.6821,0.043 -1.2572,0.064 -1.7261,0.064 -1.1077,0 -2.1945,-0.053 -3.2598,-0.1599 -1.0656,-0.1063 -2.1521,-0.309 -3.2601,-0.6072 l 0,-22.3084 -7.9263,0 0,28.0613 c 2.0883,0.7671 4.2296,1.385 6.4242,1.8539 2.1946,0.4685 4.7622,0.703 7.7026,0.703 0.426,0 1.0332,-0.021 1.8215,-0.064 0.7886,-0.043 1.6302,-0.1174 2.5251,-0.2239 0.8949,-0.1066 1.8003,-0.2345 2.7165,-0.3836 0.9161,-0.1491 1.7365,-0.3515 2.461,-0.6072 l -1.4063,-7.287 z"
id="path262"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 433.5647,1083.2956 c 1.4063,0.3835 3.1428,0.7458 5.2098,1.0868 2.0668,0.3407 4.3146,0.5113 6.7436,0.5113 2.3862,0 4.3679,-0.3305 5.9446,-0.991 1.5766,-0.6604 2.8233,-1.5978 3.7394,-2.8125 0.9162,-1.2144 1.5662,-2.6631 1.9497,-4.3466 0.3835,-1.6833 0.5752,-3.5476 0.5752,-5.5931 l 0,-16.939 -7.8622,0 0,15.9163 c 0,2.8125 -0.3198,4.8367 -0.959,6.0726 -0.6392,1.2357 -1.9389,1.8536 -3.899,1.8536 -0.5967,0 -1.1826,-0.021 -1.7578,-0.064 -0.5754,-0.043 -1.1826,-0.1065 -1.8218,-0.1919 l 0,-23.5868 -7.8625,0 0,29.0841 z"
id="path264"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 463.4796,1068.9772 c 0,2.6422 0.4051,4.9646 1.2146,6.9676 0.8096,2.0026 1.8752,3.6754 3.1961,5.0176 1.3209,1.3425 2.8338,2.3544 4.5383,3.0364 1.7047,0.6818 3.4517,1.0228 5.2415,1.0228 4.432,0 7.7984,-1.3105 10.0996,-3.9314 2.3011,-2.6206 3.4517,-6.4451 3.4517,-11.4738 0,-0.5114 -0.0108,-1.044 -0.032,-1.5979 -0.0213,-0.5542 -0.0533,-1.0015 -0.0958,-1.3425 l -19.4959,0 c 0,-1.9601 0.8096,-3.505 2.429,-4.634 1.6192,-1.1294 3.7075,-1.694 6.2643,-1.694 1.5767,0 3.0787,0.1703 4.5063,0.5113 1.4278,0.341 2.6314,0.6818 3.6116,1.0228 l 1.0868,-6.7119 c -1.3638,-0.4686 -2.8126,-0.8629 -4.3467,-1.1823 -1.5341,-0.3198 -3.2601,-0.4794 -5.1777,-0.4794 -2.5569,0 -4.8473,0.3303 -6.8715,0.9907 -2.0242,0.6605 -3.7499,1.6407 -5.1775,2.9404 -1.4275,1.2997 -2.5251,2.9084 -3.2921,4.826 -0.7671,1.9176 -1.1506,4.1547 -1.1506,6.7116 z m 20.1353,3.1323 c 0,0.8096 -0.1066,1.5874 -0.3197,2.3329 -0.2132,0.7458 -0.5539,1.417 -1.0228,2.0137 -0.4685,0.5964 -1.0652,1.0761 -1.7898,1.438 -0.7242,0.3623 -1.6191,0.5434 -2.6846,0.5434 -1.0228,0 -1.9069,-0.1703 -2.6527,-0.5113 -0.7458,-0.341 -1.3638,-0.8096 -1.8536,-1.4063 -0.4901,-0.5967 -0.8736,-1.2784 -1.1506,-2.0455 -0.2772,-0.767 -0.458,-1.5553 -0.5434,-2.3649 l 12.0172,0 z"
id="path266"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 502.5991,1077.7346 -6.8394,0 0,6.5199 6.8394,0 0,7.5424 7.8625,1.2785 0,-8.8209 12.5923,0 0,-6.5199 -12.5923,0 0,-12.1451 c 0,-1.1081 0.1066,-2.0029 0.3194,-2.6847 0.2132,-0.6817 0.5114,-1.2146 0.8949,-1.5982 0.3836,-0.3835 0.8524,-0.6392 1.4063,-0.767 0.5542,-0.1279 1.1718,-0.1916 1.8539,-0.1916 0.7242,0 1.3955,0.021 2.0134,0.064 0.618,0.043 1.2144,0.1174 1.7898,0.224 0.5752,0.1063 1.1718,0.2662 1.7898,0.4793 0.618,0.2132 1.2889,0.4901 2.0135,0.8309 l 1.0868,-6.7757 c -1.4491,-0.5964 -3.0153,-1.0225 -4.6985,-1.2781 -1.6832,-0.2557 -3.3131,-0.3836 -4.8897,-0.3836 -1.8326,0 -3.4518,0.1491 -4.8581,0.4473 -1.4062,0.2982 -2.5996,0.8737 -3.5795,1.7258 -0.9803,0.8524 -1.7261,2.0562 -2.2374,3.6116 -0.5114,1.5554 -0.7671,3.5904 -0.7671,6.1044 l 0,12.337 z"
id="path268"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 527.4003,1068.9772 c 0,2.6422 0.4051,4.9646 1.2146,6.9676 0.8096,2.0026 1.8751,3.6754 3.1961,5.0176 1.3209,1.3425 2.8338,2.3544 4.5383,3.0364 1.7047,0.6818 3.4517,1.0228 5.2415,1.0228 4.432,0 7.7984,-1.3105 10.0996,-3.9314 2.3011,-2.6206 3.4517,-6.4451 3.4517,-11.4738 0,-0.5114 -0.0108,-1.044 -0.032,-1.5979 -0.0213,-0.5542 -0.0533,-1.0015 -0.0958,-1.3425 l -19.4959,0 c 0,-1.9601 0.8096,-3.505 2.429,-4.634 1.6192,-1.1294 3.7075,-1.694 6.2643,-1.694 1.5766,0 3.0787,0.1703 4.5063,0.5113 1.4278,0.341 2.6314,0.6818 3.6116,1.0228 l 1.0868,-6.7119 c -1.3638,-0.4686 -2.8126,-0.8629 -4.3467,-1.1823 -1.5341,-0.3198 -3.2601,-0.4794 -5.1777,-0.4794 -2.5569,0 -4.8473,0.3303 -6.8715,0.9907 -2.0242,0.6605 -3.7499,1.6407 -5.1775,2.9404 -1.4275,1.2997 -2.5251,2.9084 -3.2921,4.826 -0.7671,1.9176 -1.1506,4.1547 -1.1506,6.7116 z m 20.1353,3.1323 c 0,0.8096 -0.1066,1.5874 -0.3197,2.3329 -0.2132,0.7458 -0.5539,1.417 -1.0228,2.0137 -0.4685,0.5964 -1.0652,1.0761 -1.7898,1.438 -0.7242,0.3623 -1.6191,0.5434 -2.6847,0.5434 -1.0227,0 -1.9068,-0.1703 -2.6526,-0.5113 -0.7458,-0.341 -1.3638,-0.8096 -1.8536,-1.4063 -0.4901,-0.5967 -0.8736,-1.2784 -1.1506,-2.0455 -0.2772,-0.767 -0.4581,-1.5553 -0.5434,-2.3649 l 12.0172,0 z"
id="path270"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
d="m 571.9533,1060.1561 c 1.9176,0 3.3876,0.1386 4.4104,0.4155 1.0227,0.277 1.5341,0.8416 1.5341,1.694 0,0.5539 -0.1599,1.0227 -0.4793,1.4063 -0.3198,0.3835 -0.7671,0.7137 -1.3425,0.9907 -0.5752,0.2769 -1.2357,0.5434 -1.9814,0.7991 -0.7458,0.2557 -1.5234,0.5113 -2.3332,0.767 -1.1506,0.3407 -2.3225,0.735 -3.5156,1.1826 -1.1931,0.4473 -2.2799,1.012 -3.2601,1.6937 -0.9799,0.6821 -1.7898,1.5449 -2.429,2.5889 -0.6392,1.044 -0.9587,2.3545 -0.9587,3.9311 0,1.2784 0.2449,2.4823 0.735,3.6116 0.4901,1.1294 1.2572,2.1305 2.3012,3.0042 1.044,0.8736 2.3757,1.5554 3.9952,2.0455 1.6191,0.4901 3.5583,0.7353 5.8166,0.7353 1.9605,0 3.782,-0.1494 5.4652,-0.4476 1.6835,-0.2982 3.1428,-0.7246 4.3787,-1.2784 l -1.2143,-6.6479 c -0.7246,0.2132 -1.8539,0.5647 -3.388,1.0548 -1.5341,0.4901 -3.2599,0.735 -5.1775,0.735 -2.003,0 -3.3559,-0.2449 -4.0589,-0.735 -0.7033,-0.4901 -1.0548,-1.0122 -1.0548,-1.5661 0,-0.4689 0.1599,-0.8841 0.4793,-1.2464 0.3198,-0.3623 0.7458,-0.6925 1.2785,-0.9907 0.5326,-0.2985 1.1506,-0.5859 1.8538,-0.8632 0.703,-0.2769 1.4593,-0.5431 2.2692,-0.7988 1.1505,-0.3835 2.3437,-0.8098 3.5796,-1.2784 1.2356,-0.4689 2.3544,-1.0548 3.3556,-1.7578 1.0015,-0.7032 1.8218,-1.5981 2.461,-2.6847 0.6393,-1.0868 0.959,-2.4185 0.959,-3.9951 0,-1.2359 -0.2344,-2.4078 -0.7033,-3.5158 -0.4688,-1.1078 -1.2464,-2.0668 -2.3332,-2.8763 -1.0865,-0.8096 -2.5035,-1.4488 -4.2505,-1.9177 -1.7473,-0.4688 -3.8994,-0.703 -6.4562,-0.703 -2.5994,0 -4.8152,0.2982 -6.6478,0.8946 -1.8323,0.5967 -3.3024,1.1294 -4.4104,1.5982 l 1.2143,6.5838 c 1.4916,-0.5964 3.079,-1.1506 4.7622,-1.662 1.6832,-0.5114 3.3985,-0.767 5.1458,-0.767"
id="path272"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></svg>

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -7,15 +7,11 @@ alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
#if [ -e $(dirname "$0")/nsenter ]; then
#Change for centos bash running
if [ -e $(dirname '$0')/nsenter ]; then
if [ -e $(dirname "$0")/nsenter ]; then
# with boot2docker, nsenter is not in the PATH but it is in the same folder
NSENTER=$(dirname "$0")/nsenter
else
# if nsenter has already been installed with path notified, here will be clarified
NSENTER=$(which nsenter)
#NSENTER=nsenter
NSENTER=nsenter
fi
[ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return

View File

@@ -1,12 +1,12 @@
# 高级网络配置
本章将介绍 Docker 的一些高级网络配置和选项
# 進階網路設定
本章將介紹 Docker 的一些進階網路設定和選項
Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一 bridge可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发
Docker 啟動時,會自動在主機上建立一個 `docker0` 虛擬橋接器,實際上是 Linux 的一 bridge可以理解為一個軟體交換機。它會在掛載到它的網卡之間進行轉發
Docker 随机分配一本地未占用的私有段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定)中的一地址 `docker0` 接口。比如典型的 `172.17.42.1`掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一同一段(`172.17.0.0/16`)的址。
Docker 隨機分配一本地未占用的私有段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定)中的一地址 `docker0` 接口。比如典型的 `172.17.42.1`網路遮罩為 `255.255.0.0`。此後啟動的容器內的網卡也會自動分配一同一段(`172.17.0.0/16`)的址。
当创建一个 Docker 容器的候,同时会创建了一 `veth pair` 接口(当数据包发送到一接口,另外一接口也可以收到相同的数据包)。这对接口一端在容器,即 `eth0`;另一端在本地并被挂载`docker0` 网桥,名`veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主可以跟容器通信,容器之也可以相互通信。Docker 就建了在主和所有容器之间一个虚拟共享网络
當建立一個 Docker 容器的候,同時會建立了一 `veth pair` 接口(當數據包發送到一接口,另外一接口也可以收到相同的數據包)。這對接口一端在容器,即 `eth0`;另一端在本地並被掛載`docker0` 網橋,名`veth` 開頭(例如 `vethAQI2QT`)。透過這種方式,主可以跟容器通信,容器之也可以相互通信。Docker 就建了在主和所有容器之間一個虛擬共享網路
![Docker 网络](../_images/network.png)
![Docker 網路](../_images/network.png)
接下的部分将介绍在一些景中Docker 所有的网络定制配置。以及通过 Linux 命令来调整、充、甚至替 Docker 默认的网络配置
接下的部分將介紹在一些景中Docker 所有的網路自訂設定。以及透過 Linux 命令來調整、充、甚至替 Docker 預設的網路設定

View File

@@ -1,35 +1,35 @@
## 容器访问控制
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现`iptables` 是 Linux 上默的防火墙软件,在大部分行版中都自
## 容器訪問控制
容器的訪問控制,主要透過 Linux 上的 `iptables` 防火墻來進行管理和實做`iptables` 是 Linux 上默的防火墻軟件,在大部分行版中都自
### 容器访问外部网络
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系中,检查转发是否打
### 容器訪問外部網路
容器要想訪問外部網路,需要本地系統的轉發支持。在Linux 系中,檢查轉發是否打
```
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
如果 0说明没有开启转发,则需要手动打开
如果 0說明沒有開啟轉發,則需要手動打開
```
$sysctl -w net.ipv4.ip_forward=1
```
如果在启动 Docker 服务的时候设`--ip-forward=true`, Docker 就会自动设定系`ip_forward` 参数为 1。
如果在啟動 Docker 服務的時候設`--ip-forward=true`, Docker 就會自動設定系`ip_forward` 參數為 1。
### 容器之间访问
容器之相互访问,需要方面的支持。
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
* 本地系的防火墙软件 -- `iptables` 是否允许通过
### 容器之間訪問
容器之相互訪問,需要方面的支持。
* 容器的網路拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
* 本地系的防火墻軟件 -- `iptables` 是否允許透過
#### 访问所有端口
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 上。策略为通过`ACCEPT`是禁止(`DROP`)取决于配置`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 则不会添加 `iptables` 规则
#### 訪問所有端口
當啟動 Docker 服務時候,默認會新增一條轉發策略到 iptables 的 FORWARD 上。策略為透過`ACCEPT`是禁止(`DROP`)取決於設定`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 則不會新增 `iptables` 規則
,默认情况下,不同容器之是允许网络互通的。如果了安全考,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 禁止它。
,默認情況下,不同容器之是允許網路互通的。如果了安全考,可以在 `/etc/default/docker` 文件中設定 `DOCKER_OPTS=--icc=false` 禁止它。
#### 访问指定端口
通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的放端口。
#### 訪問指定端口
透過 `-icc=false` 關閉網路訪問後,還可以透過 `--link=CONTAINER_NAME:ALIAS` 選項來訪問容器的放端口。
例如,在启动 Docker 服务时,可以同使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系中的 `iptables` 规则
例如,在啟動 Docker 服務時,可以同使用 `icc=false --iptables=true` 參數來關閉允許相互的網路訪問,並讓 Docker 可以修改系中的 `iptables` 規則
,系中的 `iptables` 规则可能是
,系中的 `iptables` 規則可能是
```
$ sudo iptables -nL
...
@@ -39,9 +39,9 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0
...
```
后,启动容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker `iptable`为 两个容器分别添加一条 `ACCEPT` 规则,允相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
後,啟動容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 選項。Docker `iptable`為 兩個容器分別新增一條 `ACCEPT` 規則,允相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE 行)。
当添加`--link=CONTAINER_NAME:ALIAS` 选项后,添加`iptables` 规则
當新增`--link=CONTAINER_NAME:ALIAS` 選項後,新增`iptables` 規則
```
$ sudo iptables -nL
...
@@ -52,4 +52,4 @@ ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
```
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 参数指定的名字。主机名则不会被识别
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 參數指定的名字。主機名則不會被識別

View File

@@ -1,21 +1,21 @@
## 自定义网桥
除了默`docker0` 网桥,用户也可以指定网桥来连接各容器。
## 自定義網橋
除了默`docker0` 網橋,使用者也可以指定網橋來連接各容器。
启动 Docker 服务的时候,使用 `-b BRIDGE``--bridge=BRIDGE` 指定使用的网桥
啟動 Docker 服務的時候,使用 `-b BRIDGE``--bridge=BRIDGE` 指定使用的網橋
如果服务已经运行,那需要先停止服务,并删除旧的网桥
如果服務已經執行,那需要先停止服務,並刪除舊的網橋
```
$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
```
后创建一个网桥 `bridge0`
後建立一個網橋 `bridge0`
```
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
```
查看确认网桥创建并启动
查看確認網橋建立並啟動
```
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
@@ -23,12 +23,12 @@ $ ip addr show bridge0
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
```
配置 Docker 服,默认桥接到创建的网桥上。
設定 Docker 服,默認橋接到建立的網橋上。
```
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start
```
启动 Docker 服
新建一容器,可以看到它已经桥接到了 `bridge0` 上。
啟動 Docker 服
新建一容器,可以看到它已經橋接到了 `bridge0` 上。
可以继续`brctl show` 命令查看接的息。另外,在容器中可以使用 `ip addr``ip route` 命令查看 IP 地址配置和路由息。
可以繼續`brctl show` 命令查看接的息。另外,在容器中可以使用 `ip addr``ip route` 命令查看 IP 地址設定和路由息。

View File

@@ -1,5 +1,5 @@
## 编辑网络配置文件
## 編輯網路設定文件
Docker 1.2.0 始支持在行中的容器里编辑 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
Docker 1.2.0 始支持在行中的容器裡編輯 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
但是些修改是临时的,只在行的容器中保留,容器止或重启后并不会被保存下。也不`docker commit` 提交。
但是些修改是臨時的,只在行的容器中保留,容器止或重啟後並不會被保存下。也不`docker commit` 提交。

View File

@@ -1,8 +1,8 @@
## 配置 DNS
Docker 没有为每个容器专门定制像,那么怎么自定义配置容器的主名和 DNS 配置呢?
就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
## 設定 DNS
Docker 沒有為每個容器專門定制像,那麽怎麽自定義設定容器的主名和 DNS 設定呢?
就是它利用虛擬文件來掛載到來容器的 3 個相關設定文件。
在容器中使用 mount 命令可以看到挂载信息:
在容器中使用 mount 命令可以看到掛載訊息:
```
$ mount
...
@@ -11,19 +11,19 @@ $ mount
tmpfs on /etc/resolv.conf type tmpfs ...
...
```
这种机制可以宿主主 DNS 信息发生更新,所有 Docker 容器的 dns 配置通过 `/etc/resolv.conf` 文件立刻得到更新。
這種機制可以宿主主 DNS 訊息發生更新,所有 Docker 容器的 dns 設定透過 `/etc/resolv.conf` 文件立刻得到更新。
如果用户想要手指定容器的配置,可以利用下面的选项
如果使用者想要手指定容器的設定,可以利用下面的選項
`-h HOSTNAME or --hostname=HOSTNAME`
定容器的主名,它会被写到容器`/etc/hostname``/etc/hosts`。但它在容器外部看不到,既不`docker ps`示,也不在其他的容器的 `/etc/hosts` 看到。
定容器的主名,它會被寫到容器`/etc/hostname``/etc/hosts`。但它在容器外部看不到,既不`docker ps`示,也不在其他的容器的 `/etc/hosts` 看到。
`--link=CONTAINER_NAME:ALIAS`
选项会在创建容器的候,添加一个其他容器的主名到 `/etc/hosts` 文件中,新容器的程可以使用主名 ALIAS 就可以接它。
選項會在建立容器的候,新增一個其他容器的主名到 `/etc/hosts` 文件中,新容器的程可以使用主名 ALIAS 就可以接它。
`--dns=IP_ADDRESS`
添加 DNS 服器到容器的 `/etc/resolv.conf` 中,容器用这个服务器来解析所有不在 `/etc/hosts` 中的主名。
新增 DNS 服器到容器的 `/etc/resolv.conf` 中,容器用這個伺服器來解析所有不在 `/etc/hosts` 中的主名。
`--dns-search=DOMAIN`
定容器的搜索域,当设定搜索域 `.example.com` ,在搜索一个名为 host 的主机时DNS 不搜索host还会搜索 `host.example.com`
意:如果有上述最 2 个选项Docker 会默认用主上的 `/etc/resolv.conf` 来配置容器。
定容器的搜索域,當設定搜索域 `.example.com` ,在搜索一個名為 host 的主機時DNS 不搜索host還會搜索 `host.example.com`
意:如果有上述最 2 個選項Docker 會默認用主上的 `/etc/resolv.conf` 來設定容器。

View File

@@ -1,22 +1,22 @@
## 配置 docker0 网桥
Docker 服务默认会创建一个 `docker0` 网桥(其上有一 `docker0` 部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主都放到同一物理网络
## 設定 docker0 網橋
Docker 服務默認會建立一個 `docker0` 網橋(其上有一 `docker0` 部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主都放到同一物理網路
Docker 默指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之可以通过网桥相互通信,它还给出了 MTU接口允接收的最大传输单元),通常是 1500 Bytes或宿主主机网络路由上支持的默值。些值都可以在服务启动的时候进行配置
* `--bip=CIDR` -- IP 地址加掩格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置
Docker 默指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之可以透過網橋相互通信,它還給出了 MTU接口允接收的最大傳輸單元),通常是 1500 Bytes或宿主主機網路路由上支持的默值。些值都可以在服務啟動的時候進行設定
* `--bip=CIDR` -- IP 地址加掩格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆蓋默認的 Docker mtu 設定
也可以在配置文件中配置 DOCKER_OPTS后重启服务
目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 查看网桥和端口连接信息。
也可以在設定文件中設定 DOCKER_OPTS後重啟服務
目前 Docker 網橋是 Linux 網橋,使用者可以使用 `brctl show` 查看網橋和端口連接訊息。
```
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
vethdda6
```
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 来安装
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 來安裝
每次创建一个新容器的Docker 可用的地址段中选择一个空闲的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默认网关
每次建立一個新容器的Docker 可用的地址段中選擇一個空閑的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默認網關
```
$ sudo docker run -i -t --rm base /bin/bash
$ ip addr show eth0

View File

@@ -1,8 +1,8 @@
## 工具和示例
在介自定义网络拓扑之前,你可能会对一些外部工具和例子感趣:
在介自定義網路拓撲之前,你可能會對一些外部工具和例子感趣:
### pipework
Jérôme Petazzoni 编写了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以帮助用户在比较复杂的场景中完成容器的接。
Jérôme Petazzoni 編寫了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以幫助使用者在比較復雜的場景中完成容器的接。
### playground
Brandon Rhodes 建了一提供完整的 Docker 容器网络拓扑管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。
Brandon Rhodes 建了一提供完整的 Docker 容器網路拓撲管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。

View File

@@ -1,10 +1,10 @@
## 映射容器端口到宿主主机的实现
## 映射容器端口到宿主主機的實做
认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
### 容器访问外部实现
容器所有到外部网络的连接,源地址都被NAT成本地系的IP地址。是使用 `iptables` 的源地址伪装操作实现的。
認情況下,容器可以主動訪問到外部網路的連接,但是外部網路無法訪問到容器。
### 容器訪問外部實做
容器所有到外部網路的連接,源地址都被NAT成本地系的IP地址。是使用 `iptables` 的源地址偽裝操作實做的。
查看主的 NAT 规则
查看主的 NAT 規則
```
$ sudo iptables -t nat -nL
...
@@ -13,15 +13,15 @@ target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
...
```
其中,上述规则将所有源地址在 `172.17.0.0/16` 段,目地址其他段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好是它能动态从网卡获取地址。
其中,上述規則將所有源地址在 `172.17.0.0/16` 段,目地址其他段(外部網路)的流量動態偽裝為從系統網卡發出。MASQUERADE 跟傳統 SNAT 的好是它能動態從網卡取得地址。
### 外部访问容器实现
### 外部訪問容器實做
容器允外部访问,可以在 `docker run` 时候通过 `-p``-P` 参数来启用。
容器允外部訪問,可以在 `docker run` 時候透過 `-p``-P` 參數來啟用。
不管用那种办法,其也是在本地的 `iptable` 的 nat 表中添加相应的规则
不管用那種辦法,其也是在本地的 `iptable` 的 nat 表中新增相應的規則
使用 `-P`
使用 `-P`
```
$ iptables -t nat -nL
...
@@ -30,14 +30,14 @@ target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
```
使用 `-p 80:80`
使用 `-p 80:80`
```
$ iptables -t nat -nL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
```
意:
* 这里的规则映射了 0.0.0.0,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p
IP::port` 指定允许访问容器的主上的 IP、接口等以制定更格的规则
* 如果希望永久定到某固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之后重启 Docker 服即可生效。
意:
* 這裡的規則映射了 0.0.0.0,意味著將接受主機來自所有接口的流量。使用者可以透過 `-p IP:host_port:container_port` 或 `-p
IP::port` 指定允許訪問容器的主上的 IP、接口等以制定更格的規則
* 如果希望永久定到某固定的 IP 地址,可以在 Docker 設定文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之後重啟 Docker 服即可生效。

View File

@@ -1,11 +1,11 @@
## 示例:创建一个点到点连
认情况Docker 会将所有容器接到由 `docker0` 提供的虚拟子网中。
## 示例:建立一個點到點連
認情況Docker 會將所有容器接到由 `docker0` 提供的虛擬子網中。
用户有时候需要两个容器之可以直通信,而不用通过主机网桥进行桥接。
使用者有時候需要兩個容器之可以直通信,而不用透過主機網橋進行橋接。
决办法很简单:创建一对 `peer` 接口,分放到两个容器中,配置成点到点链路类型即可。
決辦法很簡單:建立一對 `peer` 接口,分放到兩個容器中,設定成點到點鏈路類型即可。
首先启动 2 容器:
首先啟動 2 容器:
```
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/#
@@ -13,7 +13,7 @@ $ sudo docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/#
```
找到进程号,然后创建网络名字空的跟文件。
找到程式號,然後建立網路名字空的跟文件。
```
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
@@ -24,7 +24,7 @@ $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
```
创建一对 `peer` 接口,然后配置路由
建立一對 `peer` 接口,然後設定路由
```
$ sudo ip link add A type veth peer name B
@@ -38,8 +38,8 @@ $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
$ sudo ip netns exec 3004 ip link set B up
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
```
现在这 2 容器就可以相互 ping 通,成功建立接。点到点链路不需要子和子网掩码
現在這 2 容器就可以相互 ping 通,成功建立接。點到點鏈路不需要子和子網掩碼
此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器可以通过原先的网络来通信。
此外,也可以不指定 `--net=none` 來建立點到點鏈路。這樣容器可以透過原先的網路來通信。
利用似的法,可以创建一个只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 来关闭容器之的通信。
利用似的法,可以建立一個只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 來關閉容器之的通信。

View File

@@ -1,23 +1,23 @@
## 快速配置指南
## 快速設定指南
下面是一跟 Docker 网络相关的命令列表。
下面是一跟 Docker 網路相關的命令列表。
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器挂载的网桥
* `--bip=CIDR` --定制 docker0 的掩
* `-H SOCKET... or --host=SOCKET...` --Docker 服端接收命令的通道
* `--icc=true|false` --是否支持容器之间进行通信
* `--ip-forward=true|false` --看下文容器之的通信
* `--iptables=true|false` --禁止 Docker 添加 iptables 规则
* `--mtu=BYTES` --容器网络中的 MTU
其中有些命令選項只有在 Docker 服務啟動的時候才能設定,而且不能上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
* `--bip=CIDR` --定制 docker0 的掩
* `-H SOCKET... or --host=SOCKET...` --Docker 服端接收命令的通道
* `--icc=true|false` --是否支持容器之間進行通信
* `--ip-forward=true|false` --看下文容器之的通信
* `--iptables=true|false` --禁止 Docker 新增 iptables 規則
* `--mtu=BYTES` --容器網路中的 MTU
下面2命令选项既可以在启动服务时指定,也可以 Docker 容器启动`docker run`候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执`docker run` 可以覆盖设置的默值。
* `--dns=IP_ADDRESS...` --使用指定的DNS服
下面2命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動`docker run`候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執`docker run` 可以覆蓋設置的默值。
* `--dns=IP_ADDRESS...` --使用指定的DNS服器
* `--dns-search=DOMAIN...` --指定DNS搜索域
后这些选项只有在 `docker run` 执行时使用,因它是针对容器的特性容。
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主
* `--link=CONTAINER_NAME:ALIAS` --添加到另一容器的
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的接模式
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主
後這些選項只有在 `docker run` 執行時使用,因它是針對容器的特性容。
* `-h HOSTNAME or --hostname=HOSTNAME` --設定容器主
* `--link=CONTAINER_NAME:ALIAS` --新增到另一容器的
* `--net=bridge|none|container:NAME_or_ID|host` --設定容器的接模式
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主

View File

@@ -1,168 +1,168 @@
# Docker命令查
# Docker命令查
##基本
##基本
docker [OPTIONS] COMMAND [arg...]
一般来说Docker 命令可以用管理 daemon或者通过 CLI 命令管理镜像和容器。可以通过 `man docker` 查看些命令。
一般來說Docker 命令可以用管理 daemon或者透過 CLI 命令管理映像檔和容器。可以透過 `man docker` 查看些命令。
##选项
##選項
-D=true|false
使用 debug 模式。默认为 false。
使用 debug 模式。預設為 false。
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]来绑定或者 unix://[/path/to/socket] 使用。
在 daemon 模式下定的 socket通过一个或多 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 指定。
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]來綁定或者 unix://[/path/to/socket] 使用。
在 daemon 模式下定的 socket透過一個或多 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 指定。
--api-enable-cors=true|false
端 API 中用 CORS 头。缺省为 false。
端 API 中用 CORS 頭。預設為 false。
-b=""
容器挂载到一已存在的网桥上。指定 'none' 时则禁用容器的网络
容器掛載到一已存在的網橋上。指定 'none' 時則禁用容器的網路
--bip=""
让动态创建的 docker0 采用定的 CIDR 地址; -b 选项互斥。
讓動態建立的 docker0 采用定的 CIDR 地址; -b 選項互斥。
-d=true|false
使用 daemon 模式。缺省为 false。
使用 daemon 模式。預設為 false。
--dns=""
Docker 使用定的 DNS 服器。
Docker 使用定的 DNS 服器。
-g=""
指定 Docker 运行时的 root 路径。缺省为 /var/lib/docker。
指定 Docker 執行時的 root 路徑。預設為 /var/lib/docker。
--icc=true|false
用容器通信。默认为 true。
用容器通信。預設為 true。
--ip=""
定端口候的默认 IP 地址。缺省为 0.0.0.0。
定端口候的預設 IP 地址。預設為 0.0.0.0。
--iptables=true|false
禁止 Docker 添加 iptables 规则。缺省为 true。
禁止 Docker 新增 iptables 規則。預設為 true。
--mtu=VALUE
指定容器网络的 mtu。缺省为 1500。
指定容器網路的 mtu。預設為 1500。
-p=""
指定 daemon 的 PID 文件路径。缺省为 /var/run/docker.pid。
指定 daemon 的 PID 文件路徑。預設為 /var/run/docker.pid。
-s=""
制 Docker 运行时使用定的存储驱动
制 Docker 執行時使用定的存儲驅動
-v=true|false
出版本信息并退出。缺省值为 false。
出版本資訊並退出。預設值為 false。
--selinux-enabled=true|false
用 SELinux 支持。缺省值为 false。SELinux 目前不支持 BTRFS 存储驱动
用 SELinux 支持。預設值為 false。SELinux 目前不支持 BTRFS 存儲驅動
##命令
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式行。者一致。
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式行。者一致。
docker-attach(1)
依附到一正在行的容器中。
依附到一正在行的容器中。
docker-build(1)
从一个 Dockerfile 创建一个镜像
從一個 Dockerfile 建立一個映像檔
docker-commit(1)
从一个容器的修改中创建一个新的镜像
從一個容器的修改中建立一個新的映像檔
docker-cp(1)
容器中复制文件到宿主系
容器中複製文件到宿主系
docker-diff(1)
查一容器文件系的修改
查一容器文件系的修改
docker-events(1)
从服务端获取实时的事件
從服務端取得實時的事件
docker-export(1)
出容器内容为一个 tar 包
出容器內容為一個 tar 包
docker-history(1)
示一个镜像的历
示一個映像檔的歷
docker-images(1)
列出存在的镜像
列出存在的映像檔
docker-import(1)
入一文件(典型 tar 包)路或目录来创建一个镜像
入一文件(典型 tar 包)路或目錄來建立一個映像檔
docker-info(1)
示一些相的系统信息
示一些相的系統資訊
docker-inspect(1)
示一容器的底层具体信息
示一容器的底層具體資訊
docker-kill(1)
关闭一个运行中的容器 (包括程和所有源)
關閉一個執行中的容器 (包括程和所有源)
docker-load(1)
从一个 tar 包中加载一个镜像
從一個 tar 包中載入一個映像檔
docker-login(1)
注册或登到一 Docker 的仓库服务
註冊或登到一 Docker 的倉庫伺服
docker-logout(1)
Docker 的仓库服务器登出
Docker 的倉庫伺服器登出
docker-logs(1)
取容器的 log 信息
容器的 log 資訊
docker-pause(1)
停一容器中的所有
停一容器中的所有程
docker-port(1)
查找一 nat 到一私有口的公共口
查找一 nat 到一私有口的公共口
docker-ps(1)
列出容器
docker-pull(1)
从一个Docker的仓库服务器下拉一个镜像或仓库
從一個Docker的倉庫伺服器下拉一個映像檔或倉庫
docker-push(1)
将一个镜像或者仓库推送到一 Docker 的注册服务
將一個映像檔或者倉庫推送到一 Docker 的註冊伺服
docker-restart(1)
启一个运行中的容器
新啟動一個執行中的容器
docker-rm(1)
删除给定的若干个容器
刪除指定的數個容器
docker-rmi(1)
删除给定的若干个镜像
刪除指定的數個映像檔
docker-run(1)
创建一个新容器,在其中运行给定命令
建立一個新容器,在其中執行指定命令
docker-save(1)
保存一个镜像为 tar 包文件
保存一個映像檔為 tar 包文件
docker-search(1)
在 Docker index 中搜索一个镜像
在 Docker index 中搜索一個映像檔
docker-start(1)
启动一个容器
啟動一個容器
docker-stop(1)
止一个运行中的容器
止一個執行中的容器
docker-tag(1)
为一个镜像打标签
為一個映像檔打標簽
docker-top(1)
查看一容器中的正在行的进程信息
查看一容器中的正在行的程式資訊
docker-unpause(1)
将一个容器所有的进程从暂停状态中恢
將一個容器所有的程式從暫停狀態中恢
docker-version(1)
出 Docker 的版本信息
出 Docker 的版本資訊
docker-wait(1)
阻塞直到一容器止,然后输出它的退出符
阻塞直到一容器止,然後輸出它的退出符
##一张图总结 Docker 的命令
##一張圖總結 Docker 的命令
![命令周期](../_images/cmd_logic.png)

View File

@@ -1,2 +1,2 @@
# 常见仓库介绍
本章将介绍常见的一些仓库和镜像的功能,使用方法和生成它的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
# 常見倉庫介紹
本章將介紹常見的一些倉庫和鏡像的功能,使用方法和生成它的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。

View File

@@ -1,11 +1,11 @@
## [CentOS](https://registry.hub.docker.com/_/centos/)
### 基本
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 行版,其件包大多跟 RedHat 系列保持一致。
该仓库提供了 CentOS 5 ~ 7 各版本的像。
### 基本
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 行版,其件包大多跟 RedHat 系列保持一致。
該倉庫提供了 CentOS 5 ~ 7 各版本的像。
### 使用方法
认会启动一个最小化的 CentOS 境。
認會啟動一個最小化的 CentOS 境。
```
$ sudo docker run --name some-centos -i -t centos bash
bash-4.2#

View File

@@ -1,20 +1,20 @@
## [MongoDB](https://registry.hub.docker.com/_/mongo/)
### 基本
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是源的 NoSQL 数据库实现
该仓库提供了 MongoDB 2.2 ~ 2.7 各版本的像。
### 基本
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是源的 NoSQL 數據庫實做
該倉庫提供了 MongoDB 2.2 ~ 2.7 各版本的像。
### 使用方法
认会`27017` 端口启动数据库
認會`27017` 端口啟動數據庫
```
$ sudo docker run --name some-mongo -d mongo
```
使用其他应用连接到容器,可以用
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
```
或者通过 `mongo`
或者透過 `mongo`
```
$ sudo docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
```

View File

@@ -1,19 +1,19 @@
## [MySQL](https://registry.hub.docker.com/_/mysql/)
### 基本
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是源的关系数据库实现
该仓库提供了 MySQL 各版本的像,包括 5.6 系列、5.7 系列等。
### 基本
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是源的關系數據庫實做
該倉庫提供了 MySQL 各版本的像,包括 5.6 系列、5.7 系列等。
### 使用方法
认会`3306` 端口启动数据库
認會`3306` 端口啟動數據庫
```
$ sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
```
就可以使用其它应用来连接到容器。
就可以使用其它應用來連接到容器。
```
$ sudo docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
```
或者通过 `mysql`
或者透過 `mysql`
```
$ sudo docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```

View File

@@ -1,34 +1,34 @@
## [Nginx](https://registry.hub.docker.com/_/nginx/)
### 基本
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议
该仓库提供了 Nginx 1.0 ~ 1.7 各版本的像。
### 基本
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是源的有效率的 Web 伺服器實做,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等協議
該倉庫提供了 Nginx 1.0 ~ 1.7 各版本的像。
### 使用方法
下面的命令将作为一个静态页面服务器启动
下面的命令將作為一個靜態頁面伺服器啟動
```
$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
用户也可以不使用这种映射方式,通过利用 Dockerfile 直接将静态页面内容放到像中,内容为
使用者也可以不使用這種映射方式,透過利用 Dockerfile 直接將靜態頁面內容放到像中,內容為
```
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```
生成新的像,并启动一个容器。
生成新的像,並啟動一個容器。
```
$ sudo docker build -t some-content-nginx .
$ sudo docker run --name some-nginx -d some-content-nginx
```
放端口,映射到本地的 `8080` 端口。
放端口,映射到本地的 `8080` 端口。
```
sudo docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它使用本地的配置文件,例如
Nginx的默認設定文件路徑為 `/etc/nginx/nginx.conf`,可以透過映射它使用本地的設定文件,例如
```
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
```
使用配置文件时,为了在容器中正常行,需要保持 `daemon off;`
使用設定文件時,為了在容器中正常行,需要保持 `daemon off;`
### Dockerfile
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)

View File

@@ -1,23 +1,23 @@
## [Node.js](https://registry.hub.docker.com/_/node/)
### 基本
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基 JavaScript 的可展服端和网络软件开发平台
该仓库提供了 Node.js 0.8 ~ 0.11 各版本的像。
### 基本
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基 JavaScript 的可展服端和網路軟件開發平臺
該倉庫提供了 Node.js 0.8 ~ 0.11 各版本的像。
### 使用方法
目中创建一个 Dockerfile。
目中建立一個 Dockerfile。
```
FROM node:0.10-onbuild
# replace this with your application's default port
EXPOSE 8888
```
后创建镜像,并启动容器
後建立鏡像,並啟動容器
```
$ sudo docker build -t my-nodejs-app
$ sudo docker run -it --rm --name my-running-app my-nodejs-app
```
也可以直接行一个简单容器。
也可以直接行一個簡單容器。
```
$ sudo docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
```

View File

@@ -1,25 +1,25 @@
## [Redis](https://registry.hub.docker.com/_/redis/)
### 基本
[Redis](https://en.wikipedia.org/wiki/Redis) 是源的存 Key-Value 数据库实现
该仓库提供了 Redis 2.6 ~ 2.8.9 各版本的像。
### 基本
[Redis](https://en.wikipedia.org/wiki/Redis) 是源的存 Key-Value 數據庫實做
該倉庫提供了 Redis 2.6 ~ 2.8.9 各版本的像。
### 使用方法
认会`6379` 端口启动数据库
認會`6379` 端口啟動數據庫
```
$ sudo docker run --name some-redis -d redis
```
另外可以用 [持久存](http://redis.io/topics/persistence)。
另外可以用 [持久存](http://redis.io/topics/persistence)。
```
$ sudo docker run --name some-redis -d redis redis-server --appendonly yes
```
认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 将数据存放到本地。
認數據存儲位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 將數據存放到本地。
使用其他应用连接到容器,可以用
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-redis:redis -d application-that-uses-redis
```
或者通过 `redis-cli`
或者透過 `redis-cli`
```
$ sudo docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
```

View File

@@ -1,11 +1,11 @@
## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/)
### 基本
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 行版,其自带软件版本往往新一些。
该仓库提供了 Ubuntu12.04 ~ 14.10 各版本的像。
### 基本
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 行版,其自帶軟件版本往往新一些。
該倉庫提供了 Ubuntu12.04 ~ 14.10 各版本的像。
### 使用方法
认会启动一个最小化的 Ubuntu 境。
認會啟動一個最小化的 Ubuntu 境。
```
$ sudo docker run --name some-ubuntu -i -t ubuntu
root@523c70904d54:/#

View File

@@ -1,19 +1,19 @@
## [WordPress](https://registry.hub.docker.com/_/wordpress/)
### 基本
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是源的 Blog 和容管理系框架,它基 PhP 和 MySQL。
该仓库提供了 WordPress 4.0 版本的像。
### 基本
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是源的 Blog 和容管理系框架,它基 PhP 和 MySQL。
該倉庫提供了 WordPress 4.0 版本的像。
### 使用方法
启动容器需要 MySQL 的支持,默端口 `80`
啟動容器需要 MySQL 的支持,默端口 `80`
```
$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
启动 WordPress 容器可以指定的一些环境参数包括
* `-e WORDPRESS_DB_USER=...` 缺省 “root”
* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变`MYSQL_ROOT_PASSWORD` 的值
* `-e WORDPRESS_DB_NAME=...` 缺省 “wordpress”
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串
啟動 WordPress 容器可以指定的一些環境參數包括
* `-e WORDPRESS_DB_USER=...` 缺省 “root”
* `-e WORDPRESS_DB_PASSWORD=...` 缺省為連接 mysql 容器的環境變`MYSQL_ROOT_PASSWORD` 的值
* `-e WORDPRESS_DB_NAME=...` 缺省 “wordpress”
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省為隨機 sha1 串
### Dockerfile
* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile)

View File

@@ -1,7 +1,7 @@
# 资源链
* Docker 主站: https://www.docker.io
* Docker 注册中心API: http://docs.docker.com/reference/api/registry_api/
# 資源鏈
* Docker 主站: https://www.docker.io
* Docker 註冊中心API: http://docs.docker.com/reference/api/registry_api/
* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
* Docker 远端应用API: http://docs.docker.com/reference/api/docker_remote_api/
* Dockerfile https://docs.docker.com/reference/builder/
* Dockerfile 最佳实践https://docs.docker.com/articles/dockerfile_best-practices/
* Docker 遠端應用API: http://docs.docker.com/reference/api/docker_remote_api/
* Dockerfile https://docs.docker.com/reference/builder/
* Dockerfile 最佳實踐https://docs.docker.com/articles/dockerfile_best-practices/

View File

@@ -1,8 +1,9 @@
# 基本概念
Docker 包括三基本概念
* 镜像Image
Docker 包括三基本概念
* 映像檔Image
* 容器Container
* 仓库Repository
* 倉庫Repository
理解了这三个概念,就理解了 Docker 的整生命期。
理解了這三個概念,就理解了 Docker 的整生命期。

View File

@@ -1,8 +1,8 @@
## Docker 容器
Docker 利用容器来运行应用。
Docker 利用容器來執行應用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、除。每容器都是相互隔的、保安全的平台。
容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、除。每容器都是相互隔的、保安全的平台。
可以把容器看做是一个简易版的 Linux 包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程
可以把容器看做是一個簡易版的 Linux 包括root使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上
*註:映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上

View File

@@ -1,8 +1,8 @@
## Docker 镜像
Docker 镜像就是一个只读的模板。
## Docker 映像檔
Docker 映像檔就是一個唯讀的模板。
例如:一个镜像可以包含一完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它用程
例如:一個映像檔可以包含一完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它用程
镜像可以用来创建 Docker 容器。
映像檔可以用來建立 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新有的镜像,用户甚至可以直接其他人那里下载一个已经做好的镜像来直接使用。
Docker 提供了一個很簡單的機制來建立映像檔或者更新有的映像檔,使用者甚至可以直接其他人那裡下載一個已經做好的映像檔來直接使用。

View File

@@ -1,14 +1,14 @@
## Docker 仓库
## Docker 倉庫
仓库是集中存放镜像文件的所。有时候会把仓库和仓库注册服务器Registry混为一谈并不严格区分。实际上仓库注册服务器上往往存放着多个仓库每个仓库中又包含了多个镜像每个镜像有不同的标签tag
倉庫是集中存放映像檔文件的所。有時候會把倉庫和倉庫註冊伺服器Registry混為一談並不嚴格區分。實際上倉庫註冊伺服器上往往存放著多個倉庫每個倉庫中又包含了多個映像檔每個鏡像有不同的標籤tag
仓库分为公开仓库Public和私有仓库Private两种形式。
倉庫分為公開倉庫Public和私有倉庫Private兩種形式。
最大的公开仓库是 [Docker Hub](https://hub.docker.com),存放了数量庞大的镜像供用户下载
国内的公开仓库包括 [Docker Pool](http://www.dockerpool.com) 等,可以提供大陆用户更稳定快速的访问
最大的公開倉庫是 [Docker Hub](https://hub.docker.com),存放了數量龐大的映像檔供使用者下載
大陸的公開倉庫包括 [Docker Pool](http://www.dockerpool.com) 等,可以提供大陸使用者更穩定快速的訪問
然,用户也可以在本地网络内创建一个私有仓库
然,使用者也可以在本地網路內建立一個私有倉庫
当用户创建了自己的镜像之后就可以使用 `push` 命令它上到公有或者私有仓库,这样下次在另外一台器上使用这个镜像时候,只需要从仓库`pull`就可以了。
當使用者建立了自己的映像檔之後就可以使用 `push` 命令它上到公有或者私有倉庫,這樣下次在另外一台器上使用這個映像檔時候,只需要從倉庫`pull`就可以了。
*Docker 仓库的概念跟 [Git](http://git-scm.com) 似,注册服务器可以理解 GitHub 这样的托管服
*Docker 倉庫的概念跟 [Git](http://git-scm.com) 似,註冊伺服器可以理解 GitHub 這樣的託管服

View File

@@ -1,2 +1,2 @@
#实战案例
一些典型的应用场景和案例。
#實戰案例
一些典型的應用場景和案例。

View File

@@ -1,5 +1,5 @@
## 多物理主机之间的容器互(暴露容器到真实网络中)
Docker 默认的桥接网卡是 docker0。它只在本机桥接所有的容器卡,举例来说容器的虚拟网卡在主上看一般叫做 veth*** 而 Docker 只是把所有这些网卡桥接在一起,下:
## 多物理主機之間的容器互(暴露容器到真實網路中)
Docker 默認的橋接網卡是 docker0。它只在本機橋接所有的容器卡,舉例來說容器的虛擬網卡在主上看一般叫做 veth*** 而 Docker 只是把所有這些網卡橋接在一起,下:
```
[root@opnvz ~]# brctl show
bridge name bridge id STP enabled interfaces
@@ -7,7 +7,7 @@ docker0 8000.56847afe9799 no veth0889
veth3c7b
veth4061
```
在容器中看到的地址一般是像下面这样的地址:
在容器中看到的地址一般是像下面這樣的地址:
```
root@ac6474aeb31d:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
@@ -23,17 +23,17 @@ root@ac6474aeb31d:~# ip a
inet6 fe80::487d:68ff:feda:9cf/64 scope link
valid_lft forever preferred_lft forever
```
这样就可以把这个网络看成是一私有的网络,通过 nat 接外,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数
這樣就可以把這個網路看成是一私有的網路,透過 nat 接外,如果要讓外網連接到容器中,就需要做端口映射,即 -p 參數
如果在企业内部应用,或者做多物理主的集群,可能需要将多个物理主的容器到一物理网络中来,那就需要将这个网桥桥接到我指定的卡上。
如果在企業內部應用,或者做多物理主的集群,可能需要將多個物理主的容器到一物理網路中來,那就需要將這個網橋橋接到我指定的卡上。
### 拓扑图
A 和主 B 的卡一都连着物理交换机的同一 vlan 101,这样网桥一和网桥三就相当于在同一物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理器互
![物理拓扑图](../_images/container_connect_topology.png)
### 拓撲圖
A 和主 B 的卡一都連著物理交換機的同一 vlan 101,這樣網橋一和網橋三就相當於在同一物理網路中了,而容器一、容器三、容器四也在同一物理網路中了,他們之間可以相互通信,而且可以跟同一 vlan 中的其他物理器互
![物理拓撲圖](../_images/container_connect_topology.png)
### ubuntu 示例
下面以 ubuntu 为例创建多个主机的容器联网:
建自己的网桥,编辑 /etc/network/interface 文件
下面以 ubuntu 為例建立多個主機的容器聯網:
自己的網橋,編輯 /etc/network/interface 文件
```
auto br0
iface br0 inet static
@@ -44,9 +44,9 @@ bridge_ports em1
bridge_stp off
dns-nameservers 8.8.8.8 192.168.6.1
```
Docker 的默认网桥绑定到这个新建的 br0 上面,这样就将这台机器上容器定到 em1 这个网卡所对应的物理网络上了。
Docker 的默認網橋綁定到這個新建的 br0 上面,這樣就將這臺機器上容器定到 em1 這個網卡所對應的物理網路上了。
ubuntu 修改 /etc/default/docker 文件,添加最后一行
ubuntu 修改 /etc/default/docker 文件,新增最後一行
```
# Docker Upstart and SysVinit configuration file
@@ -64,7 +64,7 @@ ubuntu 修改 /etc/default/docker 文件,添加最后一行内容
DOCKER_OPTS="-b=br0"
```
启动 Docker 的候 使用 -b 参数 将容器定到物理网络上。重 Docker 服务后,再入容器可以看到它已经绑定到你的物理网络上了。
啟動 Docker 的候 使用 -b 參數 將容器定到物理網路上。重 Docker 服務後,再入容器可以看到它已經綁定到你的物理網路上了。
```
root@ubuntudocker:~# docker ps
@@ -75,4 +75,4 @@ bridge name bridge id STP enabled interfaces
br0 8000.7e6e617c8d53 no em1
vethe6e5
```
这样就直接把容器暴露到物理网络上了,多物理主的容器也可以相互联网了。需要意的是,这样就需要自己来保证容器的网络安全了。
這樣就直接把容器暴露到物理網路上了,多物理主的容器也可以相網路了。需要意的是,這樣就需要自己來保證容器的網路安全了。

View File

@@ -1,14 +1,14 @@
## 标准化开发测试和生产环
对于大部分企业来说,搭建 PaaS 既有那精力,也没那个必要,用 Docker 做人的 sandbox 用又小了
## 標準化開發測試和生產環
對於大部分企業來說,搭建 PaaS 既有那精力,也沒那個必要,用 Docker 做人的 sandbox 用又小了
可以用 Docker 来标准化开发、测试、生产环境。
可以用 Docker 來標準化開發、測試、生產環境。
![业应用结构](../_images/enterprise_usage.png)
![業應用結構](../_images/enterprise_usage.png)
Docker 占用源小,在一 E5 128 G 存的服器上部署 100 容器都绰绰有余,可以单独抽一容器或者直接在宿主物理主上部署 samba利用 samba 的 home 分享方案将每个用户的 home 目映射到开发中心和测试部门的 Windows 器上。
Docker 占用源小,在一 E5 128 G 存的服器上部署 100 容器都綽綽有余,可以單獨抽一容器或者直接在宿主物理主上部署 samba利用 samba 的 home 分享方案將每個使用者的 home 目映射到開發中心和測試部門的 Windows 器上。
针对某个项目组,由架构师搭建好一个标准的容器境供项目组和测试部门使用,每个开发工程可以有自己单独的容器,通过 `docker run -v` 将用户的 home 目映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然分配一容器使用 `-v` 加载测试部门的 home 目录启动即可。这样,在公司部的开发、测试基本就一了,不会出现开发部门提交的代码,测试部门部署不了的问题
針對某個項目組,由架構師搭建好一個標準的容器境供項目組和測試部門使用,每個開發工程可以有自己單獨的容器,透過 `docker run -v` 將使用者的 home 目映射到容器中。需要提交測試時,只需要將代碼移交給測試部門,然分配一容器使用 `-v` 載入測試部門的 home 目錄啟動即可。這樣,在公司部的開發、測試基本就一了,不會出現開發部門提交的代碼,測試部門部署不了的問題
测试部门发布测试通过的报告后,架构师再一次检测容器境,就可以直接交由部署工程师将代码和容器分部署到生产环境中了。这种方式的部署横向性能的展性也好。
測試部門發布測試透過的報告後,架構師再一次檢測容器境,就可以直接交由部署工程師將代碼和容器分部署到生產環境中了。這種方式的部署橫向效能的展性也好。

View File

@@ -1,10 +1,10 @@
## 使用 Supervisor 管理
Docker 容器在启动的时候开启单个进程,比如,一 ssh 或者 apache 的 daemon 服。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。
## 使用 Supervisor 管理程
Docker 容器在啟動的時候開啟單個程式,比如,一 ssh 或者 apache 的 daemon 服。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令到一個啟動腳本裡面,啟動的時候直接啟動這個腳本,另外就是安裝程式管理工具。
本小节将使用进程管理工具 supervisor 管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望行的进程。在这里我们演示一下如何同使用 ssh 和 apache 服
本小節將使用程式管理工具 supervisor 管理容器中的多個程式。使用 Supervisor 可以更好的控制、管理、重啟我們希望行的程式。在這裡我們演示一下如何同使用 ssh 和 apache 服
### 配置
首先创建一个 Dockerfile容和各部分的解释如下。
### 設定
首先建立一個 Dockerfile容和各部分的解釋以下。
```
FROM ubuntu:13.04
MAINTAINER examples@docker.com
@@ -13,29 +13,28 @@ RUN apt-get update
RUN apt-get upgrade -y
```
### 安装 ssh、apache 和 supervisor
### 安 supervisor
安裝 ssh、apache 和 supervisor。
```
RUN apt-get install -y --force-yes perl-base=5.14.2-6ubuntu2
RUN apt-get install -y apache2.2-common
RUN apt-get install -y openssh-server apache2 supervisor
RUN mkdir -p /var/run/sshd
RUN mkdir -p /var/log/supervisor
```
这里安装 3 个软件,还创建了 2 ssh 和 supervisor 服正常行所需要的目
這裡安裝 3 個軟件,還建立了 2 ssh 和 supervisor 服正常行所需要的目
```
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
```
添加 supervisord 的配置文件,并复制配置文件到对应目录下面。
新增 supervisord 的設定文件,並復制設定文件到對應目錄下面。
```
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
```
这里我们映射了 22 和 80 端口,使用 supervisord 的可行路径启动服务
這裡我們映射了 22 和 80 端口,使用 supervisord 的可行路徑啟動服務
### supervisor配置文件
### supervisor設定文件
```
[supervisord]
nodaemon=true
@@ -45,22 +44,22 @@ command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
```
配置文件包含目录和进程,第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。
設定文件包含目錄和程式,第一段 supervsord 設定軟件本身,使用 nodaemon 參數來執行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
### 使用方法
创建镜像。
建立鏡像。
```
$ sudo docker build -t test/supervisord .
```
启动 supervisor 容器。
啟動 supervisor 容器。
```
$ sudo docker run -p 22 -p 80 -t -i test/supervisord
$ sudo docker run -p 22 -p 80 -t -i test/supervisords
2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file)
2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
2013-11-25 18:53:22,342 INFO supervisord started with pid 1
2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
```
使用 `docker run` 来启动我们创建的容器。使用多 `-p` 映射多端口,这样我们就能同时访问 ssh 和 apache 服了。
使用 `docker run` 來啟動我們建立的容器。使用多 `-p` 映射多端口,這樣我們就能同時訪問 ssh 和 apache 服了。
可以使用这个方法创建一个只有 ssh 服的基础镜像,之后创建镜像可以使用这个镜像为基础来创建
可以使用這個方法建立一個只有 ssh 服的基礎鏡像,之後建立鏡像可以使用這個鏡像為基礎來建立

View File

@@ -1,11 +1,11 @@
## 建 tomcat/weblogic 集群
### 安 tomcat
准备好需要的 jdk、tomcat 等件放到 home 目下面,启动一个容器
## 建 tomcat/weblogic 集群
### 安 tomcat
準備好需要的 jdk、tomcat 等件放到 home 目下面,啟動一個容器
```
docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash
```
这条命令挂载本地 home 目到容器的 /opt/data 目,容器内目录若不存在,则会自动创建。接下就是 tomcat 的基本配置jdk 环境变量设置好之后,将 tomcat 程放到 /opt/apache-tomcat 下面
编辑 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat
這條命令掛載本地 home 目到容器的 /opt/data 目,容器內目錄若不存在,則會自動建立。接下就是 tomcat 的基本設定jdk 環境變量設置好之後,將 tomcat 程放到 /opt/apache-tomcat 下面
編輯 /etc/supervisor/conf.d/supervisor.conf 文件,新增 tomcat
```
[supervisord]
nodaemon=true
@@ -15,25 +15,22 @@ command=/opt/apache-tomcat/bin/startup.sh
[program:sshd]
command=/usr/sbin/sshd -D
```
```
docker commit ac6474aeb31d tomcat
```
新建 tomcat 文件,新建 Dockerfile。
新建 tomcat 文件,新建 Dockerfile。
```
FROM mk_tomcat
EXPOSE 22 8080
CMD ["/usr/bin/supervisord"]
```
Dockerfile 创建镜像。
Dockerfile 建立鏡像。
```
docker build tomcat tomcat
```
### 安 weblogic
### 安 weblogic
和 tomcat 基本一致,这里贴一下配置文件
和 tomcat 基本一致,這裡貼一下設定文件
```
supervisor.conf
[supervisord]
@@ -51,35 +48,34 @@ EXPOSE 22 7001
CMD ["/usr/bin/supervisord"]
```
### tomcat/weblogic 像的使用
#### 存的使用
启动的时候,使用 `-v` 参数
### tomcat/weblogic 像的使用
#### 存的使用
啟動的時候,使用 `-v` 參數
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
本地磁映射到容器部,它在主和容器之间是实时变化的,所以我更新程、上传代码只需要更新物理主的目就可以了
本地磁映射到容器部,它在主和容器之間是實時變化的,所以我更新程、上傳代碼只需要更新物理主的目就可以了
#### tomcat 和 weblogic 集群的实现
tomcat 只要开启多个容器即可
#### tomcat 和 weblogic 集群的實做
tomcat 只要開啟多個容器即可
```
docker run -d -v -p 204:22 -p 7003:8080 -v /home/data:/opt/data --name tm1 tomcat /usr/bin/supervisord
docker run -d -v -p 205:22 -p 7004:8080 -v /home/data:/opt/data --name tm2 tomcat /usr/bin/supervisord
docker run -d -v -p 206:22 -p 7005:8080 -v /home/data:/opt/data --name tm3 tomcat /usr/bin/supervisord
```
这里说一下 weblogic 的配置,大家知道 weblogic 有一域的概念。如果要使用常的 administrator +node 的方式部署,就需要在 supervisord 中分别写出 administartor server 和 node server 的启动脚本,这样做的优点是:
這裡說一下 weblogic 的設定,大家知道 weblogic 有一域的概念。如果要使用常的 administrator +node 的方式部署,就需要在 supervisord 中分別寫出 administartor server 和 node server 的啟動腳本,這樣做的優點是:
* 可以使用 weblogic 的集群,同步等概念
* 部署一集群用程,只需要安一次用到集群上即可
* 部署一集群用程,只需要安一次用到集群上即可
是:
* Docker 配置复杂
* 没办法自动扩展集群的算容量,如需添加节点,需要在 administrator 上先创建节点,然后再配置新的容器 supervisor 启动脚本,然后再启动容器
另外种方法是将所有的程序都安装在 adminiserver 上面,需要扩展的时候,启动多个节点即可,它的优点和缺点和上一种方法恰恰相反。(建议使用这种方式来部署开发和测试环境)
是:
* Docker 設定復雜
* 沒辦法自動擴展集群的算容量,如需新增節點,需要在 administrator 上先建立節點,然後再設定新的容器 supervisor 啟動腳本,然後再啟動容器
另外種方法是將所有的程式都安裝在 adminiserver 上面,需要擴展的時候,啟動多個節點即可,它的優點和缺點和上一種方法恰恰相反。(建議使用這種方式來部署開發和測試環境)
```
docker run -d -v -p 204:22 -p 7001:7001 -v /home/data:/opt/data --name node1 weblogic /usr/bin/supervisord
docker run -d -v -p 205:22 -p 7002:7001 -v /home/data:/opt/data --name node2 weblogic /usr/bin/supervisord
docker run -d -v -p 206:22 -p 7003:7001 -v /home/data:/opt/data --name node3 weblogic /usr/bin/supervisord
```
这样在前端使用 nginx 来做负载均衡就可以完成配置
這樣在前端使用 nginx 來做負載均衡就可以完成設定

View File

@@ -1,4 +0,0 @@
# Docker Compose 项目
Docker Compose 是 Docker 官方编排Orchestration项目之一负责快速在集群中部署分布式应用。
本章将介绍 Compose 项目情况以及安装和使用。

View File

@@ -1,142 +0,0 @@
## Compose 命令说明
大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,命令则应用在项目所有的服务上。
执行 `docker-compose [COMMAND] --help` 查看具体某个命令的使用说明。
基本的使用格式是
```sh
docker-compose [options] [COMMAND] [ARGS...]
```
## 选项
* `--verbose` 输出更多调试信息。
* `--version` 打印版本并退出。
* `-f, --file FILE` 使用特定的 compose 模板文件,默认为 `docker-compose.yml`
* `-p, --project-name NAME` 指定项目名称,默认使用目录名称。
## 命令
### `build`
构建或重新构建服务。
服务一旦构建后,将会带上一个标记名,例如 web_db。
可以随时在项目目录下运行 `docker-compose build` 来重新构建服务。
### `help`
获得一个命令的帮助。
### `kill`
通过发送 `SIGKILL` 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如
```sh
$ docker-compose kill -s SIGINT
```
### `logs`
查看服务的输出。
### `port`
打印绑定的公共端口。
### `ps`
列出所有容器。
### `pull`
拉取服务镜像。
### `rm`
删除停止的服务容器。
### `run`
在一个服务上执行一个命令。
例如:
```
$ docker-compose run ubuntu ping docker.com
```
将会启动一个 ubuntu 服务,执行 `ping docker.com` 命令。
默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。
两个不同点:
* 给定命令将会覆盖原有的自动运行命令;
* 不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 `--no-deps` 选项,例如
```
$ docker-compose run --no-deps web python manage.py shell
```
将不会启动 web 容器所关联的其它容器。
### `scale`
设置同一个服务运行的容器个数。
通过 `service=num` 的参数来设置数量。例如:
```
$ docker-compose scale web=2 worker=3
```
### `start`
启动一个已经存在的服务容器。
### `stop`
停止一个已经运行的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器。
### `up`
构建,(重新)创建,启动,链接一个服务相关的容器。
链接的服务都将会启动,除非他们已经运行。
默认情况, `docker-compose up` 将会整合所有容器的输出,并且退出时,所有容器将会停止。
如果使用 `docker-compose up -d` ,将会在后台启动并运行所有的容器。
默认情况,如果该服务的容器已经存在, `docker-compose up` 将会停止并尝试重新创建他们(保持使用 `volumes-from` 挂载的卷),以保证 `docker-compose.yml` 的修改生效。如果你不想容器被停止并重新创建,可以使用 `docker-compose up --no-recreate`。如果需要的话,这样将会启动已经停止的容器。
## 环境变量
环境变量可以用来配置 Compose 的行为。
`DOCKER_`开头的变量和用来配置 Docker 命令行客户端的使用一样。如果使用 boot2docker , `$(boot2docker shellinit)` 将会设置它们为正确的值。
### `COMPOSE_PROJECT_NAME`
设置通过 Compose 启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。
### `COMPOSE_FILE`
设置要使用的 `docker-compose.yml` 的路径。默认路径是当前工作目录。
### `DOCKER_HOST`
设置 Docker daemon 的地址。默认使用 `unix:///var/run/docker.sock`,与 Docker 客户端采用的默认值一致。
### `DOCKER_TLS_VERIFY`
如果设置不为空,则与 Docker daemon 交互通过 TLS 进行。
### `DOCKER_CERT_PATH`
配置 TLS 通信所需要的验证(`ca.pem``cert.pem``key.pem`)文件的路径,默认是 `~/.docker`

View File

@@ -1,63 +0,0 @@
## 安装
安装 Compose 之前,要先安装 Docker在此不再赘述。
### PIP 安装
这种方式最为推荐。
执行命令。
```sh
$ sudo pip install -U docker-compose
```
安装成功后,可以查看 `docker-compose` 命令的用法。
```sh
$ docker-compose -h
Fast, isolated development environments using Docker.
Usage:
docker-compose [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
--verbose Show more output
--version Print version and exit
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
Commands:
build Build or rebuild services
help Get help on a command
kill Kill containers
logs View output from containers
port Print the public port for a port binding
ps List containers
pull Pulls service images
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
restart Restart services
up Create and start containers
```
之后,可以添加 bash 补全命令。
```sh
$ curl -L https://raw.githubusercontent.com/docker/compose/1.2.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```
### 二进制包
发布的二进制包可以在 [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 找到。
下载后直接放到执行路径即可。
例如,在常见的 Linux 平台上。
```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose
```

View File

@@ -1,10 +0,0 @@
## 简介
Compose 项目目前在 [Github](https://github.com/docker/compose) 上进行维护,目前最新版本是 1.2.0。
Compose 定位是“defining and running complex applications with Docker”前身是 Fig兼容 Fig 的模板文件。
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板YAML 格式)中定义一组相关联的应用容器(被称为一个 `project`,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
![](../_images/docker_compose.jpg)
该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现。

View File

@@ -1,207 +0,0 @@
## 使用
### 术语
首先介绍几个术语。
* 服务service一个应用容器实际上可以运行多个相同镜像的实例。
* 项目(project):由一组关联的应用容器组成的一个完整业务单元。
可见一个项目可以由多个服务容器关联而成Compose 面向项目进行管理。
### 场景
下面,我们创建一个经典的 Web 项目:一个 [Haproxy](www.haproxy.org),挂载三个 Web 容器。
创建一个 `compose-haproxy-web` 目录,作为项目工作目录,并在其中分别创建两个子目录:`haproxy``web`
### Web 子目录
这里用 Python 程序来提供一个简单的 HTTP 服务,打印出访问者的 IP 和 实际的本地 IP。
#### index.py
编写一个 `index.py` 作为服务器文件,代码为
```sh
#!/usr/bin/python
#authors: yeasy.github.com
#date: 2013-07-05
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import socket
import fcntl
import struct
import pickle
from datetime import datetime
from collections import OrderedDict
class HandlerClass(SimpleHTTPRequestHandler):
def get_ip_address(self,ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def log_message(self, format, *args):
if len(args) < 3 or "200" not in args[1]:
return
try:
request = pickle.load(open("pickle_data.txt","r"))
except:
request=OrderedDict()
time_now = datetime.now()
ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
server = self.get_ip_address('eth0')
host=self.address_string()
addr_pair = (host,server)
if addr_pair not in request:
request[addr_pair]=[1,ts]
else:
num = request[addr_pair][0]+1
del request[addr_pair]
request[addr_pair]=[num,ts]
file=open("index.html", "w")
file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\" face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></center>");
for pair in request:
if pair[0] == host:
guest = "LOCAL: "+pair[0]
else:
guest = pair[0]
if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d %H:%M:%S')).seconds < 3:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"red\">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color=\"blue\">"+guest+"</font>&gt to WebServer &lt<font color=\"blue\">"+pair[1]+"</font>&gt</p>")
else:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color=\"navy\">"+guest+"</font>&gt to WebServer &lt<font color=\"navy\">"+pair[1]+"</font>&gt</p>")
file.write("</body> </html>");
file.close()
pickle.dump(request,open("pickle_data.txt","w"))
if __name__ == '__main__':
try:
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
HandlerClass.protocol_version = Protocol
httpd = ServerClass((addr, port), HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
except:
exit()
```
#### index.html
生成一个临时的 `index.html` 文件,其内容会被 index.py 更新。
```sh
$ touch index.html
```
#### Dockerfile
生成一个 Dockerfile内容为
```sh
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
```
### haproxy 目录
在其中生成一个 `haproxy.cfg` 文件,内容为
```sh
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen stats :70
stats enable
stats uri /
frontend balancer
bind 0.0.0.0:80
mode http
default_backend web_backends
backend web_backends
mode http
option forwardfor
balance roundrobin
server weba weba:80 check
server webb webb:80 check
server webc webc:80 check
option httpchk GET /
http-check expect status 200
```
### docker-compose.yml
编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。
```sh
weba:
build: ./web
expose:
- 80
webb:
build: ./web
expose:
- 80
webc:
build: ./web
expose:
- 80
haproxy:
image: haproxy:latest
volumes:
- ./haproxy:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- weba
- webb
- webc
ports:
- "80:80"
- "70:70"
expose:
- "80"
- "70"
```
### 运行 compose 项目
现在 compose-haproxy-web 目录长成下面的样子。
```sh
compose-haproxy-web
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
└── web
├── Dockerfile
├── index.html
└── index.py
```
在该目录下执行 `docker-compose up` 命令,会整合输出所有容器的输出。
```
$sudo docker-compose up
Recreating composehaproxyweb_webb_1...
Recreating composehaproxyweb_webc_1...
Recreating composehaproxyweb_weba_1...
Recreating composehaproxyweb_haproxy_1...
Attaching to composehaproxyweb_webb_1, composehaproxyweb_webc_1, composehaproxyweb_weba_1, composehaproxyweb_haproxy_1
```
此时访问本地的 80 端口,会经过 haproxy 自动转发到后端的某个 web 容器上,刷新页面,可以观察到访问的容器地址的变化。
访问本地 70 端口,可以查看到 haproxy 的统计信息。
当然,还可以使用 consul、etcd 等实现服务发现,这样就可以避免手动指定后端的 web 容器了,更为灵活。

View File

@@ -1,259 +0,0 @@
## YAML 模板文件
默认的模板文件是 `docker-compose.yml`,其中定义的每个服务都必须通过 `image` 指令指定镜像或 `build` 指令(需要 Dockerfile来自动构建。
其它大部分指令都跟 `docker run` 中的类似。
如果使用 `build` 指令,在 `Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV` 等) 将会自动被获取,无需在 `docker-compose.yml` 中再次设置。
### `image`
指定为镜像名称或镜像 ID。如果镜像在本地不存在`Compose` 将会尝试拉去这个镜像。
例如:
```sh
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
```
### `build`
指定 `Dockerfile` 所在文件夹的路径。 `Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。
```
build: /path/to/build/dir
```
### `command`
覆盖容器启动后默认执行的命令。
```sh
command: bundle exec thin -p 3000
```
### `links`
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `SERVICE:ALIAS` 格式都可以。
```sh
links:
- db
- db:database
- redis
```
使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如:
```sh
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
```
相应的环境变量也将被创建。
### `external_links`
链接到 docker-compose.yml 外部的容器,甚至 并非 `Compose` 管理的容器。参数格式跟 `links` 类似。
```
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
```
### `ports`
暴露端口信息。
使用宿主:容器 `HOST:CONTAINER`格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
```
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
```
*注:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 `YAML` 将会解析 `xx:yy` 这种数字格式为 60 进制。所以建议采用字符串格式。*
### `expose`
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数
```sh
expose:
- "3000"
- "8000"
```
### `volumes`
卷挂载路径设置。可以设置宿主机路径 `HOST:CONTAINER` 或加上访问模式 `HOST:CONTAINER:ro`)。
```sh
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
```
### `volumes_from`
从另一个服务或容器挂载它的所有卷。
```sh
volumes_from:
- service_name
- container_name
```
### `environment`
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
```
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
```
### `env_file`
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 `docker-compose -f FILE` 指定了模板文件,则 `env_file` 中路径会基于模板文件路径。
如果有变量名称与 `environment` 指令冲突,则以后者为准。
```sh
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
```
环境变量文件中每一行必须符合格式,支持 `#` 开头的注释行。
```sh
# common.env: Set Rails/Rack environment
RACK_ENV=development
```
### `extends`
基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 `common.yml`
```sh
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
```
编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。
```sh
# development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
```
后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。
### `net`
设置网络模式。使用和 `docker client``--net` 参数一样的值。
```sh
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
```
### `pid`
跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
```sh
pid: "host"
```
### `dns`
配置 DNS 服务器。可以是一个值,也可以是一个列表。
```sh
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
```
### `cap_add, cap_drop`
添加或放弃容器的 Linux 能力Capabiliity
```sh
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
```
### `dns_search`
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
```sh
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
```
### `working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares`
这些都是和 `docker run` 支持的选项类似。
```
cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
restart: always
stdin_open: true
tty: true
```

View File

@@ -1,6 +1,6 @@
# Docker 容器
容器是 Docker 又一核心概念。
简单的说,容器是独立运行的一或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的用。
簡單的說,容器是獨立執行的一或一組應用,以及它們的執行態環境。換句話說,虛擬機可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他系統環境)和跑在上面的用。
本章将具体介绍如何管理一容器,包括创建、启动和停止等。
本章將具體介紹如何管理一容器,包括建立、啟動和停止等。

View File

@@ -1,37 +1,22 @@
##后台(background)运
##守護態執
更多的候,需要 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此,可以通过添加 `-d` 参数来实现
更多的候,需要 Docker 容器在後臺以守護態Daemonized形式執行。此,可以透過新增 `-d` 參數來實做
下面举两个例子来说明一下
如果不使用 `-d` 参数运行容器。
```
$ sudo docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
```
容器会把输出的结果(STDOUT)打印到宿主机上面
如果使用了 `-d` 参数运行容器。
例以下面的命令會在後臺執行容器
```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
```
此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
**注:** 容器是否会长久运行是和docker run指定的命令有关`-d` 参数无关
使用 `-d` 参数启动后会返回一个唯一的 id也可以通过 `docker ps` 命令来查看容器信息。
容器啟動後會返回一個唯一的 id也可以透過 `docker ps` 命令來查看容器訊息
```
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
```
取容器的输出信息,可以通过 `docker logs` 命令。
要取容器的輸出訊息,可以透過 `docker logs` 命令。
```
$ sudo docker logs [container ID or NAMES]
$ sudo docker logs insane_babbage
hello world
hello world
hello world

View File

@@ -1,8 +1,8 @@
## 入容器
在使用 `-d` 参数时,容器启动后会进入后台
某些候需要入容器行操作,有很多方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
## 入容器
在使用 `-d` 參數時,容器啟動後會進入後臺
某些候需要入容器行操作,有很多方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
### attach 命令
`docker attach` 是Docker自带的命令。下面示例如何使用命令。
`docker attach` 是Docker內建的命令。下面示例如何使用命令。
```
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
@@ -12,12 +12,12 @@ CONTAINER ID IMAGE COMMAND CREATED
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
```
但是使用 `attach` 命令有时候并不方便。当多个窗口同 attach 到同一容器的候,所有窗口都同步示。当某个窗口因命令阻塞,其他窗口也无法执行操作了。
但是使用 `attach` 命令有時候並不方便。當多個窗口同 attach 到同一容器的候,所有窗口都同步示。當某個窗口因命令阻塞,其他窗口也無法執行操作了。
### nsenter 命令
#### 安
`nsenter` 工具在 util-linux 2.23版本后包含
如果系中 util-linux 包没有该命令,可以按照下面的方法从源码安装
#### 安
`nsenter` 工具已含括在 util-linux 2.23 後的版本內
如果系中 util-linux 包沒有該命令,可以按照下面的方法從原始碼安裝
```
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
@@ -25,23 +25,23 @@ $ make nsenter && sudo cp nsenter /usr/local/bin
```
#### 使用
`nsenter` 可以访问另一个进程的名字空。nsenter 要正常工作需要有 root 限。
很不幸Ubuntu 14.04 仍然使用的是 util-linux 2.20。安最新版本的 util-linux2.24)版,按照以下步
`nsenter` 可以訪問另一個程式的名字空。nsenter 要正常工作需要有 root 限。
很不幸Ubuntu 14.4 仍然使用的是 util-linux 2.20。安最新版本的 util-linux2.24)版,按照以下步
```
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin
```
为了连接到容器,你需要找到容器的第一个进程的 PID可以通过下面的命令取。
為了連接到容器,你需要找到容器的第一個程式的 PID可以透過下面的命令取
```
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
```
通过这个 PID就可以接到这个容器:
透過這個 PID就可以接到這個容器:
```
$ nsenter --target $PID --mount --uts --ipc --net --pid
```
下面出一完整的例子。
下面出一完整的例子。
```
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
@@ -53,13 +53,13 @@ $ PID=$(docker-pid 243c32535da7)
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#
```
简单的,建大家下
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker)并将内容放到 .bashrc 中。
簡單的,建大家下
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker)並將內容放到 .bashrc 中。
```
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
```
这个文件中定了很多方便使用 Docker 的命令,例如 `docker-pid` 可以获取某个容器的 PID`docker-enter` 可以入容器或直接在容器内执行命令。
這個文件中定了很多方便使用 Docker 的命令,例如 `docker-pid` 可以取得某個容器的 PID`docker-enter` 可以入容器或直接在容器內執行命令。
```
$ echo $(docker-pid <container>)
$ docker-enter <container> ls

View File

@@ -1,28 +1,28 @@
##出和入容器
##出和入容器
###出容器
如果要出本地某容器,可以使用 `docker export` 命令。
###出容器
如果要出本地某容器,可以使用 `docker export` 命令。
```
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
```
这样将导出容器快照到本地文件。
這樣將導出容器快照到本地文件。
###入容器快照
可以使用 `docker import` 容器快照文件中再导入为镜像,例如
###入容器快照
可以使用 `docker import` 容器快照文件中再導入為映像檔,例如
```
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
```
此外,也可以通过指定 URL 或者某个目录来导入,例如
此外,也可以透過指定 URL 或者某個目錄來導入,例如
```
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
```
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即保存容器当时的快照状态),而镜像存储文件保存完整记录,体积也要大。此外,容器快照文件导入时可以重新指定标签等元数据信息。
*註:使用者既可以使用 `docker load` 來導入映像檔儲存文件到本地映像檔庫,也可以使用 `docker import` 來導入一容器快照到本地映像檔庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和原始數據訊息(即保存容器當時的快照狀態),而映像檔儲存文件保存完整記錄,檔案體積也跟著變大。此外,容器快照文件導入時可以重新指定標簽等原始數據訊息。

View File

@@ -1,14 +1,9 @@
##除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。
##除容器
可以使用 `docker rm` 來刪除一個處於終止狀態的容器。
例如
```
$sudo docker rm trusting_newton
trusting_newton
```
如果要除一个运行中的容器,可以添加 `-f` 参数。Docker 会发`SIGKILL`号给容器。
如果要除一個執行中的容器,可以新增 `-f` 參數。Docker 會發`SIGKILL`號給容器。
##清理所有处于终止状态的容器
`docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。

View File

@@ -1,26 +1,26 @@
##启动容器
启动容器有两种方式,一种是基于镜像新建一容器并启动,另外一个是将在终止状态stopped的容器重新启动
##啟動容器
啟動容器有兩種方式,一種是將映像檔新建一容器並啟動,另外一個是將終止狀態stopped的容器重新啟動
Docker 的容器在太轻量级了,很多时候用户都是随时删除和新建容器。
Docker 的容器在太輕量級了,使用者可以隨時刪除和新建容器。
###新建并启动
所需要的命令主要 `docker run`
###新建並啟動
所需要的命令主要 `docker run`
例如,下面的命令出一 “Hello World”后终止容器。
例如,下面的命令出一 “Hello World”後終止容器。
```
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
```
跟在本地直接`/bin/echo 'hello world'` 乎感不出任何区别
跟在本地直接`/bin/echo 'hello world'` 相同, 幾乎感不出任何區別
下面的命令则启动一个 bash 端,允许用户进行交互。
下面的命令則啟動一個 bash 端,允許使用者進行交互。
```
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
```
其中,`-t` 选项让Docker分配一个伪终pseudo-tty并绑定到容器的标准输入上, `-i` 则让容器的标准输入保持打
其中,`-t` 選項讓Docker分配一個虛擬終pseudo-tty並綁定到容器的標準輸入上, `-i` 則讓容器的標準輸入保持打
在交互模式下,用户可以通过所创建的终端来输入命令,例如
在交互模式下,使用者可以透過所建立的終端來輸入命令,例如
```
root@af8bae53bdd3:/# pwd
/
@@ -28,24 +28,24 @@ root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
```
利用 `docker run` 来创建容器Docker 在后台运行的标准操作包括:
利用 `docker run` 來建立容器Docker 在後臺執行的標準操作包括:
* 查本地是否存在指定的镜像,不存在就公有仓库下载
* 利用镜像创建并启动一个容器
* 分配一文件系统,并在只读的镜像层外面挂载一层可读写层
* 宿主主机配置的网桥接口中接一个虚拟接口到容器中去
* 地址池配置一个 ip 地址容器
* 执行用户指定的用程
* 行完毕后容器被
* 查本地是否存在指定的映像檔,不存在就公有倉庫下載
* 利用映像檔建立並啟動一個容器
* 分配一文件系統,並在唯讀的映像檔層外面掛載一層可讀寫層
* 宿主主機設定的網路橋接口中接一個虛擬埠到容器中去
* 地址堆中設定一個 ip 地址容器
* 執行使用者指定的用程
* 行完畢後容器被
###启动已终止容器
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
###啟動已終止容器
可以利用 `docker start` 命令,直接將一個已經終止的容器啟動執行。
容器的核心为所执行的用程,所需要的源都是用程序运行所必需的。除此之外,并没有其它的源。可以在伪终端中利用 `ps``top` 查看进程信息。
容器的核心為所執行的用程,所需要的源都是用程式執行所必需的。除此之外,並沒有其它的源。可以在偽終端中利用 `ps``top` 查看程式訊息。
```
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
```
,容器中仅运行了指定的 bash 用。这种特点使得 Docker 对资源的用率高,是货真价实的轻量级虚拟化。
,容器中僅執行了指定的 bash 用。這種特點使得 Docker 對資源的使用率高,是貨真價實的輕量級虛擬化。

View File

@@ -1,10 +1,10 @@
##止容器
可以使用 `docker stop` 来终止一个运行中的容器。
##止容器
可以使用 `docker stop` 來終止一個執行中的容器。
此外,Docker容器中指定的应用终结时,容器也自动终止。
例如对于上一章中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 退出终端时,所创建的容器立刻止。
此外,Docker容器中指定的應用終結時,容器也自動終止。
例如對於上一章中只啟動了一個終端機的容器,使用者透過 `exit` 命令或 `Ctrl+d` 退出終端時,所建立的容器立刻止。
终止状态的容器可以用 `docker ps -a` 命令看到。例如
終止狀態的容器可以用 `docker ps -a` 命令看到。例如
```
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -12,6 +12,6 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
```
处于终止状态的容器,可以通过 `docker start` 命令重新启动
處於終止狀態的容器,可以透過 `docker start` 命令重新啟動
此外,`docker restart` 命令会将一个运行态的容器止,然再重新启动它。
此外,`docker restart` 命令會將一個執行中的容器止,然再重新啟動它。

View File

@@ -1,8 +0,0 @@
#CoreOS
CoreOS的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。
CoreOS的安装文件和运行依赖非常小,它提供了精简的Linux系统。它使用Linux容器在更高的抽象层来管理你的服务而不是通过常规的YUM和APT来安装包。
同时CoreOS几乎可以运行在任何平台Vagrant, Amazon EC2, QEMU/KVM, VMware 和 OpenStack 等等,甚至你所使用的硬件环境。

View File

@@ -1,47 +0,0 @@
#CoreOS介绍
提起Docker我们不得不提的就是[CoreOS](https://coreos.com/).
CoreOS对Docker甚至容器技术的发展都带来了巨大的推动作用。
CoreOS是一种支持大规模服务部署的Linux系统。
CoreOS使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
CoreOS是一个新的Linux发行版。通过重构CoreOS提供了运行现代基础设施的特性。
CoreOS的这些策略和架构允许其它公司像GoogleFacebook和Twitter那样高弹性的运行自己得服务。
CoreOS遵循Apache 2.0协议并且可以运行在现有的硬件或云提供商之上。
#CoreOS特性
##一个最小化操作系统
CoreOS被设计成一个来构建你平台的最小化的现代操作系统。
它比现有的Linux安装平均节省40%的RAM大约114M并允许从 PXE/iPXE 非常快速的启动。
##无痛更新
利用主动和被动双分区方案来更新OS使用分区作为一个单元而不是一个包一个包得更新。
这使得每次更新变得快速,可靠,而且很容易回滚。
##Docker容器
应用作为Docker容器运行在CoreOS上。容器以包得形式提供最大得灵活性并且可以在几毫秒启动。
##支持集群
CoreOS可以在一个机器上很好地运行但是它被设计用来搭建集群。
可以通过fleet很容易得使应用容器部署在多台机器上并且通过服务发现把他们连接在一起。
##分布式系统工具
内置诸如分布式锁和主选举等原生工具用来构建大规模分布式系统得构建模块。
##服务发现
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。在CoreOS中构建高可用和自动故障负载。

View File

@@ -1,104 +0,0 @@
#CoreOS工具介绍
CoreOS提供了三大工具它们分别是服务发现容器管理和进程管理。
##使用etcd服务发现
CoreOS的第一个重要组件就是使用etcd来实现的服务发现。
如果你使用默认的样例cloud-config文件那么etcd会在启动时自动运行。
例如:
```
#cloud-config
hostname: coreos0
ssh_authorized_keys:
- ssh-rsa AAAA...
coreos:
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
etcd:
name: coreos0
discovery: https://discovery.etcd.io/<token>
```
配置文件里有一个token获取它可以通过如下方式
访问地址
https://discovery.etcd.io/new
你将会获取一个包含你得teoken得URL。
##通过Docker进行容器管理
第二个组件就是docker它用来运行你的代码和应用。
每一个CoreOS的机器上都安装了它具体使用请参考本书其他章节。
##使用fleet进行进程管理
第三个CoreOS组件是fleet。
它是集群的分布式初始化系统。你应该使用fleet来管理你的docker容器的生命周期。
Fleet通过接受systemd单元文件来工作同时在你集群的机器上通过单元文件中编写的偏好来对它们进行调度。
首先让我们构建一个简单的可以运行docker容器的systemd单元。把这个文件保存在home目录并命名为hello.service
```
hello.service
[Unit]
Description=My Service
After=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill hello
ExecStartPre=-/usr/bin/docker rm hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop hello
```
然后,读取并启动这个单元:
```
$ fleetctl load hello.service
=> Unit hello.service loaded on 8145ebb7.../172.17.8.105
$ fleetctl start hello.service
=> Unit hello.service launched on 8145ebb7.../172.17.8.105
```
这样,你的容器将在集群里被启动。
下面我们查看下它的状态:
```
$ fleetctl status hello.service
● hello.service - My Service
Loaded: loaded (/run/fleet/units/hello.service; linked-runtime)
Active: active (running) since Wed 2014-06-04 19:04:13 UTC; 44s ago
Main PID: 27503 (bash)
CGroup: /system.slice/hello.service
├─27503 /bin/bash -c /usr/bin/docker start -a hello || /usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
└─27509 /usr/bin/docker run --name hello busybox /bin/sh -c while true; do echo Hello World; sleep 1; done
Jun 04 19:04:57 core-01 bash[27503]: Hello World
..snip...
Jun 04 19:05:06 core-01 bash[27503]: Hello World
```
我们可以停止容器:
```
fleetctl destroy hello.service
```
至此就是CoreOS提供的三大工具。

View File

@@ -1,102 +0,0 @@
#快速搭建CoreOS集群
在这里我们要搭建一个集群环境,毕竟单机环境没有什么挑战不是?
然后为了在你的电脑运行一个集群环境我们使用Vagrant。
*Vagrant的使用这里不再阐述请自行学习*
如果你第一次接触CoreOS这样的分布式平台运行一个集群看起来好像一个很复杂的任务这里我们给你展示在本地快速搭建一个CoreOS集群环境是多么的容易。
##准备工作
首先要确认在你本地的机器上已经安装了最新版本的Virtualbox, Vagrant 和 git。
这是我们可以在本地模拟集群环境的前提条件,如果你已经拥有,请继续,否则自行搜索学习。
##配置工作
从CoreOS官方代码库获取基本配置并进行修改
首先,获取模板配置文件
```
git clone https://github.com/coreos/coreos-vagrant
cd coreos-vagrant
cp user-data.sample user-data
```
获取新的token
```
curl https://discovery.etcd.io/new
```
把获取的token放到user-data文件中示例如下
```
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/<token>
```
##启动集群
默认情况下CoreOS Vagrantfile 将会启动单机。
我们需要复制并修改config.rb.sample文件.
复制文件
```
cp config.rb.sample config.rb
```
修改集群配置参数num_instances为3。
启动集群
```
vagrant up
=>
Bringing machine 'core-01' up with 'virtualbox' provider...
Bringing machine 'core-02' up with 'virtualbox' provider...
Bringing machine 'core-03' up with 'virtualbox' provider...
==> core-01: Box 'coreos-alpha' could not be found. Attempting to find and install...
core-01: Box Provider: virtualbox
core-01: Box Version: >= 0
==> core-01: Adding box 'coreos-alpha' (v0) for provider: virtualbox
core-01: Downloading: http://storage.core-os.net/coreos/amd64-usr/alpha/coreos_production_vagrant.box
core-01: Progress: 46% (Rate: 6105k/s, Estimated time remaining: 0:00:16)
```
添加ssh的公匙
```
ssh-add ~/.vagrant.d/insecure_private_key
```
连接集群中的第一台机器
```
vagrant ssh core-01 -- -A
```
##测试集群
使用fleet来查看机器运行状况
```
fleetctl list-machines
=>
MACHINE IP METADATA
517d1c7d... 172.17.8.101 -
cb35b356... 172.17.8.103 -
17040743... 172.17.8.102 -
```
如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。
那么之后你就可以基于CoreOS的三大工具做任务分发分布式存储等很多功能了。

View File

@@ -1,4 +1,4 @@
# Docker 数据管理
一章介如何在 Docker 部以及容器之管理数据,在容器中管理数据主要有两种方式:
* 数据Data volumes
* 数据卷容器Data volume containers
# Docker 數據管理
一章介如何在 Docker 部以及容器之管理數據,在容器中管理數據主要有兩種方式:
* 數據Data volumes
* 數據卷容器Data volume containers

View File

@@ -1,23 +1,23 @@
## 数据卷容器
如果你有一些持更新的数据需要在容器之共享,最好创建数据卷容器。
## 數據卷容器
如果你有一些持更新的數據需要在容器之共享,最好建立數據卷容器。
数据卷容器,其就是一正常的容器,专门用来提供数据卷供其它容器挂载的。
數據卷容器,其就是一正常的容器,專門用來提供數據卷供其它容器掛載的。
首先,创建一个名为 dbdata 的数据卷容器
首先,建立一個命名的數據卷容器 dbdata
```
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
```
,在其他容器中使用 `--volumes-from` 来挂载 dbdata 容器中的数据卷。
,在其他容器中使用 `--volumes-from` 來掛載 dbdata 容器中的數據卷。
```
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
```
可以使用超过一个的 `--volumes-from` 参数来指定从多个容器挂载不同的数据卷。
也可以其他已经挂载了数据卷的容器来级联挂载数据卷。
可以使用多個 `--volumes-from` 參數來從多個容器掛載多個數據卷。
也可以其他已經掛載了容器卷的容器來掛載數據卷。
```
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
```
*意:使用 `--volumes-from` 参数所挂载数据卷的容器自己不需要保持在运行状态
*意:使用 `--volumes-from` 參數所掛載數據卷的容器自己不需要保持在執行狀態
如果除了挂载的容器(包括 dbdata、db1 和 db2数据卷并不会被自动删除。如果要除一个数据卷,必须在删除最后一个还挂载着它的容器使用 `docker rm -v` 命令指定同时删除关联的容器。
可以让用户在容器之间升级和移动数据卷。具的操作在下一节中进行讲解。
如果除了掛載的容器(包括 dbdata、db1 和 db2數據卷並不會被自動刪除。如果要除一個數據卷,必須在刪除最後一個還掛載著它的容器使用 `docker rm -v` 命令指定同時刪除關聯的容器。
可以讓使用者在容器之間升級和移動數據卷。具的操作在下一節中進行講解。

View File

@@ -1,25 +1,21 @@
## 利用数据卷容器来备份、恢复、迁移数据
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
## 利用數據卷容器來備份、恢復、遷移數據
可以利用數據卷對其中的數據進行進行備份、恢復和遷移。
###
首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目。命令下:
###
首先使用 `--volumes-from` 標記來建立一個載入 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目。命令下:
```
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
```
容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 `backup.tar` 的文件
容器啟動後,使用了 `tar` 命令來將 dbdata 卷備份為本地的 `/backup/backup.tar`
### 恢
如果要恢复数据到一容器,首先创建一个带有空数据卷的容器 dbdata2。
### 恢
如果要恢復數據到一容器,首先建立一個帶有數據卷的容器 dbdata2。
```
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
```
后创建另一容器,挂载 dbdata2 容器卷中的数据卷,并使用 `untar`压备份文件到挂载的容器卷中。
後建立另一容器,掛載 dbdata2 容器,並使用 `untar`壓備份文件到掛載的容器卷中。
```
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar
```
为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
```
$ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
```

View File

@@ -1,68 +1,45 @@
## 数据
数据卷是一可供一或多容器使用的特殊目,它绕过 UFS可以提供很多有用的特性
* 数据卷可以在容器之共享和重用
* 对数据卷的修改会立马生效
* 对数据卷的更新,不会影响镜
* 数据卷默认会一直存在,即使容器被删除
## 數據
數據卷是一可供一或多容器使用的特殊目,它繞過 UFS可以提供很多有用的特性
* 數據卷可以在容器之共享和重用
* 對數據卷的修改會立馬生效
* 對數據卷的更新,不會影響鏡
* 卷會一直存在,直到沒有容器使用
*數據卷的使用,類似於 Linux 下對目錄或文件進行 mount。
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount镜像中的被指定为挂载点的目录中的文件会隐藏掉能显示看的是挂载的数据卷。
### 建立一個數據卷
在用 `docker run` 命令的時候,使用 `-v` 標記來建立一個數據卷並掛載到容器裡。在一次 run 中多次使用可以掛載多個數據卷。
### 创建一个数据卷
在用 `docker run` 命令的时候,使用 `-v` 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
下面创建一个名为 web 的容器,并加载一个数据卷到容器的 `/webapp` 目录。
下面建立一個 web 容器,並載入一個數據卷到容器的 `/webapp` 目錄。
```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
```
*意:也可以在 Dockerfile 中使用 `VOLUME` 来添加一个或者多新的卷到由该镜像创建的任意容器。
*意:也可以在 Dockerfile 中使用 `VOLUME` 來新增一個或者多新的卷到由該鏡像建立的任意容器。
### 删除数据
数据卷是被设计用来持久化数据的它的生命周期独立于容器Docker不会在容器被删除后自动删除数据卷并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 `docker rm -v` 这个命令。无主的数据卷可能会占据很多空间要清理会很麻烦。Docker官方正在试图解决这个问题相关工作的进度可以查看这个[PR](https://github.com/docker/docker/pull/8484)
### 挂载一个主机目录作为数据卷
使用 `-v` 标记也可以指定挂载一个本地主机的目录到容器中去。
### 掛載一個主機目錄作為數據
使用 `-v` 標記也可以指定掛載一個本地主機的目錄到容器中去。
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
```
上面的命令加载主机`/src/webapp`到容器的 `/opt/webapp`
录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程到本地目中,查看容器是否正常工作。本地目的路径必须是绝对路径,如果目不存在 Docker 会自动为你创建它。
上面的命令載入主機`/src/webapp`到容器的 `/opt/webapp`
錄。這個功能在進行測試的時候十分方便,比如使用者可以放置一些程到本地目中,查看容器是否正常工作。本地目的路徑必須是絕對路徑,如果目不存在 Docker 會自動為你建立它。
*Dockerfile 中不支持这种用法,是因 Dockerfile 是了移植和分享用的。然而,不同操作系统的路格式不一,所以目前不能支持。
*Dockerfile 中不支持這種用法,是因 Dockerfile 是了移植和分享用的。然而,不同作業系統的路格式不一,所以目前不能支持。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读
Docker 掛載數據卷的默認權限是讀寫,使用者也可以透過 `:ro` 指定為唯讀
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py
```
加了 `:ro`,就挂载为只读了。
加了 `:ro`,就掛載為唯讀了。
### 查看数据卷的具体信息
在主机里使用以下命令可以查看指定容器的信息
```
$ docker inspect web
...
```
在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的`/var/lib/docker/volumes/`下面的
```
"Volumes": {
"/webapp": "/var/lib/docker/volumes/fac362...80535"
},
"VolumesRW": {
"/webapp": true
}
...
```
### 挂载一个本地主机文件作为数据卷
`-v` 标记也可以从主机挂载单个文件到容器中
### 掛載一個本地主機文件作為數據卷
`-v` 標記也可以從主機掛載單個文件到容器中
```
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
```
这样就可以记录在容器输入过的命令了。
這樣就可以記錄在容器輸入過的命令了。
*意:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改变,从 Docker 1.1
.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目
*意:如果直接掛載一個文件,很多文件編輯工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改變,從 Docker 1.1
.0起,這會導致報錯誤訊息。所以最簡單的辦法就直接掛載文件的父目

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -1,3 +1,3 @@
# Dockerfile
使用 Dockerfile 可以允许用户创建自定义的镜像
使用 Dockerfile 讓使用者可以建立自定義的映像檔

View File

@@ -1,7 +1,7 @@
## 基本结构
Dockerfile 由一行行命令语句组成,且支`#` 开头的注释行。
## 基本結構
Dockerfile 由一行行命令語句組成,且支`#` 開頭的註解行。
一般Dockerfile 分四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
一般而言Dockerfile 分四部分:基底映像檔資訊、維護者資訊、映像檔操作指令和容器啟動時執行指令。
例如
```
@@ -10,28 +10,28 @@ Dockerfile 由一行行命令语句组成,并且支持以 `#` 开头的注释
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
# 基本映像檔,必須是第一個指令
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
# 維護者: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# Commands to update the image
# 更新映像檔的指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
# 建立新容器時要執行的指令
CMD /usr/sbin/nginx
```
其中,一始必指明所基于的镜像名称,接下来推荐说明维护者信息
其中,一始必指明作為基底的映像檔名稱,接下來說明維護者資訊(建議)
后面则是镜像操作指令,例如 `RUN` 指令,`RUN` 指令将对镜像执行跟随的命令。每行一 `RUN` 指令,镜像添加新的一层,并提交
接著則是映像檔操作指令,例如 `RUN` 指令,`RUN` 指令將對映像檔執行相對應的命令。每行一 `RUN` 指令,映像檔就會新增一層
`CMD` 指令,指定行容器的操作命令。
`CMD` 指令,指定行容器的操作命令。
下面是一个更复杂的例子
下面來看一個更複雜的例子
```
# Nginx
#

View File

@@ -1,9 +1,9 @@
## 创建镜像
编写完成 Dockerfile 之,可以通过 `docker build` 命令来创建镜像
## 建立映像檔
編輯完成 Dockerfile 之,可以透過 `docker build` 命令建立映像檔
基本的格式 `docker build [选项] 路`命令将读取指定路下(包括子目)的 Dockerfile并将该路径下所有内容发送给 Docker 服端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目。也可以通过 `.dockerignore` 文件(每一行添加一条匹配模式)来让 Docker 忽略路下的目和文件。
基本的格式 `docekr build [選項] 路`命令將讀取指定路下(包括子目)的 Dockerfile並將該路徑下所有內容發送給 Docker 服端,由伺服端來建立鏡像。因此一般會建議放置 Dockerfile 的目錄為空目。也可以透過 `.dockerignore` 文件(每一行新增一條排除模式exclusion patterns來讓 Docker 忽略路下的目和文件。
要指定像的标签信息,可以通过 `-t` 选项,例如
要指定像的標籤資訊,可以透過 `-t` 選項,例如
```
$ sudo docker build -t myrepo/myapp /tmp/test1/
```

View File

@@ -1,40 +1,40 @@
## 指令
指令的一般格式 `INSTRUCTION arguments`,指令包括 `FROM``MAINTAINER``RUN` 等。
指令的一般格式 `INSTRUCTION arguments`,指令包括 `FROM``MAINTAINER``RUN` 等。
### FROM
格式 `FROM <image>``FROM <image>:<tag>`
格式 `FROM <image>``FROM <image>:<tag>`
第一指令必须为 `FROM` 指令。且,如果在同一Dockerfile中创建多个镜像时,可以使用多 `FROM` 指令(每个镜像一次)。
第一指令必須為 `FROM` 指令。且,如果在同一Dockerfile中建立多個映像檔時,可以使用多 `FROM` 指令(每個映像檔一次)。
### MAINTAINER
格式 `MAINTAINER <name>`,指定维护者信息。
格式 `MAINTAINER <name>`,指定維護者訊息。
### RUN
格式 `RUN <command>``RUN ["executable", "param1", "param2"]`
格式 `RUN <command>``RUN ["executable", "param1", "param2"]`
前者在 shell 端中行命令,即 `/bin/sh -c`后者则使用 `exec` 行。指定使用其它端可以通过第二方式实现,例如 `RUN ["/bin/bash", "-c", "echo hello"]`
前者在 shell 端中行命令,即 `/bin/sh -c`後者則使用 `exec` 行。指定使用其它端可以透過第二方式實做,例如 `RUN ["/bin/bash", "-c", "echo hello"]`
`RUN` 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 `\` 来换行。
`RUN` 指令將在當前映像檔基底上執行指定命令,並產生新的映像檔。當命令較長時可以使用 `\` 來換行。
### CMD
支持三格式
* `CMD ["executable","param1","param2"]` 使用 `exec` 行,推荐方式
* `CMD command param1 param2``/bin/sh`行,提供给需要交互的应用
* `CMD ["param1","param2"]` 提供 `ENTRYPOINT`默认参数
支持三格式
* `CMD ["executable","param1","param2"]` 使用 `exec` 行,推薦使用
* `CMD command param1 param2``/bin/sh`行,使用在給需要互動的指令
* `CMD ["param1","param2"]` 提供 `ENTRYPOINT`預設參數
指定启动容器时执行的命令,每 Dockerfile 只能有一 `CMD` 命令。如果指定了多命令,只有最后一条会被执行。
指定啟動容器時執行的命令,每 Dockerfile 只能有一 `CMD` 命令。如果指定了多命令,只有最後一條會被執行。
如果用户启动容器候指定了行的命令,则会覆盖`CMD` 指定的命令。
如果使用者啟動容器候指定了行的命令,則會覆蓋`CMD` 指定的命令。
### EXPOSE
格式 `EXPOSE <port> [<port>...]`
格式 `EXPOSE <port> [<port>...]`
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器需要通过 -PDocker 主机会自动分配一个端口转发到指定的端口
設定 Docker 伺服器容器對外的埠號,供外界使用。在啟動容器需要透過 -PDocker 會自動分配一個埠號轉發到指定的埠號
### ENV
格式 `ENV <key> <value>`
指定一个环境变量,会被后续 `RUN` 指令使用,在容器运行时保持。
格式 `ENV <key> <value>`
指定一個環境變數,會被後續 `RUN` 指令使用,在容器運行時保持。
例如
```
@@ -45,59 +45,59 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
```
### ADD
格式 `ADD <src> <dest>`
格式 `ADD <src> <dest>`
命令将复制指定的 `<src>` 到容器中的 `<dest>`
其中 `<src>` 可以是Dockerfile所在目录的一个相对路径;也可以是一 URL可以是一 tar 文件(自动解压为目录)。
命令將複製指定的 `<src>` 到容器中的 `<dest>`
其中 `<src>` 可以是 Dockerfile 所在目錄的相對路徑;也可以是一 URL可以是一 tar 文件(其複製後會自動解壓縮)。
### COPY
格式 `COPY <src> <dest>`
格式 `COPY <src> <dest>`
复制本地主机`<src>` Dockerfile 所在目的相对路径)到容器中的 `<dest>`
複製本地端`<src>` Dockerfile 所在目的相對路徑)到容器中的 `<dest>`
使用本地目录为源目录时,推使用 `COPY`
使用本地目錄為根目錄時,推使用 `COPY`
### ENTRYPOINT
两种格式:
兩種格式:
* `ENTRYPOINT ["executable", "param1", "param2"]`
* `ENTRYPOINT command param1 param2`shell中行)。
* `ENTRYPOINT command param1 param2`shell中行)。
配置容器启动后执行的命令,且不`docker run` 提供的参数覆盖
指定容器啟動後執行的命令,且不`docker run` 提供的參數覆蓋
Dockerfile 中只能有一 `ENTRYPOINT`指定多个时,只有最后一个起效。
Dockerfile 中只能有一 `ENTRYPOINT`指定多個時,只有最後一個會生效。
### VOLUME
格式 `VOLUME ["/data"]`
格式 `VOLUME ["/data"]`
创建一个可以本地主机或其他容器挂载的挂载点,一般用存放数据库和需要保持的数据等。
建立一個可以本地或其他容器掛載的掛載點,一般用存放資料庫和需要保存的資料等。
### USER
格式 `USER daemon`
格式 `USER daemon`
指定行容器时的用户名或 UID后续`RUN`使用指定用户
指定行容器時的使用者名稱或 UID後續`RUN`使用指定使用者
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前建所需要的用户,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要临时获取管理员权限可以使用 `gosu`,而不推 `sudo`
當服務不需要管理員權限時,可以透過該命令指定運行使用者。並且可以在之前建所需要的使用者,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要臨時取得管理員權限可以使用 `gosu`,而不推 `sudo`
### WORKDIR
格式 `WORKDIR /path/to/workdir`
格式 `WORKDIR /path/to/workdir`
为后续`RUN``CMD``ENTRYPOINT` 指令配置工作目
為後續`RUN``CMD``ENTRYPOINT` 指令指定工作目
可以使用多 `WORKDIR` 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路。例如
可以使用多 `WORKDIR` 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路。例如
```
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
```
则最终路径为 `/a/b/c`
則最終路徑為 `/a/b/c`
### ONBUILD
格式 `ONBUILD [INSTRUCTION]`
格式 `ONBUILD [INSTRUCTION]`
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所行的操作指令。
指定當建立的映像檔作為其它新建立映像檔的基底映像檔時,所行的操作指令。
例如Dockerfile 使用下的内容创建了镜像 `image-A`
例如Dockerfile 使用下的內容建立了映像檔 `image-A`
```
[...]
ONBUILD ADD . /app/src
@@ -105,7 +105,7 @@ ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
```
如果基 image-A 创建新的镜像时新的Dockerfile中使用 `FROM image-A`指定基础镜像时,会自动执`ONBUILD` 指令容,等价于在后面添加了两条指令。
如果基 image-A 建立新的映像檔時,新的 Dockerfile 中使用 `FROM image-A`指定基底映像檔時,會自動執`ONBUILD` 指令容,等於在後面新增了兩條指令。
```
FROM image-A
@@ -114,5 +114,4 @@ ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
```
使用 `ONBUILD` 指令的镜像,推荐在标签中注明,例如 `ruby:1.9-onbuild`
使用 `ONBUILD` 指令的映像檔,推薦在標簽中註明,例如 `ruby:1.9-onbuild`

View File

@@ -1,3 +0,0 @@
# etcd
etcd 是 CoreOS 团队发起的一个管理配置信息和服务发现service discovery的项目在这一章里面我们将介绍该项目的目标安装和使用以及实现的技术。

View File

@@ -1,282 +0,0 @@
## 使用 etcdctl
etcdctl 是一个命令行客户端,它能提供一些简洁的命令,供用户直接跟 etcd 服务打交道,而无需基于 HTTP API 方式。这在某些情况下将很方便,例如用户对服务进行测试或者手动修改数据库内容。我们也推荐在刚接触 etcd 时通过 etcdctl 命令来熟悉相关的操作,这些操作跟 HTTP API 实际上是对应的。
etcd 项目二进制发行包中已经包含了 etcdctl 工具,没有的话,可以从 [github.com/coreos/etcd/releases](https://github.com/coreos/etcd/releases) 下载。
etcdctl 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。
```
$ etcdctl -h
NAME:
etcdctl - A simple command line client for etcd.
USAGE:
etcdctl [global options] command [command options] [arguments...]
VERSION:
2.0.0-rc.1
COMMANDS:
backup backup an etcd directory
mk make a new key with a given value
mkdir make a new directory
rm remove a key
rmdir removes the key if it is an empty directory or a key-value pair
get retrieve the value of a key
ls retrieve a directory
set set the value of a key
setdir create a new or existing directory
update update an existing key with a given value
updatedir update an existing directory
watch watch a key for changes
exec-watch watch a key for changes and exec an executable
member member add, remove and list subcommands
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug output cURL commands which can be used to reproduce the request
--no-sync don't synchronize cluster information before sending request
--output, -o 'simple' output response in the given format (`simple` or `json`)
--peers, -C a comma-delimited list of machine addresses in the cluster (default: "127.0.0.1:4001")
--cert-file identify HTTPS client using this SSL certificate file
--key-file identify HTTPS client using this SSL key file
--ca-file verify certificates of HTTPS-enabled servers using this CA bundle
--help, -h show help
--version, -v print the version
```
### 数据库操作
数据库操作围绕对键值和目录的 CRUD (符合 REST 风格的一套操作Create完整生命周期的管理。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如 `testkey`,此时实际上放在根目录 `/` 下面,也可以为指定目录结构,如 `cluster1/node2/testkey`,则将创建相应的目录结构。
*注CRUD 即 Create, Read, Update, Delete是符合 REST 风格的一套 API 操作。*
#### set
指定某个键的值。例如
```
$ etcdctl set /testdir/testkey "Hello world"
Hello world
```
支持的选项包括:
```
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0则永不超时
--swap-with-value value 若该键现在的值是 value则进行设置操作
--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作
```
#### get
获取指定键的值。例如
```
$ etcdctl set testkey hello
hello
$ etcdctl update testkey world
world
```
当键不存在时,则会报错。例如
```
$ etcdctl get testkey2
Error: 100: Key not found (/testkey2) [1]
```
支持的选项为
```
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性
```
#### update
当键存在时,更新值内容。例如
```
$ etcdctl set testkey hello
hello
$ etcdctl update testkey world
world
```
当键不存在时,则会报错。例如
```
$ etcdctl update testkey2 world
Error: 100: Key not found (/testkey2) [1]
```
支持的选项为
```
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
#### rm
删除某个键值。例如
```
$ etcdctl rm testkey
```
当键不存在时,则会报错。例如
```
$ etcdctl rm testkey2
Error: 100: Key not found (/testkey2) [8]
```
支持的选项为
```
--dir 如果键是个空目录或者键值对则删除
--recursive 删除目录和所有子键
--with-value 检查现有的值是否匹配
--with-index '0' 检查现有的 index 是否匹配
```
#### mk
如果给定的键不存在,则创建一个新的键值。例如
```
$ etcdctl mk /testdir/testkey "Hello world"
Hello world
```
当键存在的时候,执行该命令会报错,例如
```
$ etcdctl set testkey "Hello world"
Hello world
$ ./etcdctl mk testkey "Hello world"
Error: 105: Key already exists (/testkey) [2]
```
支持的选项为
```
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
#### mkdir
如果给定的键目录不存在,则创建一个新的键目录。例如
```
$ etcdctl mkdir testdir
```
当键目录存在的时候,执行该命令会报错,例如
```
$ etcdctl mkdir testdir
$ etcdctl mkdir testdir
Error: 105: Key already exists (/testdir) [7]
```
支持的选项为
```
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
#### setdir
创建一个键目录,无论存在与否。
支持的选项为
```
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
#### updatedir
更新一个已经存在的目录。
支持的选项为
```
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
#### rmdir
删除一个空目录,或者键值对。
若目录不空,会报错
```
$ etcdctl set /dir/testkey hi
hi
$ etcdctl rmdir /dir
Error: 108: Directory not empty (/dir) [13]
```
#### ls
列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中内容。
例如
```
$ ./etcdctl set testkey 'hi'
hi
$ ./etcdctl set dir/test 'hello'
hello
$ ./etcdctl ls
/testkey
/dir
$ ./etcdctl ls dir
/dir/test
```
支持的选项包括
```
--sort 将输出结果排序
--recursive 如果目录下有子目录,则递归输出其中的内容
-p 对于输出为目录,在最后添加 `/` 进行区分
```
### 非数据库操作
#### backup
备份 etcd 的数据。
支持的选项包括
```
--data-dir etcd 的数据目录
--backup-dir 备份到指定路径
```
#### watch
监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。
例如,用户更新 testkey 键值为 Hello world。
```
$ etcdctl watch testkey
Hello world
```
支持的选项包括
```
--forever 一直监测,直到用户按 `CTRL+C` 退出
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
```
#### exec-watch
监测一个键值的变化,一旦键值发生更新,就执行给定命令。
例如,用户更新 testkey 键值。
```
$etcdctl exec-watch testkey -- sh -c 'ls'
default.etcd
Documentation
etcd
etcdctl
etcd-migrate
README-etcdctl.md
README.md
```
支持的选项包括
```
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
```
#### member
通过 list、add、remove 命令列出、添加、删除 etcd 实例到 etcd 集群中。
例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。
```
$ etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001
```
### 命令选项
* `--debug` 输出 cURL 命令,显示执行命令的时候发起的请求
* `--no-sync` 发出请求之前不同步集群信息
* `--output, -o 'simple'` 输出内容的格式 (`simple` 为原始信息,`json` 为进行json格式解码易读性好一些)
* `--peers, -C` 指定集群中的同伴信息,用逗号隔开 (默认为: "127.0.0.1:4001")
* `--cert-file` HTTPS 下客户端使用的 SSL 证书文件
* `--key-file` HTTPS 下客户端使用的 SSL 密钥文件
* `--ca-file` 服务端使用 HTTPS 时,使用 CA 文件进行验证
* `--help, -h` 显示帮助命令信息
* `--version, -v` 打印版本信息

View File

@@ -1,78 +0,0 @@
## 安装
etcd 基于 Go 语言实现,因此,用户可以从 [项目主页](https://github.com/coreos/etcd) 下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 Docker 镜像文件来体验。
### 二进制文件方式下载
编译好的二进制文件都在 [github.com/coreos/etcd/releases](https://github.com/coreos/etcd/releases/) 页面,用户可以选择需要的版本,或通过下载工具下载。
例如,下面的命令使用 curl 工具下载压缩包,并解压。
```
curl -L https://github.com/coreos/etcd/releases/download/v2.0.0-rc.1/etcd-v2.0.0-rc.1-linux-amd64.tar.gz -o etcd-v2.0.0-rc.1-linux-amd64.tar.gz
tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz
cd etcd-v2.0.0-rc.1-linux-amd64
```
解压后,可以看到文件包括
```
$ ls
etcd etcdctl etcd-migrate README-etcdctl.md README.md
```
其中 etcd 是服务主文件etcdctl 是提供给用户的命令客户端etcd-migrate 负责进行迁移。
推荐通过下面的命令将三个文件都放到系统可执行目录 `/usr/local/bin/``/usr/bin/`
```
$ sudo cp etcd* /usr/local/bin/
```
运行 etcd将默认组建一个两个节点的集群。数据库服务端默认监听在 2379 和 4001 端口etcd 实例监听在 2380 和 7001 端口。显示类似如下的信息:
```
$ ./etcd
2014/12/31 14:52:09 no data-dir provided, using default data-dir ./default.etcd
2014/12/31 14:52:09 etcd: listening for peers on http://localhost:2380
2014/12/31 14:52:09 etcd: listening for peers on http://localhost:7001
2014/12/31 14:52:09 etcd: listening for client requests on http://localhost:2379
2014/12/31 14:52:09 etcd: listening for client requests on http://localhost:4001
2014/12/31 14:52:09 etcdserver: name = default
2014/12/31 14:52:09 etcdserver: data dir = default.etcd
2014/12/31 14:52:09 etcdserver: snapshot count = 10000
2014/12/31 14:52:09 etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2014/12/31 14:52:09 etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2014/12/31 14:52:09 etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2014/12/31 14:52:10 etcdserver: start member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2014/12/31 14:52:10 raft: ce2a822cea30bfca became follower at term 0
2014/12/31 14:52:10 raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, lastindex: 0, lastterm: 0]
2014/12/31 14:52:10 raft: ce2a822cea30bfca became follower at term 1
2014/12/31 14:52:10 etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2014/12/31 14:52:11 raft: ce2a822cea30bfca is starting a new election at term 1
2014/12/31 14:52:11 raft: ce2a822cea30bfca became candidate at term 2
2014/12/31 14:52:11 raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2014/12/31 14:52:11 raft: ce2a822cea30bfca became leader at term 2
2014/12/31 14:52:11 raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2014/12/31 14:52:11 etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
```
此时,可以使用 etcdctl 命令进行测试,设置和获取键值 `testkey: "hello world"`,检查 etcd 服务是否启动成功:
```
$ ./etcdctl set testkey "hello world"
hello world
$ ./etcdctl get testkey
hello world
```
说明 etcd 服务已经成功启动了。
当然,也可以通过 HTTP 访问本地 2379 或 4001 端口的方式来进行操作,例如查看 `testkey` 的值:
```
$ curl -L http://localhost:4001/v2/keys/testkey
{"action":"get","node":{"key":"/testkey","value":"hello world","modifiedIndex":3,"createdIndex":3}}
```
### Docker 镜像方式下载
镜像名称为 quay.io/coreos/etcd:v2.0.0_rc.1,可以通过下面的命令启动 etcd 服务监听到 4001 端口。
```
$ sudo docker run -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v2.0.0_rc.1
```

View File

@@ -1,19 +0,0 @@
## 什么是 etcd
![](../_images/etcd_logo.png)
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目它的目标是构建一个高可用的分布式键值key-value数据库基于 Go 语言实现。我们知道在分布式系统中各种服务的配置信息的管理分享服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。
etcd 目前在 [github.com/coreos/etcd](https://github.com/coreos/etcd) 进行维护,即将发布 2.0.0 版本。
受到 [Apache ZooKeeper](http://zookeeper.apache.org/) 项目和 [doozer](https://github.com/ha/doozerd) 项目的启发etcd 在设计的时候重点考虑了下面四个要素:
* 简单:支持 REST 风格的 HTTP+JSON API
* 安全:支持 HTTPS 方式的访问
* 快速:支持并发 1k/s 的写操作
* 可靠:支持分布式结构,基于 Raft 的一致性算法
*注Apache ZooKeeper 是一套知名的分布式系统中进行同步和一致性管理的工具。*
*注doozer 则是一个一致性分布式数据库。*
*注Raft 是一套通过选举主节点来实现分布式系统一致性的算法,相比于大名鼎鼎的 Paxos 算法,它的过程更容易被人理解,由 Stanford 大学的 Diego Ongaro 和 John Ousterhout 提出。更多细节可以参考 [raftconsensus.github.io](http://raftconsensus.github.io)。*
一般情况下,用户使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性。

View File

@@ -1,2 +0,0 @@
#Fig
在你的应用里面添加一个 `fig.yml` 文件,并指定一些简单的内容,执行 `fig up` 它就能帮你快速建立起一个容器。目前已经正式更名为 [Compose](../compose/README.md)。

View File

@@ -1,141 +0,0 @@
##Fig客户端参考
大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,这个命令则可以应用在所有的服务上。
执行 `fig [COMMAND] --help` 查看所有的使用说明。
###选项
`--verbose`
显示更多信息。
`--version`
打印版本并退出。
`-f, --file FILE`
使用特定的Fig文件默认使用fig.yml。
`-p, --project-name NAME`
使用特定的项目名称,默认使用文件夹名称。
###命令
`build`
构建或重新构建服务。
服务一旦构建后将会标记为project_service例如figtest_db。
如果修改服务的 `Dockerfile` 或构建目录信息,你可以运行 `fig build` 来重新构建。
`help`
获得一个命令的帮助。
`kill`
强制停止服务容器。
`logs`
查看服务的输出。
`port`
打印端口绑定的公共端口。
`ps`
列出所有容器。
`pull`
拉取服务镜像。
`rm`
删除停止的服务容器。
`run`
在一个服务上执行一个命令。
例如:
```
$ fig run web python manage.py shell
```
默认情况下,链接的服务将会启动,除非这些服务已经在运行中。
一次性命令会在使用与服务的普通容器相同的配置的新容器中开始运行,然后卷、链接等等都将会按照期望创建。
与普通容器唯一的不同就是,这个命令将会覆盖原有的命令,如果端口有冲突则不会创建。
链接还可以在一次性命令和那个服务的其他容器间创建,然后你可以像下面一样进行一些操作:
```
$ fig run db psql -h db -U docker
```
如果你不希望在执行一次性命令时启动链接的容器,可以指定--no-deps选项
```
$ fig run --no-deps web python manage.py shell
```
`scale`
设置一个服务需要运行的容器个数。
通过service=num的参数来设置数量。例如
```
$ fig scale web=2 worker=3
```
`start`
启动一个服务已经存在的容器.
`stop`
停止一个已经运行的容器,但不删除它。通过 `fig start` 可以再次启动这些容器。
`up`
构建,(重新)创建,启动,链接一个服务的容器。
链接的服务都将会启动,除非他们已经运行。
默认情况, `fig up` 将会聚合每个容器的输出,而且如果容器已经存在,所有容器将会停止。如果你运行 `fig up -d` ,将会在后台启动并运行所有的容器。
默认情况,如果这个服务的容器已经存在, `fig up` 将会停止并重新创建他们保持使用volumes-from挂载的卷以保证 `fig.yml` 的修改生效。如果你不想容器被停止并重新创建,可以使用 `fig up --no-recreate` 。如果需要的话,这样将会启动已经停止的容器。
###环境变量
环境变量可以用来配置Fig的行为。
变量以DOCKER_开头它们和用来配置Docker命令行客户端的使用一样。如果你在使用 boot2docker , `$(boot2docker shellinit)` 将会设置它们为正确的值。
`FIG_PROJECT_NAME`
设置通过Fig启动的每一个容器前添加的项目名称.默认是当前工作目录的名字。
`FIG_FILE`
设置要使用的 `fig.yml` 的路径。默认路径是当前工作目录。
`DOCKER_HOST`
设置docker进程的URL。默认docker client使用 `unix:///var/run/docker.sock`
`DOCKER_TLS_VERIFY`
如果设置不为空的字符,允许和进程进行 TLS 通信。
`DOCKER_CERT_PATH`
配置 `ca.pem` 的路径, `cert.pem``key.pem` 文件用来进行TLS验证.默认路径是 `~/.docker`

View File

@@ -1,95 +0,0 @@
##使用 Django 入门 Fig
我们现在将使用 Fig 配置并运行一个 Django/PostgreSQL 应用。在此之前,先确保 Fig 已经 [安装](install.md)。
在一切工作开始前,需要先设置好三个必要的文件。
第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
```
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```
以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。
第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名 。
```
Django
psycopg2
```
就是这么简单。
第三步,`fig.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。
```
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
```
查看 [`fig.yml` 章节](yml_ref.md) 了解更多详细的工作机制。
现在我们就可以使用 `fig run` 命令启动一个 Django 应用了。
```
$ fig run web django-admin.py startproject figexample .
```
Fig 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject figexample . ` 指令。
这将在当前目录生成一个 Django 应用。
```
$ ls
Dockerfile fig.yml figexample manage.py requirements.txt
```
首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `figexample/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。
```
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
```
这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。
然后,运行 `fig up`
```
Recreating myapp_db_1...
Recreating myapp_web_1...
Attaching to myapp_db_1, myapp_web_1
myapp_db_1 |
myapp_db_1 | PostgreSQL stand-alone backend 9.1.11
myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: database system is ready to accept connections
myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: autovacuum launcher started
myapp_web_1 | Validating models...
myapp_web_1 |
myapp_web_1 | 0 errors found
myapp_web_1 | January 27, 2014 - 12:12:40
myapp_web_1 | Django version 1.6.1, using settings 'figexample.settings'
myapp_web_1 | Starting development server at http://0.0.0.0:8000/
myapp_web_1 | Quit the server with CONTROL-C.
```
这个 web 应用已经开始在你的 docker 守护进程里监听着 5000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。
你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `fig up` 后,在另外一个终端运行以下命令即可:
```
$ fig run web python manage.py syncdb
```

View File

@@ -1,31 +0,0 @@
##环境变量参考
*注意: 现在已经不推荐使用环境变量链接服务。替代方案是使用链接名称(默认就是被连接的服务名字)作为主机名来链接。详情查看 [fig.yml章节](./yml_ref.md)。
Fig 使用 Docker 链接来暴露一个服务的容器给其它容器。每一个链接的容器会注入一组以容器名称的大写字母开头得环境变量。
查看一个服务有那些有效的环境变量可以执行 `fig run SERVICE env`
`name_PORT`
完整URL例如 `DB_PORT=tcp://172.17.0.5:5432`
`name_PORT_num_protocol`
完整URL例如 `DB_PORT_5432_TCP=tcp://172.17.0.5:5432`
`name_PORT_num_protocol_ADDR`
容器的IP地址例如 `DB_PORT_5432_TCP_ADDR=172.17.0.5`
`name_PORT_num_protocol_PORT`
暴露端口号,例如: `DB_PORT_5432_TCP_PORT=5432`
`name_PORT_num_protocol_PROTO`
协议tcp 或 udp例如 `DB_PORT_5432_TCP_PROTO=tcp`
`name_NAME`
完整合格的容器名称,例如: `DB_1_NAME=/myapp_web_1/myapp_db_1`

View File

@@ -1,28 +0,0 @@
##安装 Fig
首先,安装 1.3 或者更新的 Docker 版本。
如果你的工作环境是 OS X ,可以通过查看 [Mac 安装指南(英文)](https://docs.docker.com/installation/mac/) ,完成安装 Docker 和 boot2docker 。一旦 boot2docker 运行后,执行以下指令设置一个环境变量,接着 Fig 就可以和它交互了。
```
$(boot2docker shellinit)
```
**如果想避免重启后重新设置,可以把上面的命令加到你的 ` ~/.bashrc` 文件里。*
关于 `Ubuntu` 还有 `其它的平台` 的安装,可以参照 [Ubuntu 安装指南(中文)](../install/ubuntu.md) 以及 [官方安装手册(英文)](https://docs.docker.com/installation/)。
下一步,安装 Fig
```
curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig
```
**如果你的 Docker 是管理员身份安装,以上命令可能也需要相同的身份。*
目前 Fig 的发行版本只支持 OSX 和 64 位的 Linux 系统。但因为它是用 Python 语言写的,所以对于其它平台上的用户,可以通过 Python 安装包来完成安装(支持的系统同样适用)。
```
$ sudo pip install -U fig
```
到这里就已经完成了。 执行 `fig --version` ,确认能够正常运行。

View File

@@ -1,141 +0,0 @@
##快速搭建基于 Docker 的隔离开发环境
使用 `Dockerfile` 文件指定你的应用环境,让它能在任意地方复制使用:
```
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
```
`fig.yml` 文件中指定应用使用的不同服务,让它们能够在一个独立的环境中一起运行:
```
web:
build: .
command: python app.py
links:
- db
ports:
- "8000:8000"
db:
image: postgres
```
**注意不需要再额外安装 Postgres 了!*
接着执行命令 `fig up` ,然后 Fig 就会启动并运行你的应用了。
![Docker](../_images/fig-example-large.gif)
Fig 可用的命令有:
* 启动、停止,和重建服务
* 查看服务的运行状态
* 查看运行中的服务的输入日志
* 对服务发送命令
##快速上手
我们试着让一个基本的 Python web 应用运行在 Fig 上。这个实验假设你已经知道一些 Python 知识,如果你不熟悉,但清楚概念上的东西也是没有问题的。
首先,[安装 Docker 和 Fig](install.md)
为你的项目创建一个目录
```
$ mkdir figtest
$ cd figtest
```
进入目录,创建 `app.py`,这是一个能够让 Redis 上的一个值自增的简单 web 应用,基于 Flask 框架。
```
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
```
`requirements.txt` 文件中指定应用的 Python 依赖包。
```
flask
redis
```
下一步我们要创建一个包含应用所有依赖的 Docker 镜像,这里将阐述怎么通过 `Dockerfile` 文件来创建。
```
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
```
以上的内容首先告诉 Docker 在容器里面安装 Python 代码的路径还有Python 依赖包。关于 Dockerfile 的更多信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)
接着我们通过 `fig.yml` 文件指定一系列的服务:
```
web:
build: .
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
```
这里指定了两个服务:
* web 服务,通过当前目录的 `Dockerfile` 创建。并且说明了在容器里面执行`python app.py ` 命令 ,转发在容器里开放的 5000 端口到本地主机的 5000 端口,连接 Redis 服务,并且挂载当前目录到容器里面,这样我们就可以不用重建镜像也能直接使用代码。
* redis 服务,我们使用公用镜像 [redis](https://registry.hub.docker.com/_/redis/)。
*
现在如果执行 `fig up` 命令 ,它就会拉取 redis 镜像,启动所有的服务。
```
$ fig up
Pulling image redis...
Building web...
Starting figtest_redis_1...
Starting figtest_web_1...
redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
web_1 | * Running on http://0.0.0.0:5000/
```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 5000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。
如果你想要在后台运行你的服务,可以在执行 `fig up` 命令的时候添加 `-d` 参数,然后使用 `fig ps` 查看有什么进程在运行。
```
$ fig up -d
Starting figtest_redis_1...
Starting figtest_web_1...
$ fig ps
Name Command State Ports
-------------------------------------------------------------------
figtest_redis_1 /usr/local/bin/run Up
figtest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp
```
`fig run` 指令可以帮你向服务发送命令。例如:查看 web 服务可以获取到的环境变量:
```
$ fig run web env
```
执行帮助命令 `fig --help` 查看其它可用的参数。
假设你使用了 `fig up -d` 启动 Fig可以通过以下命令停止你的服务
```
$ fig stop
```
以上内容或多或少的讲述了如何使用Fig 。通过查看下面的引用章节可以了解到关于命令、配置和环境变量的更多细节。如果你有任何想法或建议,[可以在 GitHub 上提出](https://github.com/docker/fig)。

View File

@@ -1,103 +0,0 @@
##使用 Rail 入门 Fig
我们现在将使用 Fig 配置并运行一个 Rails/PostgreSQL 应用。在开始之前,先确保 Fig 已经 [安装](install.md)。
在一切工作开始前,需要先设置好三个必要的文件。
首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
```
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp
```
以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。
下一步,我们需要一个引导加载 Rails 的文件 `Gemfile` 。 等一会儿它还会被 `rails new` 命令覆盖重写。
```
source 'https://rubygems.org'
gem 'rails', '4.0.2'
```
最后,`fig.yml` 文件才是最神奇的地方。 `fig.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。
```
db:
image: postgres
ports:
- "5432"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
```
所有文件就绪后,我们就可以通过使用 `fig run` 命令生成应用的骨架了。
```
$ fig run web rails new . --force --database=postgresql --skip-bundle
```
Fig 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。
```
$ ls
Dockerfile app fig.yml tmp
Gemfile bin lib vendor
Gemfile.lock config log
README.rdoc config.ru public
Rakefile db test
```
在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释,这样我们便可以使用 Javascript 运行环境:
```
gem 'therubyracer', platforms: :ruby
```
现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,仅仅需要重建一次)。
```
$ fig build
```
应用现在就可以启动了但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。
打开最新生成的 `database.yml` 文件。用以下内容替换:
```
development: &default
adapter: postgresql
encoding: unicode
database: postgres
pool: 5
username: postgres
password:
host: db
test:
<<: *default
database: myapp_test
```
现在就可以启动应用了。
```
$ fig up
```
如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息:
```
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
```
最后, 我们需要做的是创建数据库,打开另一个终端,运行:
```
$ fig run web rake db:create
```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。
![](../_images/fig-rails-screenshot.png)

View File

@@ -1,86 +0,0 @@
##使用 Wordpress 入门 Fig
Fig 让 Wordpress 运行在一个独立的环境中很简易。
[安装](install.md) Fig ,然后下载 Wordpress 到当前目录:
```
wordpress.org/latest.tar.gz | tar -xvzf -
```
这将会创建一个叫 wordpress 目录,你也可以重命名成你想要的名字。在目录里面,创建一个 `Dockerfile` 文件,定义应用的运行环境:
```
FROM orchardup/php5
ADD . /code
```
以上内容告诉 Docker 创建一个包含 PHP 和 Wordpress 的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。
下一步,`fig.yml` 文件将开启一个 web 服务和一个独立的 MySQL 实例:
```
web:
build: .
command: php -S 0.0.0.0:8000 -t /code
ports:
- "8000:8000"
links:
- db
volumes:
- .:/code
db:
image: orchardup/mysql
environment:
MYSQL_DATABASE: wordpress
```
要让这个应用跑起来还需要两个文件。
第一个,`wp-config.php` ,它是一个标准的 Wordpress 配置文件,有一点需要修改的是把数据库的配置指向 `db` 容器。
```
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', "db:3306");
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
$table_prefix = 'wp_';
define('WPLANG', '');
define('WP_DEBUG', false);
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');
```
第二个,`router.php` ,它告诉 PHP 内置的服务器怎么运行 Wordpress:
```
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
chdir($root);
$path = '/'.ltrim(parse_url($_SERVER['REQUEST_URI'])['path'],'/');
set_include_path(get_include_path().':'.__DIR__);
if(file_exists($root.$path))
{
if(is_dir($root.$path) && substr($path,strlen($path) - 1, 1) !== '/')
$path = rtrim($path,'/').'/index.php';
if(strpos($path,'.php') === false) return false;
else {
chdir(dirname($root.$path));
require_once $root.$path;
}
}else include_once 'index.php';
```
这些配置文件就绪后,在你的 Wordpress 目录里面执行 `fig up` 指令Fig 就会拉取镜像再创建我们所需要的镜像,然后启动 web 和数据库容器。 接着访问 docker 守护进程监听的 8000 端口就能看你的 Wordpress 网站了。(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。

View File

@@ -1,151 +0,0 @@
##fig.yml 参考
每个在 `fig.yml` 定义的服务都需要指定一个镜像或镜像的构建内容。像 `docker run` 的命令行一样,其它内容是可选的。
`docker run``Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV`) 作为已经提供的默认设置 - 你不需要在 `fig.yml` 中重新设置。
`image`
这里可以设置为标签或镜像ID的一部分。它可以是本地的也可以是远程的 - 如果镜像在本地不存在,`Fig` 将会尝试拉去这个镜像。
```
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
```
`build`
指定 `Dockerfile` 所在文件夹的路径。 `Fig` 将会构建这个镜像并给它生成一个名字,然后使用这个镜像。
```
build: /path/to/build/dir
```
`command`
覆盖默认的命令。
```
command: bundle exec thin -p 3000
```
`links`
在其它的服务中连接容器。使用服务名称(经常也作为别名)或服务名称加服务别名 `SERVICE:ALIAS` 都可以。
```
links:
- db
- db:database
- redis
```
可以在服务的容器中的 `/etc/hosts` 里创建别名。例如:
```
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
```
环境变量也将被创建 - 细节查看环境变量参考章节。
`ports`
暴露端口。使用宿主和容器 `HOST:CONTAINER` 或者仅仅容器的端口(宿主将会随机选择端口)都可以。
注:当使用 `HOST:CONTAINER` 格式来映射端口时如果你使用的容器端口小于60你可能会得到错误得结果因为 `YAML` 将会解析 `xx:yy` 这种数字格式为60进制。所以我们建议用字符指定你得端口映射。
```
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
```
`expose`
暴露不发布到宿主机的端口 - 它们只被连接的服务访问。仅仅内部的端口可以被指定。
```
expose:
- "3000"
- "8000"
```
`volumes`
卷挂载路径设置。可以设置宿主机路径 `HOST:CONTAINER` 或访问模式 `HOST:CONTAINER:ro`
```
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
```
`volumes_from`
从另一个服务或容器挂载所有卷。
```
volumes_from:
- service_name
- container_name
```
`environment`
设置环境变量。你可以使用数组或字典两种格式。
环境变量在运行 `Fig` 的机器上被解析成一个key。它有助于安全和指定的宿主值。
```
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
```
`net`
设置网络模式。使用和 `docker client``--net` 参数一样的值。
```
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
```
`dns`
配置DNS服务器。它可以是一个值也可以是一个列表。
```
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
```
`working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged`
这些都是和 `docker run` 对应的一个值。
```
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
```

View File

@@ -1,10 +1,10 @@
# Docker
# Docker
在之前的介中,我知道像是 Docker 的三大件之一。
在之前的介中,我知道像是 Docker 的三大件之一。
Docker 行容器前需要本地存在对应的镜像,如果像不存在本地Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
Docker 在執行容器前需要本地存在對應的鏡像,如果像不存在本地Docker 會從鏡像倉庫下載(預設是 Docker Hub 公共註冊伺服器中的倉庫)。
本章将介绍更多关于镜像的容,包括:
* 从仓库获取镜像;
* 管理本地主上的像;
*绍镜像实现的基本原理。
本章將介紹更多關於鏡像的容,包括:
* 從倉庫取得鏡像;
* 管理本地主上的像;
*紹鏡像實做的基本原理。

View File

@@ -1,28 +1,28 @@
##创建镜
##建立鏡
创建镜像有很多方法,用户可以 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个
建立鏡像有很多方法,使用者可以 Docker Hub 取得已有鏡像並更新,也可以利用本地文件系統建立一個
### 修改已有
先使用下载的镜像启动容器。
### 修改已有
先使用下載的鏡像啟動容器。
```
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
```
意:住容器的 ID后还会用到。
意:住容器的 ID後還會用到。
在容器中添加 json package(一个 ruby gem)
在容器中新增 json 和 gem 兩個應用
```
root@0b2616b0e5a8:/# gem install json
```
当结束后,我使用 exit 退出,在我的容器已被我们改变了,使用 `docker commit` 命令提交更新的副本。
當結束後,我使用 exit 退出,在我的容器已被我們改變了,使用 `docker commit` 命令提交更新的副本。
```
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
```
其中,`-m` 指定提交的说明信息,跟我使用的版本控制工具一`-a` 可以指定更新的用户信息;之是用来创建镜像的容器的 ID指定目标镜像的仓库名和 tag 息。创建成功后会返回这个镜像的 ID 息。
其中,`-m` 指定提交的說明訊息,跟我使用的版本控制工具一`-a` 可以指定更新的使用者訊息;之是用來建立鏡像的容器的 ID指定目標鏡像的倉庫名和 tag 息。建立成功後會返回這個鏡像的 ID 息。
使用 `docker images` 查看新创建的镜像。
使用 `docker images` 查看新建立的鏡像。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -30,22 +30,22 @@ training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
```
,可以使用新的镜像来启动容器
,可以使用新的鏡像來啟動容器
```
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#
```
###利用 Dockerfile 来创建镜
使用 `docker commit` 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我可以使用 `docker build` 来创建一个新的像。此,首先需要创建一个 Dockerfile包含一些如何创建镜像的指令。
###利用 Dockerfile 來建立鏡
使用 `docker commit` 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我可以使用 `docker build` 來建立一個新的像。此,首先需要建立一個 Dockerfile包含一些如何建立鏡像的指令。
新建一个目录和一 Dockerfile
新建一個目錄和一 Dockerfile
```
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
```
Dockerfile 中每一指令都创建镜像的一,例如:
Dockerfile 中每一指令都建立鏡像的一,例如:
```
# This is a comment
FROM ubuntu:14.04
@@ -54,13 +54,13 @@ RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
```
Dockerfile 基本的法是
* 使用`#`来注释
* `FROM` 指令告 Docker 使用哪个镜像作为基础
*着是维护者的
* `RUN`开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些
Dockerfile 基本的法是
* 使用`#`來註解
* `FROM` 指令告 Docker 使用哪個鏡像作為基礎
*著是維護者的
* `RUN`開頭的指令會在建立中執行,比如安裝一個軟件包,在這裡使用 apt-get 來安裝了一些
编写完成 Dockerfile 可以使用 `docker build` 生成像。
編寫完成 Dockerfile 可以使用 `docker build` 生成像。
```
$ sudo docker build -t="ouruser/sinatra:v2" .
@@ -68,7 +68,7 @@ Uploading context 2.56 kB
Uploading context
Step 0 : FROM ubuntu:14.04
---> 99ec81b80c55
Step 1 : MAINTAINER Newbee <newbee@docker.com>
Step 1 : MAINTAINER Kate Smith <ksmith@example.com>
---> Running in 7c5664a8a0c1
---> 2fa8ca4e2a13
Removing intermediate container 7c5664a8a0c1
@@ -96,15 +96,15 @@ Successfully installed sinatra-1.4.5
Removing intermediate container 5e9d0065c1f7
Successfully built 324104cde6ad
```
其中 `-t` 标记来添加 tag指定新的像的用户信息。
“.” 是 Dockerfile 所在的路径(当前目),也可以替换为一个具体的 Dockerfile 的路
其中 `-t` 標記來新增 tag指定新的像的使用者訊息。
“.” 是 Dockerfile 所在的路徑(當前目),也可以替換為一個具體的 Dockerfile 的路
可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 容,因所有的操作都要依 Dockerfile 来进行。
Dockfile 中的指令被一条一条的执行。每一步都建了一新的容器,在容器中行指令提交修改(就跟之前介绍过`docker commit`)。所有的指令都行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被除和清理了。
可以看到 build 程式在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 容,因所有的操作都要依 Dockerfile 來進行。
Dockfile 中的指令被一條一條的執行。每一步都建了一新的容器,在容器中行指令提交修改(就跟之前介紹過`docker commit`)。所有的指令都行完畢之後,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被除和清理了。
*意一个镜像不能超 127
*意一個鏡像不能超 127
此外,可以利用 `ADD` 命令制本地文件到像;用 `EXPOSE` 命令向外部放端口;用 `CMD` 命令描述容器启动后运行的程等。例如
此外,可以利用 `ADD` 命令制本地文件到像;用 `EXPOSE` 命令向外部放端口;用 `CMD` 命令描述容器啟動後執行的程等。例如
```
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
@@ -114,12 +114,12 @@ EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
```
在可以利用新创建的镜像来启动一个容器。
在可以利用新建立的鏡像來啟動一個容器。
```
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@8196968dac35:/#
```
可以用 `docker tag` 命令修改像的标签
可以用 `docker tag` 命令修改像的標簽
```
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
@@ -129,25 +129,25 @@ ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
```
*:更多用法,请参考 [Dockerfile](../dockerfile/README.md) 章
*:更多用法,請參考 [Dockerfile](../dockerfile/README.md) 章
### 本地文件系统导
本地文件系统导入一个镜像,可以使用 openvz容器虚拟化的先锋技术)的模板来创建
openvz 的模板下地址为 [templates](http://openvz.org/Download/templates/precreated)
### 本地文件系統導
本地文件系統導入一個鏡像,可以使用 openvz容器虛擬化的先鋒技術)的模板來建立
openvz 的模板下地址http://openvz.org/Download/templates/precreated。
比如,先下了一 ubuntu-14.04 的像,之使用以下命令入:
比如,先下了一 ubuntu-14.04 的像,之使用以下命令入:
```
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
```
查看新入的像。
查看新入的像。
```
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
```
###上传镜
用户可以通过 `docker push` 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的像到仓库中。
###上傳鏡
使用者可以透過 `docker push` 命令,把自己建立的鏡像上傳到倉庫中來共享。例如,使用者在 Docker Hub 上完成註冊後,可以推送自己的像到倉庫中。
```
$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)

View File

@@ -1,7 +1,7 @@
## 像的实现原理
## 像的實做原理
Docker 像是怎么实现增量的修改和维护的?
个镜像都由很多层次构Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 将这些不同的层结合到一个镜像中去。
Docker 像是怎麽實做增量的修改和維護的?
個鏡像都由很多層次構Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 將這些不同的層結合到一個鏡像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 到同一个目录下,另一更常用的就是将一个只读的分支和一个可写的分支合在一起Live CD 正是基此方法可以允许在镜像不的基上允许用户在其上行一些操作。
Docker 在 AUFS 上建的容器也是利用了似的原理。
通常 Union FS 有兩個用途, 一方面可以實做不借助 LVM、RAID 將多個 disk 到同一個目錄下,另一更常用的就是將一個唯讀的分支和一個可寫的分支合在一起Live CD 正是基此方法可以允許在鏡像不的基上允許使用者在其上行一些操作。
Docker 在 AUFS 上建的容器也是利用了似的原理。

View File

@@ -1,5 +1,5 @@
## 列出本地
使用 `docker images` 示本地已有的像。
## 列出本地
使用 `docker images` 示本地已有的像。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -11,19 +11,19 @@ ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB
...
```
在列出息中,可以看到几个字段信
在列出息中,可以看到幾段文字訊
* 来自于哪个仓库,比如 ubuntu
* 像的标记,比如 14.04
* 它的 `ID` (唯一)
* 创建时间
* 像大小
* 來自於哪個倉庫,比如 ubuntu
* 像的標記,比如 14.04
* 它的 `ID` (唯一)
* 建立時間
* 像大小
其中像的 `ID` 唯一标识了镜像,注意到 `ubuntu:14.04``ubuntu:trusty` 具有相同的`ID`明它们实际上是同一像。
其中像的 `ID` 唯一標識了鏡像,注意到 `ubuntu:14.04``ubuntu:trusty` 具有相同的`ID`明它們實際上是同一像。
`TAG` 息用来标记来自同一个仓库的不同像。例如 `ubuntu` 仓库中有多个镜像,通过 `TAG` 信息来区分发行版本,例如 `10.04``12.04``12.10``13.04``14.04` 等。例下面的命令指定使用`ubuntu:14.04` 来启动一个容器。
`TAG` 息用來標記來自同一個倉庫的不同像。例如 `ubuntu` 倉庫中有多個鏡像,透過 `TAG` 訊息來區分發行版本,例如 `10.04``12.04``12.10``13.04``14.04` 等。例下面的命令指定使用`ubuntu:14.04` 來啟動一個容器。
```
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
```
如果不指定具体的标记,则默认使用 `latest` 标记信息。
如果不指定具體的標記,則預設使用 `latest`

View File

@@ -1,8 +1,8 @@
## 获取镜像
## 取得映像檔
可以使用 `docker pull` 命令来从仓库获取所需要的镜像
可以使用 `docker pull` 命令來從倉庫取得所需要的映像檔
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 作業系統的映像檔
```
$ sudo docker pull ubuntu:12.04
Pulling repository ubuntu
@@ -14,12 +14,12 @@ a300658979be: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete
```
载过程中,会输出获取镜像的每一层信息。
載過程中,會輸出取得鏡像的每一層訊息。
命令实际上相当于 `$ sudo docker pull registry.hub.docker.com/ubuntu:12.04` 命令,即从注册服务`registry.hub.docker.com` 中的 `ubuntu` 仓库来下载标记为 `12.04`镜像
命令實際上相當於 `$ sudo docker pull registry.hub.docker.com/ubuntu:12.04` 命令,即從註冊伺服`registry.hub.docker.com` 中的 `ubuntu` 倉庫來下載標記為 `12.04`映像檔
候官方仓库注册服务器下载较慢,可以其他仓库下载
其它仓库下载时需要指定完整的仓库注册服务器地址。例如
候官方倉庫註冊伺服器下載較慢,可以其他倉庫下載
其它倉庫下載時需要指定完整的倉庫註冊伺服器地址。例如
```
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
Pulling dl.dockerpool.com:5000/ubuntu
@@ -32,7 +32,7 @@ ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete
```
完成,即可随时使用该镜像了,例如创建一个容器,其中行 bash 用。
完成,即可隨時使用該映像檔了,例如建立一個容器,其中行 bash 用。
```
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#

View File

@@ -1,5 +1,5 @@
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
```
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
@@ -8,20 +8,4 @@ Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
```
*意:在删除镜像之前要先用 `docker rm` 掉依赖于这个镜像的所有容器。
##清理所有未打过标签的本地镜像
`docker images` 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。
使用下面的命令可以清理所有未打过标签的本地镜像
```
$ sudo docker rmi $(docker images -q -f "dangling=true")
```
其中 `-q``-f` 是缩写, 完整的命令其实可以写着下面这样,是不是更容易理解一点?
```
$ sudo docker rmi $(docker images --quiet --filter "dangling=true")
```
*意:在刪除鏡像之前要先用 `docker rm` 掉依賴於這個鏡像的所有容器。

View File

@@ -1,7 +1,7 @@
## 存出和载入镜
## 存出和載入鏡
### 存出
如果要导出镜像到本地文件,可以使用 `docker save` 命令。
### 存出
如果要導出鏡像到本地文件,可以使用 `docker save` 命令。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -10,8 +10,8 @@ ubuntu 14.04 c4ff7513909d 5 weeks ago
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
```
### 载入镜
可以使用 `docker load` 从导出的本地文件中再入到本地镜像库,例如
### 載入鏡
可以使用 `docker load` 從導出的本地文件中再入到本地鏡像庫,例如
```
$ sudo docker load --input ubuntu_14.04.tar
```
@@ -19,4 +19,4 @@ $ sudo docker load --input ubuntu_14.04.tar
```
$ sudo docker load < ubuntu_14.04.tar
```
这将导入镜像以及其相的元数据信息(包括标签等)。
這將導入鏡像以及其相的元數據訊息(包括標簽等)。

View File

@@ -1,2 +1,2 @@
# 安
官方站上有各种环境下的 [指南](https://docs.docker.com/installation/#installation)这里主要介下Ubuntu和CentOS系列的安
# 安
官方站上有各種環境下的 [指南](https://docs.docker.com/installation/#installation)這裡主要介下Ubuntu和CentOS系列的安

View File

@@ -1,21 +1,21 @@
## CentOS 系列安 Docker
## CentOS 系列安 Docker
Docker 支持 CentOS6 及以的版本。
Docker 支持 CentOS6 及以的版本。
### CentOS6
对于 CentOS6可以使用 [EPEL](https://fedoraproject.org/wiki/EPEL) 库安装 Docker命令
對於 CentOS6可以使用 [EPEL](https://fedoraproject.org/wiki/EPEL) 套件庫安裝 Docker命令
```
$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io
```
### CentOS7
CentOS7 系 `CentOS-Extras` 中已 Docker可以直接安
CentOS7 系 `CentOS-Extras` 中已內建 Docker可以直接安
```
$ sudo yum install docker
```
装之后启动 Docker 服务,并让它随系统启动自动加载
裝之後啟動 Docker 服務,並讓它隨系統啟動自動載入
```
$ sudo service docker start
$ sudo chkconfig docker on

View File

@@ -1,7 +1,7 @@
## Ubuntu 系列安 Docker
## Ubuntu 系列安 Docker
### 通过系统自带包安装
Ubuntu 14.04 版本系统中已经自带了 Docker ,可以直接安
### 透過系統內建套件安裝
Ubuntu 14.04 版本套件庫中已經內建了 Docker 套件,可以直接安
```
$ sudo apt-get update
$ sudo apt-get install -y docker.io
@@ -9,28 +9,28 @@ $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
```
如果使用操作系统自带包安装 Docker目前安的版本是比较旧的 0.9.1。 要安更新的版本,可以通过使用 Docker 源的方式
如果使用作業系統內建套件安裝 Docker目前安的版本是比較舊的 0.9.1。 要安更新的版本,可以透過更新 Docker 套件庫的方式進行安裝
### 通过Docker源安装最新版本
要安最新的 Docker 版本,首先需要安 apt-transport-https 支持,之后通过添加源来安装
### 透過Docker 套件庫安裝最新版本
要安最新的 Docker 版本,首先需要安 apt-transport-https 支持,之後透過新增套件庫來安裝
```
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
$ sudo apt-get install -y lxc-docker
```
### 14.04 之前版本
如果是较低版本的 Ubuntu 系,需要先更新核。
如果是較舊版本的 Ubuntu 系,需要先更新核
```
$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
```
后重复上面的步即可。
後重複上面的步即可。
装之后启动 Docker 服
裝之後啟動 Docker 服
```
$ sudo service docker start
```

View File

@@ -1,8 +1,8 @@
#
本章将带领你进入 Docker 的世界。
#
本章將帶領你進入 Docker 的世界。
是 Docker
是 Docker
用它会带来什么样的好
用它會帶來什麼樣的好
好吧,让我们带着问题开始这神奇之旅。
好吧,讓我們帶著問題開始這神奇之旅。

View File

@@ -1,16 +1,16 @@
## 什是 Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司部的一个业余项目。它基 Google 公司推出的 Go 语言实现
项目后来加入了 Linux 基金,遵了 Apache 2.0 协议,项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护
## 什是 Docker
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司部的一個業餘項目。它基 Google 公司推出的 Go 語言實做
項目後來加入了 Linux 基金,遵了 Apache 2.0 協議,原始碼在 [GitHub](https://github.com/docker/docker) 上進行維護
Docker 自开源后受到广泛的注和讨论,以至 dotCloud 公司后来都改名 Docker Inc。Redhat 已在其 RHEL6.5 中集中支持 DockerGoogle 也在其 PaaS 品中广泛应用。
Docker 自開源後受到泛的注和討論,以至 dotCloud 公司後來都改名 Docker Inc。Redhat 已在其 RHEL6.5 中集中支持 DockerGoogle 也在其 PaaS 品中廣泛應用。
Docker 目的目标是实现轻量级的操作系统虚拟化解方案。
Docker 的基是 Linux 容器LXC等技
Docker 目的目標是實做輕量級的作業系統虛擬化解方案。
Docker 的基是 Linux 容器LXC等技
在 LXC 的基上 Docker 行了一步的封装,让用户不需要去心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一快速轻量级的虚拟机一样简单
在 LXC 的基上 Docker 行了一步的封裝,讓使用者不需要去心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一快速輕量級的虛擬機一樣簡單
下面的片比了 Docker 和传统虚拟化方式的不同之,可容器是在操作系统层面上实现虚拟化,直接用本地主机的操作系统,而传统方式是在硬件层面实现
下面的片比了 Docker 和傳統虛擬化方式的不同之,可容器是在作業系統層面上實做虛擬化,直接使用本地主機的作業系統,而傳統方式是在硬體層面實做
![传统虚拟](../_images/virtualization.png)
![傳統虛擬](../_images/virtualization.png)
![Docker](../_images/docker.png)

Some files were not shown because too many files have changed in this diff Show More