Compare commits
88 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59da0ff5ad | ||
|
|
51c7819ce1 | ||
|
|
a795bf863a | ||
|
|
9d0330915d | ||
|
|
4789287f30 | ||
|
|
8b9dbd74c5 | ||
|
|
44b5532042 | ||
|
|
291217dd58 | ||
|
|
fe155633ec | ||
|
|
2b44ab2f6b | ||
|
|
b3bcdf7166 | ||
|
|
bf8719d551 | ||
|
|
05cfded4e1 | ||
|
|
ba64651d59 | ||
|
|
2c4ede2b99 | ||
|
|
b14f5217f1 | ||
|
|
73dd27f79e | ||
|
|
237130150b | ||
|
|
17d03df446 | ||
|
|
8aa09dd966 | ||
|
|
dbfa8c8b82 | ||
|
|
b19309a9c2 | ||
|
|
8723a52ebc | ||
|
|
ac2661cbd5 | ||
|
|
686b3427a6 | ||
|
|
6215bd5b02 | ||
|
|
d25a602382 | ||
|
|
3d485d0432 | ||
|
|
86438891e0 | ||
|
|
6dc91f4153 | ||
|
|
4e1f82eee6 | ||
|
|
6f4669c26c | ||
|
|
9651db6a34 | ||
|
|
439d569c8b | ||
|
|
d090630f7f | ||
|
|
939e98b040 | ||
|
|
893e0f8bb7 | ||
|
|
d24b44076b | ||
|
|
45acb9c3c3 | ||
|
|
0f699adab0 | ||
|
|
d4ba34df99 | ||
|
|
3741994aef | ||
|
|
4a288084e1 | ||
|
|
7a3b6fe171 | ||
|
|
20289b49fc | ||
|
|
5799061793 | ||
|
|
88950a428c | ||
|
|
c21fd41952 | ||
|
|
1b900e1281 | ||
|
|
fb1a111705 | ||
|
|
0fab5a33c8 | ||
|
|
82845dbfb2 | ||
|
|
acdd28a5c6 | ||
|
|
6b168bced1 | ||
|
|
cb4963b8fa | ||
|
|
47d4f30697 | ||
|
|
2c7762fecc | ||
|
|
96c9b574dd | ||
|
|
0bd4106ed4 | ||
|
|
423781aec5 | ||
|
|
1d0a49ca31 | ||
|
|
e3085090b4 | ||
|
|
37dbe623bd | ||
|
|
6850986efb | ||
|
|
b16ff0610b | ||
|
|
54ad70f9fd | ||
|
|
f6073d41af | ||
|
|
c56ccb9c8a | ||
|
|
0a084995ce | ||
|
|
4926d0c337 | ||
|
|
bd9010f28d | ||
|
|
cb374089ba | ||
|
|
f6542a2fcb | ||
|
|
484340326b | ||
|
|
f4ba04c1c0 | ||
|
|
20c3941826 | ||
|
|
216059f835 | ||
|
|
665e06c473 | ||
|
|
4eee9fe9f5 | ||
|
|
fd748e30e0 | ||
|
|
93f3edd62b | ||
|
|
84e5cf1f58 | ||
|
|
1655c2458d | ||
|
|
01ba8b47a6 | ||
|
|
2d0b4da76e | ||
|
|
2ee6b1edfe | ||
|
|
a933cd5423 | ||
|
|
9ecb1194ca |
1
.gitignore
vendored
@@ -5,4 +5,3 @@
|
|||||||
_book/
|
_book/
|
||||||
*.swp
|
*.swp
|
||||||
*.edx
|
*.edx
|
||||||
.DS_Store
|
|
||||||
|
|||||||
146
README.md
@@ -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
|
最新版本線上閱讀:[正體版](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)。
|
||||||
* QQ 群II (已满):419042067
|
|
||||||
* QQ 群III(可加):210028779
|
|
||||||
|
|
||||||

|
另外,歡迎加入 [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)
|
本書原始碼在 Github 上維護,歡迎參與: [https://github.com/philipz/docker_practice](https://github.com/philipz/docker_practice)。
|
||||||
* [京东图书](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)
|
|
||||||
|
|
||||||
## 主要版本历史
|
感謝所有的 [貢獻者](https://github.com/philipz/docker_practice/graphs/contributors)。
|
||||||
* 0.6.0: 2015-12-24
|
|
||||||
* 补充 Machine 项目
|
## 主要版本歷史
|
||||||
* 修正若干 bug
|
* 0.3: 2014-10-TODO
|
||||||
* 0.5: 2015-06-29
|
* 完成倉庫章節;
|
||||||
* 添加 Compose 项目
|
* 重寫安全章節;
|
||||||
* 添加 Machine 项目
|
* 修正底層實做章節的架構、名字空間、控制組、檔案系統、容器格式等內容;
|
||||||
* 添加 Swarm 项目
|
* 新增對常見倉庫和鏡像的介紹;
|
||||||
* 完善 Kubernetes 项目内容
|
* 新增 Dockerfile 的介紹;
|
||||||
* 添加 Mesos 项目内容
|
* 重新校訂中英文混排格式。
|
||||||
* 0.4: 2015-05-08
|
|
||||||
* 添加 Etcd 项目
|
|
||||||
* 添加 Fig 项目
|
|
||||||
* 添加 CoreOS 项目
|
|
||||||
* 添加 Kubernetes 项目
|
|
||||||
* 0.3: 2014-11-25
|
|
||||||
* 完成仓库章节;
|
|
||||||
* 重写安全章节;
|
|
||||||
* 修正底层实现章节的架构、名字空间、控制组、文件系统、容器格式等内容;
|
|
||||||
* 添加对常见仓库和镜像的介绍;
|
|
||||||
* 添加 Dockerfile 的介绍;
|
|
||||||
* 重新校订中英文混排格式。
|
|
||||||
* 修订文字表达。
|
|
||||||
* 发布繁体版本分支:zh-Hant。
|
|
||||||
* 0.2: 2014-09-18
|
* 0.2: 2014-09-18
|
||||||
* 对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节;
|
* 對照官方文檔重寫介紹、基本概念、安裝、鏡像、容器、倉庫、資料管理、網路等章節;
|
||||||
* 添加底层实现章节;
|
* 新增底層實做章節;
|
||||||
* 添加命令查询和资源链接章节;
|
* 新增命令查詢和資源連結章節;
|
||||||
* 其它修正。
|
* 其它修正。
|
||||||
* 0.1: 2014-09-05
|
* 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"
|
如果你願意一起校對的話,請仔細閱讀:
|
||||||
```
|
|
||||||
* 修改代码后提交,并推送到自己的仓库。
|
- 使用 markdown 進行翻譯,文件名必須使用英文,因為中文的話 gitbook 編譯的時候會出問題
|
||||||
```
|
- 引號請使用「」和『』
|
||||||
$ #do some change on the content
|
- fork 過去之後新建一個分支進行翻譯,完成後 pull request 這個分支,沒問題的話我會合併到 master 分支中
|
||||||
$ git commit -am "Fix issue #1: change helo to hello"
|
- 有其他任何問題都歡迎發 issue,我看到了會盡快回覆
|
||||||
$ 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
|
- 盡量先搜尋,一般來說程式語言的大部分術語是一樣的,可以參考[這個網站](http://jjhou.boolan.com/terms.htm)
|
||||||
$ git push -f origin master
|
- 如果以上兩條都沒有找到合適的結果,請自己決定一個合適的翻譯或者直接使用英文原文,後期校對的時候會進行統一
|
||||||
```
|
- 校稿時,若有發現沒有被翻譯成台灣術語的大陸術語,可以將它新增到 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/)
|
||||||
|
|||||||
163
SUMMARY.md
@@ -1,121 +1,76 @@
|
|||||||
# Summary
|
# Summary
|
||||||
|
|
||||||
* [前言](README.md)
|
* [前言](README.md)
|
||||||
* [Docker 简介](introduction/README.md)
|
* [Docker 簡介](introduction/README.md)
|
||||||
* [什么是 Docker](introduction/what.md)
|
* [什麼是 Docker](introduction/what.md)
|
||||||
* [为什么要用 Docker](introduction/why.md)
|
* [為什麼要用 Docker](introduction/why.md)
|
||||||
* [基本概念](basic_concept/README.md)
|
* [基本概念](basic_concept/README.md)
|
||||||
* [镜像](basic_concept/image.md)
|
* [映像檔](basic_concept/image.md)
|
||||||
* [容器](basic_concept/container.md)
|
* [容器](basic_concept/container.md)
|
||||||
* [仓库](basic_concept/repository.md)
|
* [倉庫](basic_concept/repository.md)
|
||||||
* [安装](install/README.md)
|
* [安裝](install/README.md)
|
||||||
* [Ubuntu](install/ubuntu.md)
|
* [Ubuntu](install/ubuntu.md)
|
||||||
* [CentOS](install/centos.md)
|
* [CentOS](install/centos.md)
|
||||||
* [镜像](image/README.md)
|
* [映像檔](image/README.md)
|
||||||
* [获取镜像](image/pull.md)
|
* [取得映像檔](image/pull.md)
|
||||||
* [列出](image/list.md)
|
* [列出](image/list.md)
|
||||||
* [创建](image/create.md)
|
* [建立](image/create.md)
|
||||||
* [存出和载入](image/save_load.md)
|
* [存出和載入](image/save_load.md)
|
||||||
* [移除](image/rmi.md)
|
* [移除](image/rmi.md)
|
||||||
* [实现原理](image/internal.md)
|
* [實做原理](image/internal.md)
|
||||||
* [容器](container/README.md)
|
* [容器](container/README.md)
|
||||||
* [启动](container/run.md)
|
* [啟動](container/run.md)
|
||||||
* [守护态运行](container/daemon.md)
|
* [守護態執行](container/daemon.md)
|
||||||
* [终止](container/stop.md)
|
* [終止](container/stop.md)
|
||||||
* [进入容器](container/enter.md)
|
* [進入容器](container/enter.md)
|
||||||
* [导出和导入](container/import_export.md)
|
* [導出與導入](container/import_export.md)
|
||||||
* [删除](container/rm.md)
|
* [刪除](container/rm.md)
|
||||||
* [仓库](repository/README.md)
|
* [倉庫](repository/README.md)
|
||||||
* [Docker Hub](repository/dockerhub.md)
|
* [Docker Hub](repository/dockerhub.md)
|
||||||
* [私有仓库](repository/local_repo.md)
|
* [私有倉庫](repository/local_repo.md)
|
||||||
* [配置文件](repository/config.md)
|
* [設定文件](repository/config.md)
|
||||||
* [数据管理](data_management/README.md)
|
* [數據管理](data_management/README.md)
|
||||||
* [数据卷](data_management/volume.md)
|
* [數據卷](data_management/volume.md)
|
||||||
* [数据卷容器](data_management/container.md)
|
* [數據卷容器](data_management/container.md)
|
||||||
* [备份、恢复、迁移数据卷](data_management/management.md)
|
* [備份、恢復、遷移數據卷](data_management/management.md)
|
||||||
* [使用网络](network/README.md)
|
* [使用網路](network/README.md)
|
||||||
* [外部访问容器](network/port_mapping.md)
|
* [外部訪問容器](network/port_mapping.md)
|
||||||
* [容器互联](network/linking.md)
|
* [容器互連](network/linking.md)
|
||||||
* [高级网络配置](advanced_network/README.md)
|
* [進階網路設定](advanced_network/README.md)
|
||||||
* [快速配置指南](advanced_network/quick_guide.md)
|
* [快速設定指南](advanced_network/quick_guide.md)
|
||||||
* [配置 DNS](advanced_network/dns.md)
|
* [設定 DNS](advanced_network/dns.md)
|
||||||
* [容器访问控制](advanced_network/access_control.md)
|
* [容器訪問控制](advanced_network/access_control.md)
|
||||||
* [端口映射实现](advanced_network/port_mapping.md)
|
* [端口映射實做](advanced_network/port_mapping.md)
|
||||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
* [設定 docker0 網橋](advanced_network/docker0.md)
|
||||||
* [自定义网桥](advanced_network/bridge.md)
|
* [自定義網橋](advanced_network/bridge.md)
|
||||||
* [工具和示例](advanced_network/example.md)
|
* [工具與範例](advanced_network/example.md)
|
||||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
* [編輯網路設定文件](advanced_network/config_file.md)
|
||||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
* [實例:創造一個點對點連接](advanced_network/ptp.md)
|
||||||
* [实战案例](cases/README.md)
|
* [實戰案例](cases/README.md)
|
||||||
* [使用 Supervisor 来管理进程](cases/supervisor.md)
|
* [使用 Supervisor 來管理程式](cases/supervisor.md)
|
||||||
* [创建 tomcat/weblogic 集群](cases/tomcat.md)
|
* [建立 tomcat/weblogic 集群](cases/tomcat.md)
|
||||||
* [多台物理主机之间的容器互联](cases/container_connect.md)
|
* [多台實體主機之間的容器互連](cases/container_connect.md)
|
||||||
* [标准化开发测试和生产环境](cases/environment.md)
|
* [標準化開發測試和生產環境](cases/environment.md)
|
||||||
* [安全](security/README.md)
|
* [安全](security/README.md)
|
||||||
* [内核名字空间](security/kernel_ns.md)
|
* [內核命名空間](security/kernel_ns.md)
|
||||||
* [控制组](security/control_group.md)
|
* [控制組](security/control_group.md)
|
||||||
* [服务端防护](security/daemon_sec.md)
|
* [伺服端防護](security/daemon_sec.md)
|
||||||
* [内核能力机制](security/kernel_capability.md)
|
* [內核能力機制](security/kernel_capability.md)
|
||||||
* [其它安全特性](security/other_feature.md)
|
* [其他安全特性](security/other_feature.md)
|
||||||
* [总结](security/summary.md)
|
* [總結](security/summary.md)
|
||||||
* [Dockerfile](dockerfile/README.md)
|
* [Dockerfile](dockerfile/README.md)
|
||||||
* [基本结构](dockerfile/basic_structure.md)
|
* [基本結構](dockerfile/basic_structure.md)
|
||||||
* [指令](dockerfile/instructions.md)
|
* [指令](dockerfile/instructions.md)
|
||||||
* [创建镜像](dockerfile/build_image.md)
|
* [建立映像檔](dockerfile/build_image.md)
|
||||||
* [底层实现](underly/README.md)
|
* [底層實做](underly/README.md)
|
||||||
* [基本架构](underly/arch.md)
|
* [基本架構](underly/arch.md)
|
||||||
* [名字空间](underly/namespace.md)
|
* [命名空間](underly/namespace.md)
|
||||||
* [控制组](underly/cgroups.md)
|
* [控制組](underly/cgroups.md)
|
||||||
* [联合文件系统](underly/ufs.md)
|
* [Union 文件系統](underly/ufs.md)
|
||||||
* [容器格式](underly/container_format.md)
|
* [容器格式](underly/container_format.md)
|
||||||
* [网络](underly/network.md)
|
* [網路](underly/network.md)
|
||||||
* [Docker Compose 项目](compose/README.md)
|
* [附錄一:命令查詢](appendix_command/README.md)
|
||||||
* [简介](compose/intro.md)
|
* [附錄二:常見倉庫介紹](appendix_repo/README.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)
|
|
||||||
* [Ubuntu](appendix_repo/ubuntu.md)
|
* [Ubuntu](appendix_repo/ubuntu.md)
|
||||||
* [CentOS](appendix_repo/centos.md)
|
* [CentOS](appendix_repo/centos.md)
|
||||||
* [MySQL](appendix_repo/mysql.md)
|
* [MySQL](appendix_repo/mysql.md)
|
||||||
@@ -124,5 +79,5 @@
|
|||||||
* [Nginx](appendix_repo/nginx.md)
|
* [Nginx](appendix_repo/nginx.md)
|
||||||
* [WordPress](appendix_repo/wordpress.md)
|
* [WordPress](appendix_repo/wordpress.md)
|
||||||
* [Node.js](appendix_repo/nodejs.md)
|
* [Node.js](appendix_repo/nodejs.md)
|
||||||
* [附录三:有用的资源](appendix_resources/README.md)
|
* [附錄三:資源連結](appendix_resources/README.md)
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 217 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 153 KiB |
@@ -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 |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 103 KiB |
@@ -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
|
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
|
||||||
function docker-enter() {
|
function docker-enter() {
|
||||||
#if [ -e $(dirname "$0")/nsenter ]; then
|
if [ -e $(dirname "$0")/nsenter ]; then
|
||||||
#Change for centos bash running
|
|
||||||
if [ -e $(dirname '$0')/nsenter ]; then
|
|
||||||
# with boot2docker, nsenter is not in the PATH but it is in the same folder
|
# with boot2docker, nsenter is not in the PATH but it is in the same folder
|
||||||
NSENTER=$(dirname "$0")/nsenter
|
NSENTER=$(dirname "$0")/nsenter
|
||||||
else
|
else
|
||||||
# if nsenter has already been installed with path notified, here will be clarified
|
NSENTER=nsenter
|
||||||
NSENTER=$(which nsenter)
|
|
||||||
#NSENTER=nsenter
|
|
||||||
fi
|
fi
|
||||||
[ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return
|
[ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return
|
||||||
|
|
||||||
|
|||||||
@@ -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 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
接下來的部分將介紹在一些場景中,Docker 所有的網路自訂設定。以及透過 Linux 命令來調整、補充、甚至替換 Docker 預設的網路設定。
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
## 容器访问控制
|
## 容器訪問控制
|
||||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
容器的訪問控制,主要透過 Linux 上的 `iptables` 防火墻來進行管理和實做。`iptables` 是 Linux 上默認的防火墻軟件,在大部分發行版中都自帶。
|
||||||
|
|
||||||
### 容器访问外部网络
|
### 容器訪問外部網路
|
||||||
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
|
容器要想訪問外部網路,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。
|
||||||
|
|
||||||
```
|
```
|
||||||
$sysctl net.ipv4.ip_forward
|
$sysctl net.ipv4.ip_forward
|
||||||
net.ipv4.ip_forward = 1
|
net.ipv4.ip_forward = 1
|
||||||
```
|
```
|
||||||
如果为 0,说明没有开启转发,则需要手动打开。
|
如果為 0,說明沒有開啟轉發,則需要手動打開。
|
||||||
```
|
```
|
||||||
$sysctl -w net.ipv4.ip_forward=1
|
$sysctl -w net.ipv4.ip_forward=1
|
||||||
```
|
```
|
||||||
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。
|
如果在啟動 Docker 服務的時候設定 `--ip-forward=true`, Docker 就會自動設定系統的 `ip_forward` 參數為 1。
|
||||||
|
|
||||||
### 容器之间访问
|
### 容器之間訪問
|
||||||
容器之间相互访问,需要两方面的支持。
|
容器之間相互訪問,需要兩方面的支持。
|
||||||
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
|
* 容器的網路拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
|
||||||
* 本地系统的防火墙软件 -- `iptables` 是否允许通过。
|
* 本地系統的防火墻軟件 -- `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
|
$ 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
|
$ 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
|
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` 參數指定的名字。主機名則不會被識別。
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
## 自定义网桥
|
## 自定義網橋
|
||||||
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
|
除了默認的 `docker0` 網橋,使用者也可以指定網橋來連接各個容器。
|
||||||
|
|
||||||
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
|
在啟動 Docker 服務的時候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 來指定使用的網橋。
|
||||||
|
|
||||||
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
|
如果服務已經執行,那需要先停止服務,並刪除舊的網橋。
|
||||||
```
|
```
|
||||||
$ sudo service docker stop
|
$ sudo service docker stop
|
||||||
$ sudo ip link set dev docker0 down
|
$ sudo ip link set dev docker0 down
|
||||||
$ sudo brctl delbr docker0
|
$ sudo brctl delbr docker0
|
||||||
```
|
```
|
||||||
然后创建一个网桥 `bridge0`。
|
然後建立一個網橋 `bridge0`。
|
||||||
```
|
```
|
||||||
$ sudo brctl addbr bridge0
|
$ sudo brctl addbr bridge0
|
||||||
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
||||||
$ sudo ip link set dev bridge0 up
|
$ sudo ip link set dev bridge0 up
|
||||||
```
|
```
|
||||||
查看确认网桥创建并启动。
|
查看確認網橋建立並啟動。
|
||||||
```
|
```
|
||||||
$ ip addr show bridge0
|
$ ip addr show bridge0
|
||||||
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
|
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
|
inet 192.168.5.1/24 scope global bridge0
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
```
|
```
|
||||||
配置 Docker 服务,默认桥接到创建的网桥上。
|
設定 Docker 服務,默認橋接到建立的網橋上。
|
||||||
```
|
```
|
||||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||||
$ sudo service docker start
|
$ sudo service docker start
|
||||||
```
|
```
|
||||||
启动 Docker 服务。
|
啟動 Docker 服務。
|
||||||
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
|
新建一個容器,可以看到它已經橋接到了 `bridge0` 上。
|
||||||
|
|
||||||
可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令来查看 IP 地址配置和路由信息。
|
可以繼續用 `brctl show` 命令查看橋接的訊息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令來查看 IP 地址設定和路由訊息。
|
||||||
|
|||||||
@@ -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` 提交。
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## 配置 DNS
|
## 設定 DNS
|
||||||
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?
|
Docker 沒有為每個容器專門定制鏡像,那麽怎麽自定義設定容器的主機名和 DNS 設定呢?
|
||||||
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
秘訣就是它利用虛擬文件來掛載到來容器的 3 個相關設定文件。
|
||||||
|
|
||||||
在容器中使用 mount 命令可以看到挂载信息:
|
在容器中使用 mount 命令可以看到掛載訊息:
|
||||||
```
|
```
|
||||||
$ mount
|
$ mount
|
||||||
...
|
...
|
||||||
@@ -11,19 +11,19 @@ $ mount
|
|||||||
tmpfs on /etc/resolv.conf type tmpfs ...
|
tmpfs on /etc/resolv.conf type tmpfs ...
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 `/etc/resolv.conf` 文件立刻得到更新。
|
這種機制可以讓宿主主機 DNS 訊息發生更新後,所有 Docker 容器的 dns 設定透過 `/etc/resolv.conf` 文件立刻得到更新。
|
||||||
|
|
||||||
如果用户想要手动指定容器的配置,可以利用下面的选项。
|
如果使用者想要手動指定容器的設定,可以利用下面的選項。
|
||||||
|
|
||||||
`-h HOSTNAME or --hostname=HOSTNAME`
|
`-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`
|
`--link=CONTAINER_NAME:ALIAS`
|
||||||
选项会在创建容器的时候,添加一个其他容器的主机名到 `/etc/hosts` 文件中,让新容器的进程可以使用主机名 ALIAS 就可以连接它。
|
選項會在建立容器的時候,新增一個其他容器的主機名到 `/etc/hosts` 文件中,讓新容器的程式可以使用主機名 ALIAS 就可以連接它。
|
||||||
|
|
||||||
`--dns=IP_ADDRESS`
|
`--dns=IP_ADDRESS`
|
||||||
添加 DNS 服务器到容器的 `/etc/resolv.conf` 中,让容器用这个服务器来解析所有不在 `/etc/hosts` 中的主机名。
|
新增 DNS 伺服器到容器的 `/etc/resolv.conf` 中,讓容器用這個伺服器來解析所有不在 `/etc/hosts` 中的主機名。
|
||||||
|
|
||||||
`--dns-search=DOMAIN`
|
`--dns-search=DOMAIN`
|
||||||
设定容器的搜索域,当设定搜索域为 `.example.com` 时,在搜索一个名为 host 的主机时,DNS 不仅搜索host,还会搜索 `host.example.com`。
|
設定容器的搜索域,當設定搜索域為 `.example.com` 時,在搜索一個名為 host 的主機時,DNS 不僅搜索host,還會搜索 `host.example.com`。
|
||||||
注意:如果没有上述最后 2 个选项,Docker 会默认用主机上的 `/etc/resolv.conf` 来配置容器。
|
註意:如果沒有上述最後 2 個選項,Docker 會默認用主機上的 `/etc/resolv.conf` 來設定容器。
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
## 配置 docker0 网桥
|
## 設定 docker0 網橋
|
||||||
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
|
Docker 服務默認會建立一個 `docker0` 網橋(其上有一個 `docker0` 內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網路。
|
||||||
|
|
||||||
Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。
|
Docker 默認指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以透過網橋相互通信,它還給出了 MTU(接口允許接收的最大傳輸單元),通常是 1500 Bytes,或宿主主機網路路由上支持的默認值。這些值都可以在服務啟動的時候進行設定。
|
||||||
* `--bip=CIDR` -- IP 地址加掩码格式,例如 192.168.1.5/24
|
* `--bip=CIDR` -- IP 地址加掩碼格式,例如 192.168.1.5/24
|
||||||
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置
|
* `--mtu=BYTES` -- 覆蓋默認的 Docker mtu 設定
|
||||||
|
|
||||||
也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。
|
也可以在設定文件中設定 DOCKER_OPTS,然後重啟服務。
|
||||||
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
|
由於目前 Docker 網橋是 Linux 網橋,使用者可以使用 `brctl show` 來查看網橋和端口連接訊息。
|
||||||
```
|
```
|
||||||
$ sudo brctl show
|
$ sudo brctl show
|
||||||
bridge name bridge id STP enabled interfaces
|
bridge name bridge id STP enabled interfaces
|
||||||
docker0 8000.3a1d7362b4ee no veth65f9
|
docker0 8000.3a1d7362b4ee no veth65f9
|
||||||
vethdda6
|
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
|
$ sudo docker run -i -t --rm base /bin/bash
|
||||||
$ ip addr show eth0
|
$ ip addr show eth0
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## 工具和示例
|
## 工具和示例
|
||||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
在介紹自定義網路拓撲之前,你可能會對一些外部工具和例子感興趣:
|
||||||
|
|
||||||
### pipework
|
### pipework
|
||||||
Jérôme Petazzoni 编写了一个叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。
|
Jérôme Petazzoni 編寫了一個叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 腳本,可以幫助使用者在比較復雜的場景中完成容器的連接。
|
||||||
|
|
||||||
### playground
|
### 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 的伺服器。
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
## 映射容器端口到宿主主机的实现
|
## 映射容器端口到宿主主機的實做
|
||||||
|
|
||||||
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
|
默認情況下,容器可以主動訪問到外部網路的連接,但是外部網路無法訪問到容器。
|
||||||
### 容器访问外部实现
|
### 容器訪問外部實做
|
||||||
容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
容器所有到外部網路的連接,源地址都會被NAT成本地系統的IP地址。這是使用 `iptables` 的源地址偽裝操作實做的。
|
||||||
|
|
||||||
查看主机的 NAT 规则。
|
查看主機的 NAT 規則。
|
||||||
```
|
```
|
||||||
$ sudo iptables -t nat -nL
|
$ 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
|
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
|
$ 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
|
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
|
$ iptables -t nat -nL
|
||||||
Chain DOCKER (2 references)
|
Chain DOCKER (2 references)
|
||||||
target prot opt source destination
|
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
|
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
|
* 這裡的規則映射了 0.0.0.0,意味著將接受主機來自所有接口的流量。使用者可以透過 `-p IP:host_port:container_port` 或 `-p
|
||||||
IP::port` 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
|
IP::port` 來指定允許訪問容器的主機上的 IP、接口等,以制定更嚴格的規則。
|
||||||
* 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之后重启 Docker 服务即可生效。
|
* 如果希望永久綁定到某個固定的 IP 地址,可以在 Docker 設定文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之後重啟 Docker 服務即可生效。
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
## 示例:创建一个点到点连接
|
## 示例:建立一個點到點連接
|
||||||
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
默認情況下,Docker 會將所有容器連接到由 `docker0` 提供的虛擬子網中。
|
||||||
|
|
||||||
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
使用者有時候需要兩個容器之間可以直連通信,而不用透過主機網橋進行橋接。
|
||||||
|
|
||||||
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
|
解決辦法很簡單:建立一對 `peer` 接口,分別放到兩個容器中,設定成點到點鏈路類型即可。
|
||||||
|
|
||||||
首先启动 2 个容器:
|
首先啟動 2 個容器:
|
||||||
```
|
```
|
||||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||||
root@1f1f4c1f931a:/#
|
root@1f1f4c1f931a:/#
|
||||||
@@ -13,7 +13,7 @@ $ sudo docker run -i -t --rm --net=none base /bin/bash
|
|||||||
root@12e343489d2f:/#
|
root@12e343489d2f:/#
|
||||||
```
|
```
|
||||||
|
|
||||||
找到进程号,然后创建网络名字空间的跟踪文件。
|
找到程式號,然後建立網路名字空間的跟蹤文件。
|
||||||
```
|
```
|
||||||
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||||
2989
|
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
|
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
|
||||||
```
|
```
|
||||||
|
|
||||||
创建一对 `peer` 接口,然后配置路由
|
建立一對 `peer` 接口,然後設定路由
|
||||||
```
|
```
|
||||||
$ sudo ip link add A type veth peer name B
|
$ 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 link set B up
|
||||||
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
|
$ 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` 來關閉容器之間的通信。
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
## 快速配置指南
|
## 快速設定指南
|
||||||
|
|
||||||
下面是一个跟 Docker 网络相关的命令列表。
|
下面是一個跟 Docker 網路相關的命令列表。
|
||||||
|
|
||||||
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
|
其中有些命令選項只有在 Docker 服務啟動的時候才能設定,而且不能馬上生效。
|
||||||
* `-b BRIDGE or --bridge=BRIDGE` --指定容器挂载的网桥
|
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
|
||||||
* `--bip=CIDR` --定制 docker0 的掩码
|
* `--bip=CIDR` --定制 docker0 的掩碼
|
||||||
* `-H SOCKET... or --host=SOCKET...` --Docker 服务端接收命令的通道
|
* `-H SOCKET... or --host=SOCKET...` --Docker 服務端接收命令的通道
|
||||||
* `--icc=true|false` --是否支持容器之间进行通信
|
* `--icc=true|false` --是否支持容器之間進行通信
|
||||||
* `--ip-forward=true|false` --请看下文容器之间的通信
|
* `--ip-forward=true|false` --請看下文容器之間的通信
|
||||||
* `--iptables=true|false` --禁止 Docker 添加 iptables 规则
|
* `--iptables=true|false` --禁止 Docker 新增 iptables 規則
|
||||||
* `--mtu=BYTES` --容器网络中的 MTU
|
* `--mtu=BYTES` --容器網路中的 MTU
|
||||||
|
|
||||||
下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(`docker run`)时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值。
|
下面2個命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動(`docker run`)時候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 `docker run` 時可以覆蓋設置的默認值。
|
||||||
* `--dns=IP_ADDRESS...` --使用指定的DNS服务器
|
* `--dns=IP_ADDRESS...` --使用指定的DNS伺服器
|
||||||
* `--dns-search=DOMAIN...` --指定DNS搜索域
|
* `--dns-search=DOMAIN...` --指定DNS搜索域
|
||||||
|
|
||||||
最后这些选项只有在 `docker run` 执行时使用,因为它是针对容器的特性内容。
|
最後這些選項只有在 `docker run` 執行時使用,因為它是針對容器的特性內容。
|
||||||
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主机名
|
* `-h HOSTNAME or --hostname=HOSTNAME` --設定容器主機名
|
||||||
* `--link=CONTAINER_NAME:ALIAS` --添加到另一个容器的连接
|
* `--link=CONTAINER_NAME:ALIAS` --新增到另一個容器的連接
|
||||||
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的桥接模式
|
* `--net=bridge|none|container:NAME_or_ID|host` --設定容器的橋接模式
|
||||||
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主机
|
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主機
|
||||||
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主机
|
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主機
|
||||||
|
|||||||
@@ -1,168 +1,168 @@
|
|||||||
# Docker命令查询
|
# Docker命令查詢
|
||||||
|
|
||||||
##基本语法
|
##基本語法
|
||||||
docker [OPTIONS] COMMAND [arg...]
|
docker [OPTIONS] COMMAND [arg...]
|
||||||
一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器。可以通过 `man docker` 来查看这些命令。
|
一般來說,Docker 命令可以用來管理 daemon,或者透過 CLI 命令管理映像檔和容器。可以透過 `man docker` 來查看這些命令。
|
||||||
|
|
||||||
|
|
||||||
##选项
|
##選項
|
||||||
-D=true|false
|
-D=true|false
|
||||||
使用 debug 模式。默认为 false。
|
使用 debug 模式。預設為 false。
|
||||||
|
|
||||||
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]来绑定或者 unix://[/path/to/socket] 来使用。
|
-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 来指定。
|
在 daemon 模式下綁定的 socket,透過一個或多個 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 來指定。
|
||||||
|
|
||||||
--api-enable-cors=true|false
|
--api-enable-cors=true|false
|
||||||
在远端 API 中启用 CORS 头。缺省为 false。
|
在遠端 API 中啟用 CORS 頭。預設為 false。
|
||||||
|
|
||||||
-b=""
|
-b=""
|
||||||
将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络。
|
將容器掛載到一個已存在的網橋上。指定為 'none' 時則禁用容器的網路。
|
||||||
|
|
||||||
--bip=""
|
--bip=""
|
||||||
让动态创建的 docker0 采用给定的 CIDR 地址; 与 -b 选项互斥。
|
讓動態建立的 docker0 采用指定的 CIDR 地址; 與 -b 選項互斥。
|
||||||
|
|
||||||
-d=true|false
|
-d=true|false
|
||||||
使用 daemon 模式。缺省为 false。
|
使用 daemon 模式。預設為 false。
|
||||||
|
|
||||||
--dns=""
|
--dns=""
|
||||||
让 Docker 使用给定的 DNS 服务器。
|
讓 Docker 使用指定的 DNS 伺服器。
|
||||||
|
|
||||||
-g=""
|
-g=""
|
||||||
指定 Docker 运行时的 root 路径。缺省为 /var/lib/docker。
|
指定 Docker 執行時的 root 路徑。預設為 /var/lib/docker。
|
||||||
|
|
||||||
--icc=true|false
|
--icc=true|false
|
||||||
启用容器间通信。默认为 true。
|
啟用容器間通信。預設為 true。
|
||||||
|
|
||||||
--ip=""
|
--ip=""
|
||||||
绑定端口时候的默认 IP 地址。缺省为 0.0.0.0。
|
綁定端口時候的預設 IP 地址。預設為 0.0.0.0。
|
||||||
|
|
||||||
--iptables=true|false
|
--iptables=true|false
|
||||||
禁止 Docker 添加 iptables 规则。缺省为 true。
|
禁止 Docker 新增 iptables 規則。預設為 true。
|
||||||
|
|
||||||
--mtu=VALUE
|
--mtu=VALUE
|
||||||
指定容器网络的 mtu。缺省为 1500。
|
指定容器網路的 mtu。預設為 1500。
|
||||||
|
|
||||||
-p=""
|
-p=""
|
||||||
指定 daemon 的 PID 文件路径。缺省为 /var/run/docker.pid。
|
指定 daemon 的 PID 文件路徑。預設為 /var/run/docker.pid。
|
||||||
|
|
||||||
-s=""
|
-s=""
|
||||||
强制 Docker 运行时使用给定的存储驱动。
|
強制 Docker 執行時使用指定的存儲驅動。
|
||||||
|
|
||||||
-v=true|false
|
-v=true|false
|
||||||
输出版本信息并退出。缺省值为 false。
|
輸出版本資訊並退出。預設值為 false。
|
||||||
|
|
||||||
--selinux-enabled=true|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-attach(1)
|
||||||
依附到一个正在运行的容器中。
|
依附到一個正在執行的容器中。
|
||||||
|
|
||||||
docker-build(1)
|
docker-build(1)
|
||||||
从一个 Dockerfile 创建一个镜像
|
從一個 Dockerfile 建立一個映像檔
|
||||||
|
|
||||||
docker-commit(1)
|
docker-commit(1)
|
||||||
从一个容器的修改中创建一个新的镜像
|
從一個容器的修改中建立一個新的映像檔
|
||||||
|
|
||||||
docker-cp(1)
|
docker-cp(1)
|
||||||
从容器中复制文件到宿主系统中
|
從容器中複製文件到宿主系統中
|
||||||
|
|
||||||
docker-diff(1)
|
docker-diff(1)
|
||||||
检查一个容器文件系统的修改
|
檢查一個容器文件系統的修改
|
||||||
|
|
||||||
docker-events(1)
|
docker-events(1)
|
||||||
从服务端获取实时的事件
|
從服務端取得實時的事件
|
||||||
|
|
||||||
docker-export(1)
|
docker-export(1)
|
||||||
导出容器内容为一个 tar 包
|
匯出容器內容為一個 tar 包
|
||||||
|
|
||||||
docker-history(1)
|
docker-history(1)
|
||||||
显示一个镜像的历史
|
顯示一個映像檔的歷史
|
||||||
|
|
||||||
docker-images(1)
|
docker-images(1)
|
||||||
列出存在的镜像
|
列出存在的映像檔
|
||||||
|
|
||||||
docker-import(1)
|
docker-import(1)
|
||||||
导入一个文件(典型为 tar 包)路径或目录来创建一个镜像
|
匯入一個文件(典型為 tar 包)路徑或目錄來建立一個映像檔
|
||||||
|
|
||||||
docker-info(1)
|
docker-info(1)
|
||||||
显示一些相关的系统信息
|
顯示一些相關的系統資訊
|
||||||
|
|
||||||
docker-inspect(1)
|
docker-inspect(1)
|
||||||
显示一个容器的底层具体信息。
|
顯示一個容器的底層具體資訊。
|
||||||
|
|
||||||
docker-kill(1)
|
docker-kill(1)
|
||||||
关闭一个运行中的容器 (包括进程和所有资源)
|
關閉一個執行中的容器 (包括程式和所有資源)
|
||||||
|
|
||||||
docker-load(1)
|
docker-load(1)
|
||||||
从一个 tar 包中加载一个镜像
|
從一個 tar 包中載入一個映像檔
|
||||||
|
|
||||||
docker-login(1)
|
docker-login(1)
|
||||||
注册或登录到一个 Docker 的仓库服务器
|
註冊或登錄到一個 Docker 的倉庫伺服器
|
||||||
|
|
||||||
docker-logout(1)
|
docker-logout(1)
|
||||||
从 Docker 的仓库服务器登出
|
從 Docker 的倉庫伺服器登出
|
||||||
|
|
||||||
docker-logs(1)
|
docker-logs(1)
|
||||||
获取容器的 log 信息
|
取得容器的 log 資訊
|
||||||
|
|
||||||
docker-pause(1)
|
docker-pause(1)
|
||||||
暂停一个容器中的所有进程
|
暫停一個容器中的所有程式
|
||||||
|
|
||||||
docker-port(1)
|
docker-port(1)
|
||||||
查找一个 nat 到一个私有网口的公共口
|
查找一個 nat 到一個私有網口的公共口
|
||||||
|
|
||||||
docker-ps(1)
|
docker-ps(1)
|
||||||
列出容器
|
列出容器
|
||||||
|
|
||||||
docker-pull(1)
|
docker-pull(1)
|
||||||
从一个Docker的仓库服务器下拉一个镜像或仓库
|
從一個Docker的倉庫伺服器下拉一個映像檔或倉庫
|
||||||
|
|
||||||
docker-push(1)
|
docker-push(1)
|
||||||
将一个镜像或者仓库推送到一个 Docker 的注册服务器
|
將一個映像檔或者倉庫推送到一個 Docker 的註冊伺服器
|
||||||
|
|
||||||
docker-restart(1)
|
docker-restart(1)
|
||||||
重启一个运行中的容器
|
重新啟動一個執行中的容器
|
||||||
|
|
||||||
docker-rm(1)
|
docker-rm(1)
|
||||||
删除给定的若干个容器
|
刪除指定的數個容器
|
||||||
|
|
||||||
docker-rmi(1)
|
docker-rmi(1)
|
||||||
删除给定的若干个镜像
|
刪除指定的數個映像檔
|
||||||
|
|
||||||
docker-run(1)
|
docker-run(1)
|
||||||
创建一个新容器,并在其中运行给定命令
|
建立一個新容器,並在其中執行指定命令
|
||||||
|
|
||||||
docker-save(1)
|
docker-save(1)
|
||||||
保存一个镜像为 tar 包文件
|
保存一個映像檔為 tar 包文件
|
||||||
|
|
||||||
docker-search(1)
|
docker-search(1)
|
||||||
在 Docker index 中搜索一个镜像
|
在 Docker index 中搜索一個映像檔
|
||||||
|
|
||||||
docker-start(1)
|
docker-start(1)
|
||||||
启动一个容器
|
啟動一個容器
|
||||||
|
|
||||||
docker-stop(1)
|
docker-stop(1)
|
||||||
终止一个运行中的容器
|
終止一個執行中的容器
|
||||||
|
|
||||||
docker-tag(1)
|
docker-tag(1)
|
||||||
为一个镜像打标签
|
為一個映像檔打標簽
|
||||||
|
|
||||||
docker-top(1)
|
docker-top(1)
|
||||||
查看一个容器中的正在运行的进程信息
|
查看一個容器中的正在執行的程式資訊
|
||||||
|
|
||||||
docker-unpause(1)
|
docker-unpause(1)
|
||||||
将一个容器内所有的进程从暂停状态中恢复
|
將一個容器內所有的程式從暫停狀態中恢復
|
||||||
|
|
||||||
docker-version(1)
|
docker-version(1)
|
||||||
输出 Docker 的版本信息
|
輸出 Docker 的版本資訊
|
||||||
|
|
||||||
docker-wait(1)
|
docker-wait(1)
|
||||||
阻塞直到一个容器终止,然后输出它的退出符
|
阻塞直到一個容器終止,然後輸出它的退出符
|
||||||
|
|
||||||
##一张图总结 Docker 的命令
|
##一張圖總結 Docker 的命令
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# 常见仓库介绍
|
# 常見倉庫介紹
|
||||||
本章将介绍常见的一些仓库和镜像的功能,使用方法和生成它们的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
|
本章將介紹常見的一些倉庫和鏡像的功能,使用方法和生成它們的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
## [CentOS](https://registry.hub.docker.com/_/centos/)
|
## [CentOS](https://registry.hub.docker.com/_/centos/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 發行版,其軟件包大多跟 RedHat 系列保持一致。
|
||||||
该仓库提供了 CentOS 从 5 ~ 7 各个版本的镜像。
|
該倉庫提供了 CentOS 從 5 ~ 7 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
默认会启动一个最小化的 CentOS 环境。
|
默認會啟動一個最小化的 CentOS 環境。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-centos -i -t centos bash
|
$ sudo docker run --name some-centos -i -t centos bash
|
||||||
bash-4.2#
|
bash-4.2#
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
## [MongoDB](https://registry.hub.docker.com/_/mongo/)
|
## [MongoDB](https://registry.hub.docker.com/_/mongo/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是開源的 NoSQL 數據庫實做。
|
||||||
该仓库提供了 MongoDB 2.2 ~ 2.7 各个版本的镜像。
|
該倉庫提供了 MongoDB 2.2 ~ 2.7 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
默认会在 `27017` 端口启动数据库。
|
默認會在 `27017` 端口啟動數據庫。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-mongo -d mongo
|
$ sudo docker run --name some-mongo -d mongo
|
||||||
```
|
```
|
||||||
|
|
||||||
使用其他应用连接到容器,可以用
|
使用其他應用連接到容器,可以用
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-app --link some-mongo:mongo -d application-that-uses-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"'
|
$ 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"'
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
## [MySQL](https://registry.hub.docker.com/_/mysql/)
|
## [MySQL](https://registry.hub.docker.com/_/mysql/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是開源的關系數據庫實做。
|
||||||
该仓库提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。
|
該倉庫提供了 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-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
|
||||||
```
|
```
|
||||||
之后就可以使用其它应用来连接到该容器。
|
之後就可以使用其它應用來連接到該容器。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-app --link some-mysql:mysql -d application-that-uses-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"'
|
$ 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"'
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,34 +1,34 @@
|
|||||||
## [Nginx](https://registry.hub.docker.com/_/nginx/)
|
## [Nginx](https://registry.hub.docker.com/_/nginx/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
|
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是開源的有效率的 Web 伺服器實做,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等協議。
|
||||||
该仓库提供了 Nginx 1.0 ~ 1.7 各个版本的镜像。
|
該倉庫提供了 Nginx 1.0 ~ 1.7 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
下面的命令将作为一个静态页面服务器启动。
|
下面的命令將作為一個靜態頁面伺服器啟動。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
|
$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
|
||||||
```
|
```
|
||||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
使用者也可以不使用這種映射方式,透過利用 Dockerfile 來直接將靜態頁面內容放到鏡像中,內容為
|
||||||
```
|
```
|
||||||
FROM nginx
|
FROM nginx
|
||||||
COPY static-html-directory /usr/share/nginx/html
|
COPY static-html-directory /usr/share/nginx/html
|
||||||
```
|
```
|
||||||
之后生成新的镜像,并启动一个容器。
|
之後生成新的鏡像,並啟動一個容器。
|
||||||
```
|
```
|
||||||
$ sudo docker build -t some-content-nginx .
|
$ sudo docker build -t some-content-nginx .
|
||||||
$ sudo docker run --name some-nginx -d 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
|
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
|
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
|
||||||
```
|
```
|
||||||
使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`。
|
使用設定文件時,為了在容器中正常執行,需要保持 `daemon off;`。
|
||||||
|
|
||||||
### Dockerfile
|
### Dockerfile
|
||||||
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)
|
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
## [Node.js](https://registry.hub.docker.com/_/node/)
|
## [Node.js](https://registry.hub.docker.com/_/node/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基於 JavaScript 的可擴展服務端和網路軟件開發平臺。
|
||||||
该仓库提供了 Node.js 0.8 ~ 0.11 各个版本的镜像。
|
該倉庫提供了 Node.js 0.8 ~ 0.11 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
在项目中创建一个 Dockerfile。
|
在項目中建立一個 Dockerfile。
|
||||||
```
|
```
|
||||||
FROM node:0.10-onbuild
|
FROM node:0.10-onbuild
|
||||||
# replace this with your application's default port
|
# replace this with your application's default port
|
||||||
EXPOSE 8888
|
EXPOSE 8888
|
||||||
```
|
```
|
||||||
然后创建镜像,并启动容器
|
然後建立鏡像,並啟動容器
|
||||||
```
|
```
|
||||||
$ sudo docker build -t my-nodejs-app
|
$ 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-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
|
$ 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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
## [Redis](https://registry.hub.docker.com/_/redis/)
|
## [Redis](https://registry.hub.docker.com/_/redis/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
[Redis](https://en.wikipedia.org/wiki/Redis) 是開源的內存 Key-Value 數據庫實做。
|
||||||
该仓库提供了 Redis 2.6 ~ 2.8.9 各个版本的镜像。
|
該倉庫提供了 Redis 2.6 ~ 2.8.9 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
默认会在 `6379` 端口启动数据库。
|
默認會在 `6379` 端口啟動數據庫。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-redis -d redis
|
$ 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
|
$ 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
|
$ 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"'
|
$ 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"'
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/)
|
## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 發行版,其自帶軟件版本往往較新一些。
|
||||||
该仓库提供了 Ubuntu从12.04 ~ 14.10 各个版本的镜像。
|
該倉庫提供了 Ubuntu從12.04 ~ 14.10 各個版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
默认会启动一个最小化的 Ubuntu 环境。
|
默認會啟動一個最小化的 Ubuntu 環境。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-ubuntu -i -t ubuntu
|
$ sudo docker run --name some-ubuntu -i -t ubuntu
|
||||||
root@523c70904d54:/#
|
root@523c70904d54:/#
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
## [WordPress](https://registry.hub.docker.com/_/wordpress/)
|
## [WordPress](https://registry.hub.docker.com/_/wordpress/)
|
||||||
|
|
||||||
### 基本信息
|
### 基本訊息
|
||||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。
|
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是開源的 Blog 和內容管理系統框架,它基於 PhP 和 MySQL。
|
||||||
该仓库提供了 WordPress 4.0 版本的镜像。
|
該倉庫提供了 WordPress 4.0 版本的鏡像。
|
||||||
|
|
||||||
### 使用方法
|
### 使用方法
|
||||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
啟動容器需要 MySQL 的支持,默認端口為 `80`。
|
||||||
```
|
```
|
||||||
$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
||||||
```
|
```
|
||||||
启动 WordPress 容器时可以指定的一些环境参数包括
|
啟動 WordPress 容器時可以指定的一些環境參數包括
|
||||||
* `-e WORDPRESS_DB_USER=...` 缺省为 “root”
|
* `-e WORDPRESS_DB_USER=...` 缺省為 “root”
|
||||||
* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
|
* `-e WORDPRESS_DB_PASSWORD=...` 缺省為連接 mysql 容器的環境變量 `MYSQL_ROOT_PASSWORD` 的值
|
||||||
* `-e WORDPRESS_DB_NAME=...` 缺省为 “wordpress”
|
* `-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 串
|
* `-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
|
### Dockerfile
|
||||||
* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile)
|
* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 资源链接
|
# 資源鏈接
|
||||||
* Docker 主站点: https://www.docker.io
|
* Docker 主站點: https://www.docker.io
|
||||||
* Docker 注册中心API: http://docs.docker.com/reference/api/registry_api/
|
* Docker 註冊中心API: http://docs.docker.com/reference/api/registry_api/
|
||||||
* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
|
* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
|
||||||
* Docker 远端应用API: http://docs.docker.com/reference/api/docker_remote_api/
|
* Docker 遠端應用API: http://docs.docker.com/reference/api/docker_remote_api/
|
||||||
* Dockerfile 参考:https://docs.docker.com/reference/builder/
|
* Dockerfile 參考:https://docs.docker.com/reference/builder/
|
||||||
* Dockerfile 最佳实践:https://docs.docker.com/articles/dockerfile_best-practices/
|
* Dockerfile 最佳實踐:https://docs.docker.com/articles/dockerfile_best-practices/
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# 基本概念
|
# 基本概念
|
||||||
Docker 包括三个基本概念
|
Docker 包括三個基本概念
|
||||||
* 镜像(Image)
|
|
||||||
|
* 映像檔(Image)
|
||||||
* 容器(Container)
|
* 容器(Container)
|
||||||
* 仓库(Repository)
|
* 倉庫(Repository)
|
||||||
|
|
||||||
理解了这三个概念,就理解了 Docker 的整个生命周期。
|
理解了這三個概念,就理解了 Docker 的整個生命週期。
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## Docker 容器
|
## Docker 容器
|
||||||
Docker 利用容器来运行应用。
|
Docker 利用容器來執行應用。
|
||||||
|
|
||||||
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
|
容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。
|
||||||
|
|
||||||
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
|
可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程式。
|
||||||
|
|
||||||
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
|
*註:映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## Docker 镜像
|
## Docker 映像檔
|
||||||
Docker 镜像就是一个只读的模板。
|
Docker 映像檔就是一個唯讀的模板。
|
||||||
|
|
||||||
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
|
例如:一個映像檔可以包含一個完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它應用程式。
|
||||||
|
|
||||||
镜像可以用来创建 Docker 容器。
|
映像檔可以用來建立 Docker 容器。
|
||||||
|
|
||||||
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
|
Docker 提供了一個很簡單的機制來建立映像檔或者更新現有的映像檔,使用者甚至可以直接從其他人那裡下載一個已經做好的映像檔來直接使用。
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
## Docker 仓库
|
## Docker 倉庫
|
||||||
|
|
||||||
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
|
倉庫是集中存放映像檔文件的場所。有時候會把倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映像檔,每個鏡像有不同的標籤(tag)。
|
||||||
|
|
||||||
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
|
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
|
||||||
|
|
||||||
最大的公开仓库是 [Docker Hub](https://hub.docker.com),存放了数量庞大的镜像供用户下载。
|
最大的公開倉庫是 [Docker Hub](https://hub.docker.com),存放了數量龐大的映像檔供使用者下載。
|
||||||
国内的公开仓库包括 [Docker Pool](http://www.dockerpool.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 這樣的託管服務。
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
#实战案例
|
#實戰案例
|
||||||
介绍一些典型的应用场景和案例。
|
介紹一些典型的應用場景和案例。
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
## 多台物理主机之间的容器互联(暴露容器到真实网络中)
|
## 多臺物理主機之間的容器互聯(暴露容器到真實網路中)
|
||||||
Docker 默认的桥接网卡是 docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 veth*** 而 Docker 只是把所有这些网卡桥接在一起,如下:
|
Docker 默認的橋接網卡是 docker0。它只會在本機橋接所有的容器網卡,舉例來說容器的虛擬網卡在主機上看一般叫做 veth*** 而 Docker 只是把所有這些網卡橋接在一起,以下:
|
||||||
```
|
```
|
||||||
[root@opnvz ~]# brctl show
|
[root@opnvz ~]# brctl show
|
||||||
bridge name bridge id STP enabled interfaces
|
bridge name bridge id STP enabled interfaces
|
||||||
@@ -7,7 +7,7 @@ docker0 8000.56847afe9799 no veth0889
|
|||||||
veth3c7b
|
veth3c7b
|
||||||
veth4061
|
veth4061
|
||||||
```
|
```
|
||||||
在容器中看到的地址一般是像下面这样的地址:
|
在容器中看到的地址一般是像下面這樣的地址:
|
||||||
```
|
```
|
||||||
root@ac6474aeb31d:~# ip a
|
root@ac6474aeb31d:~# ip a
|
||||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
|
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
|
inet6 fe80::487d:68ff:feda:9cf/64 scope link
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
```
|
```
|
||||||
这样就可以把这个网络看成是一个私有的网络,通过 nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数。
|
這樣就可以把這個網路看成是一個私有的網路,透過 nat 連接外網,如果要讓外網連接到容器中,就需要做端口映射,即 -p 參數。
|
||||||
|
|
||||||
如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。
|
如果在企業內部應用,或者做多個物理主機的集群,可能需要將多個物理主機的容器組到一個物理網路中來,那麽就需要將這個網橋橋接到我們指定的網卡上。
|
||||||
|
|
||||||
### 拓扑图
|
### 拓撲圖
|
||||||
主机 A 和主机 B 的网卡一都连着物理交换机的同一个 vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。
|
主機 A 和主機 B 的網卡一都連著物理交換機的同一個 vlan 101,這樣網橋一和網橋三就相當於在同一個物理網路中了,而容器一、容器三、容器四也在同一物理網路中了,他們之間可以相互通信,而且可以跟同一 vlan 中的其他物理機器互聯。
|
||||||

|

|
||||||
|
|
||||||
### ubuntu 示例
|
### ubuntu 示例
|
||||||
下面以 ubuntu 为例创建多个主机的容器联网:
|
下面以 ubuntu 為例建立多個主機的容器聯網:
|
||||||
创建自己的网桥,编辑 /etc/network/interface 文件
|
建立自己的網橋,編輯 /etc/network/interface 文件
|
||||||
```
|
```
|
||||||
auto br0
|
auto br0
|
||||||
iface br0 inet static
|
iface br0 inet static
|
||||||
@@ -44,9 +44,9 @@ bridge_ports em1
|
|||||||
bridge_stp off
|
bridge_stp off
|
||||||
dns-nameservers 8.8.8.8 192.168.6.1
|
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
|
# Docker Upstart and SysVinit configuration file
|
||||||
@@ -64,7 +64,7 @@ ubuntu 修改 /etc/default/docker 文件,添加最后一行内容
|
|||||||
DOCKER_OPTS="-b=br0"
|
DOCKER_OPTS="-b=br0"
|
||||||
```
|
```
|
||||||
|
|
||||||
在启动 Docker 的时候 使用 -b 参数 将容器绑定到物理网络上。重启 Docker 服务后,再进入容器可以看到它已经绑定到你的物理网络上了。
|
在啟動 Docker 的時候 使用 -b 參數 將容器綁定到物理網路上。重啟 Docker 服務後,再進入容器可以看到它已經綁定到你的物理網路上了。
|
||||||
|
|
||||||
```
|
```
|
||||||
root@ubuntudocker:~# docker ps
|
root@ubuntudocker:~# docker ps
|
||||||
@@ -75,4 +75,4 @@ bridge name bridge id STP enabled interfaces
|
|||||||
br0 8000.7e6e617c8d53 no em1
|
br0 8000.7e6e617c8d53 no em1
|
||||||
vethe6e5
|
vethe6e5
|
||||||
```
|
```
|
||||||
这样就直接把容器暴露到物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。
|
這樣就直接把容器暴露到物理網路上了,多臺物理主機的容器也可以相網路了。需要註意的是,這樣就需要自己來保證容器的網路安全了。
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
## 标准化开发测试和生产环境
|
## 標準化開發測試和生產環境
|
||||||
对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点。
|
對於大部分企業來說,搭建 PaaS 既沒有那個精力,也沒那個必要,用 Docker 做個人的 sandbox 用處又小了點。
|
||||||
|
|
||||||
可以用 Docker 来标准化开发、测试、生产环境。
|
可以用 Docker 來標準化開發、測試、生產環境。
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
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 目錄啟動即可。這樣,在公司內部的開發、測試基本就統一了,不會出現開發部門提交的代碼,測試部門部署不了的問題。
|
||||||
|
|
||||||
测试部门发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中了。这种方式的部署横向性能的扩展性也极好。
|
測試部門發布測試透過的報告後,架構師再一次檢測容器環境,就可以直接交由部署工程師將代碼和容器分別部署到生產環境中了。這種方式的部署橫向效能的擴展性也極好。
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
## 使用 Supervisor 来管理进程
|
## 使用 Supervisor 來管理程式
|
||||||
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。
|
Docker 容器在啟動的時候開啟單個程式,比如,一個 ssh 或者 apache 的 daemon 服務。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裡面,啟動的時候直接啟動這個腳本,另外就是安裝程式管理工具。
|
||||||
|
|
||||||
本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用 ssh 和 apache 服务。
|
本小節將使用程式管理工具 supervisor 來管理容器中的多個程式。使用 Supervisor 可以更好的控制、管理、重啟我們希望執行的程式。在這裡我們演示一下如何同時使用 ssh 和 apache 服務。
|
||||||
|
|
||||||
### 配置
|
### 設定
|
||||||
首先创建一个 Dockerfile,内容和各部分的解释如下。
|
首先建立一個 Dockerfile,內容和各部分的解釋以下。
|
||||||
```
|
```
|
||||||
FROM ubuntu:13.04
|
FROM ubuntu:13.04
|
||||||
MAINTAINER examples@docker.com
|
MAINTAINER examples@docker.com
|
||||||
@@ -13,29 +13,28 @@ RUN apt-get update
|
|||||||
RUN apt-get upgrade -y
|
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 apt-get install -y openssh-server apache2 supervisor
|
||||||
RUN mkdir -p /var/run/sshd
|
RUN mkdir -p /var/run/sshd
|
||||||
RUN mkdir -p /var/log/supervisor
|
RUN mkdir -p /var/log/supervisor
|
||||||
```
|
```
|
||||||
|
|
||||||
这里安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运行所需要的目录。
|
這裡安裝 3 個軟件,還建立了 2 個 ssh 和 supervisor 服務正常執行所需要的目錄。
|
||||||
```
|
```
|
||||||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
```
|
```
|
||||||
添加 supervisord 的配置文件,并复制配置文件到对应目录下面。
|
新增 supervisord 的設定文件,並復制設定文件到對應目錄下面。
|
||||||
|
|
||||||
```
|
```
|
||||||
EXPOSE 22 80
|
EXPOSE 22 80
|
||||||
CMD ["/usr/bin/supervisord"]
|
CMD ["/usr/bin/supervisord"]
|
||||||
```
|
```
|
||||||
这里我们映射了 22 和 80 端口,使用 supervisord 的可执行路径启动服务。
|
這裡我們映射了 22 和 80 端口,使用 supervisord 的可執行路徑啟動服務。
|
||||||
|
|
||||||
|
|
||||||
### supervisor配置文件内容
|
### supervisor設定文件內容
|
||||||
```
|
```
|
||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
@@ -45,22 +44,22 @@ command=/usr/sbin/sshd -D
|
|||||||
[program:apache2]
|
[program:apache2]
|
||||||
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
|
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 .
|
$ 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 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,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: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,346 INFO spawned: 'sshd' with pid 6
|
||||||
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
|
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 服務的基礎鏡像,之後建立鏡像可以使用這個鏡像為基礎來建立
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
## 创建 tomcat/weblogic 集群
|
## 建立 tomcat/weblogic 集群
|
||||||
### 安装 tomcat 镜像
|
### 安裝 tomcat 鏡像
|
||||||
准备好需要的 jdk、tomcat 等软件放到 home 目录下面,启动一个容器
|
準備好需要的 jdk、tomcat 等軟件放到 home 目錄下面,啟動一個容器
|
||||||
```
|
```
|
||||||
docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash
|
docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash
|
||||||
```
|
```
|
||||||
这条命令挂载本地 home 目录到容器的 /opt/data 目录,容器内目录若不存在,则会自动创建。接下来就是 tomcat 的基本配置,jdk 环境变量设置好之后,将 tomcat 程序放到 /opt/apache-tomcat 下面
|
這條命令掛載本地 home 目錄到容器的 /opt/data 目錄,容器內目錄若不存在,則會自動建立。接下來就是 tomcat 的基本設定,jdk 環境變量設置好之後,將 tomcat 程式放到 /opt/apache-tomcat 下面
|
||||||
编辑 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat 项
|
編輯 /etc/supervisor/conf.d/supervisor.conf 文件,新增 tomcat 項
|
||||||
```
|
```
|
||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
@@ -15,25 +15,22 @@ command=/opt/apache-tomcat/bin/startup.sh
|
|||||||
|
|
||||||
[program:sshd]
|
[program:sshd]
|
||||||
command=/usr/sbin/sshd -D
|
command=/usr/sbin/sshd -D
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
docker commit ac6474aeb31d tomcat
|
docker commit ac6474aeb31d tomcat
|
||||||
```
|
```
|
||||||
|
|
||||||
新建 tomcat 文件夹,新建 Dockerfile。
|
新建 tomcat 文件夾,新建 Dockerfile。
|
||||||
```
|
```
|
||||||
FROM mk_tomcat
|
FROM mk_tomcat
|
||||||
EXPOSE 22 8080
|
EXPOSE 22 8080
|
||||||
CMD ["/usr/bin/supervisord"]
|
CMD ["/usr/bin/supervisord"]
|
||||||
```
|
```
|
||||||
根据 Dockerfile 创建镜像。
|
根據 Dockerfile 建立鏡像。
|
||||||
```
|
```
|
||||||
docker build tomcat tomcat
|
docker build tomcat tomcat
|
||||||
```
|
```
|
||||||
### 安装 weblogic 镜像
|
### 安裝 weblogic 鏡像
|
||||||
|
|
||||||
步骤和 tomcat 基本一致,这里贴一下配置文件
|
步驟和 tomcat 基本一致,這裡貼一下設定文件
|
||||||
```
|
```
|
||||||
supervisor.conf
|
supervisor.conf
|
||||||
[supervisord]
|
[supervisord]
|
||||||
@@ -51,35 +48,34 @@ EXPOSE 22 7001
|
|||||||
CMD ["/usr/bin/supervisord"]
|
CMD ["/usr/bin/supervisord"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### tomcat/weblogic 镜像的使用
|
### tomcat/weblogic 鏡像的使用
|
||||||
#### 存储的使用
|
#### 存儲的使用
|
||||||
在启动的时候,使用 `-v` 参数
|
在啟動的時候,使用 `-v` 參數
|
||||||
|
|
||||||
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
|
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
|
||||||
|
|
||||||
将本地磁盘映射到容器内部,它在主机和容器之间是实时变化的,所以我们更新程序、上传代码只需要更新物理主机的目录就可以了
|
將本地磁盤映射到容器內部,它在主機和容器之間是實時變化的,所以我們更新程式、上傳代碼只需要更新物理主機的目錄就可以了
|
||||||
|
|
||||||
#### tomcat 和 weblogic 集群的实现
|
#### tomcat 和 weblogic 集群的實做
|
||||||
tomcat 只要开启多个容器即可
|
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 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 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
|
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 的集群,同步等概念
|
* 可以使用 weblogic 的集群,同步等概念
|
||||||
* 部署一个集群应用程序,只需要安装一次应用到集群上即可
|
* 部署一個集群應用程式,只需要安裝一次應用到集群上即可
|
||||||
|
|
||||||
缺点是:
|
缺點是:
|
||||||
* Docker 配置复杂了
|
* Docker 設定復雜了
|
||||||
* 没办法自动扩展集群的计算容量,如需添加节点,需要在 administrator 上先创建节点,然后再配置新的容器 supervisor 启动脚本,然后再启动容器
|
* 沒辦法自動擴展集群的計算容量,如需新增節點,需要在 administrator 上先建立節點,然後再設定新的容器 supervisor 啟動腳本,然後再啟動容器
|
||||||
|
另外種方法是將所有的程式都安裝在 adminiserver 上面,需要擴展的時候,啟動多個節點即可,它的優點和缺點和上一種方法恰恰相反。(建議使用這種方式來部署開發和測試環境)
|
||||||
另外种方法是将所有的程序都安装在 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 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 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
|
docker run -d -v -p 206:22 -p 7003:7001 -v /home/data:/opt/data --name node3 weblogic /usr/bin/supervisord
|
||||||
```
|
```
|
||||||
|
|
||||||
这样在前端使用 nginx 来做负载均衡就可以完成配置了
|
這樣在前端使用 nginx 來做負載均衡就可以完成設定了
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
# Docker Compose 项目
|
|
||||||
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
|
|
||||||
|
|
||||||
本章将介绍 Compose 项目情况以及安装和使用。
|
|
||||||
@@ -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` 。
|
|
||||||
@@ -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
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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 服务容器再加上后端的数据库服务容器等。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现。
|
|
||||||
207
compose/usage.md
@@ -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 <<font color=\"blue\">"+guest+"</font>> to WebServer <<font color=\"blue\">"+pair[1]+"</font>></p>")
|
|
||||||
else:
|
|
||||||
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from <<font color=\"navy\">"+guest+"</font>> to WebServer <<font color=\"navy\">"+pair[1]+"</font>></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 容器了,更为灵活。
|
|
||||||
@@ -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
|
|
||||||
```
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Docker 容器
|
# Docker 容器
|
||||||
容器是 Docker 又一核心概念。
|
容器是 Docker 又一核心概念。
|
||||||
|
|
||||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
簡單的說,容器是獨立執行的一個或一組應用,以及它們的執行態環境。換句話說,虛擬機可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他系統環境)和跑在上面的應用。
|
||||||
|
|
||||||
本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。
|
本章將具體介紹如何來管理一個容器,包括建立、啟動和停止等。
|
||||||
|
|||||||
@@ -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"
|
$ 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` 参数无关。
|
容器啟動後會返回一個唯一的 id,也可以透過 `docker ps` 命令來查看容器訊息。
|
||||||
|
|
||||||
使用 `-d` 参数启动后会返回一个唯一的 id,也可以通过 `docker ps` 命令来查看容器信息。
|
|
||||||
```
|
```
|
||||||
$ sudo docker ps
|
$ sudo docker ps
|
||||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
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
|
hello world
|
||||||
hello world
|
hello world
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## 进入容器
|
## 進入容器
|
||||||
在使用 `-d` 参数时,容器启动后会进入后台。
|
在使用 `-d` 參數時,容器啟動後會進入後臺。
|
||||||
某些时候需要进入容器进行操作,有很多种方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
|
某些時候需要進入容器進行操作,有很多種方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
|
||||||
### attach 命令
|
### attach 命令
|
||||||
`docker attach` 是Docker自带的命令。下面示例如何使用该命令。
|
`docker attach` 是Docker內建的命令。下面示例如何使用該命令。
|
||||||
```
|
```
|
||||||
$ sudo docker run -idt ubuntu
|
$ sudo docker run -idt ubuntu
|
||||||
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
||||||
@@ -12,12 +12,12 @@ CONTAINER ID IMAGE COMMAND CREATED
|
|||||||
$sudo docker attach nostalgic_hypatia
|
$sudo docker attach nostalgic_hypatia
|
||||||
root@243c32535da7:/#
|
root@243c32535da7:/#
|
||||||
```
|
```
|
||||||
但是使用 `attach` 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
|
但是使用 `attach` 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。
|
||||||
|
|
||||||
### nsenter 命令
|
### nsenter 命令
|
||||||
#### 安装
|
#### 安裝
|
||||||
`nsenter` 工具在 util-linux 包2.23版本后包含。
|
`nsenter` 工具已含括在 util-linux 2.23 後的版本內。
|
||||||
如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
|
如果系統中 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;
|
$ 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
|
$ ./configure --without-ncurses
|
||||||
@@ -25,23 +25,23 @@ $ make nsenter && sudo cp nsenter /usr/local/bin
|
|||||||
```
|
```
|
||||||
|
|
||||||
#### 使用
|
#### 使用
|
||||||
`nsenter` 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。
|
`nsenter` 可以訪問另一個程式的名字空間。nsenter 要正常工作需要有 root 權限。
|
||||||
很不幸,Ubuntu 14.04 仍然使用的是 util-linux 2.20。安装最新版本的 util-linux(2.24)版,请按照以下步骤:
|
很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安裝最新版本的 util-linux(2.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
|
$ 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
|
$ cd util-linux-2.24
|
||||||
$ ./configure --without-ncurses && make nsenter
|
$ ./configure --without-ncurses && make nsenter
|
||||||
$ sudo cp nsenter /usr/local/bin
|
$ sudo cp nsenter /usr/local/bin
|
||||||
```
|
```
|
||||||
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
|
為了連接到容器,你還需要找到容器的第一個程式的 PID,可以透過下面的命令取得。
|
||||||
```
|
```
|
||||||
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
|
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
|
||||||
```
|
```
|
||||||
通过这个 PID,就可以连接到这个容器:
|
透過這個 PID,就可以連接到這個容器:
|
||||||
```
|
```
|
||||||
$ nsenter --target $PID --mount --uts --ipc --net --pid
|
$ nsenter --target $PID --mount --uts --ipc --net --pid
|
||||||
```
|
```
|
||||||
下面给出一个完整的例子。
|
下面給出一個完整的例子。
|
||||||
```
|
```
|
||||||
$ sudo docker run -idt ubuntu
|
$ sudo docker run -idt ubuntu
|
||||||
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
||||||
@@ -53,13 +53,13 @@ $ PID=$(docker-pid 243c32535da7)
|
|||||||
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
|
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
|
||||||
root@243c32535da7:/#
|
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;
|
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
|
||||||
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
|
$ 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>)
|
$ echo $(docker-pid <container>)
|
||||||
$ docker-enter <container> ls
|
$ docker-enter <container> ls
|
||||||
|
|||||||
@@ -1,28 +1,28 @@
|
|||||||
##导出和导入容器
|
##導出和導入容器
|
||||||
|
|
||||||
###导出容器
|
###導出容器
|
||||||
如果要导出本地某个容器,可以使用 `docker export` 命令。
|
如果要導出本地某個容器,可以使用 `docker export` 命令。
|
||||||
```
|
```
|
||||||
$ sudo docker ps -a
|
$ sudo docker ps -a
|
||||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
|
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
|
||||||
$ sudo docker export 7691a814370e > ubuntu.tar
|
$ 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
|
$ sudo docker images
|
||||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||||
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
|
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
|
||||||
```
|
```
|
||||||
此外,也可以通过指定 URL 或者某个目录来导入,例如
|
此外,也可以透過指定 URL 或者某個目錄來導入,例如
|
||||||
```
|
```
|
||||||
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
|
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
|
||||||
```
|
```
|
||||||
|
|
||||||
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
|
*註:使用者既可以使用 `docker load` 來導入映像檔儲存文件到本地映像檔庫,也可以使用 `docker import` 來導入一個容器快照到本地映像檔庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和原始數據訊息(即僅保存容器當時的快照狀態),而映像檔儲存文件將保存完整記錄,檔案體積也跟著變大。此外,從容器快照文件導入時可以重新指定標簽等原始數據訊息。
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
##删除容器
|
##刪除容器
|
||||||
可以使用 `docker rm` 来删除一个处于终止状态的容器。
|
可以使用 `docker rm` 來刪除一個處於終止狀態的容器。
|
||||||
例如
|
例如
|
||||||
```
|
```
|
||||||
$sudo docker rm trusting_newton
|
$sudo docker rm trusting_newton
|
||||||
trusting_newton
|
trusting_newton
|
||||||
```
|
```
|
||||||
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
|
如果要刪除一個執行中的容器,可以新增 `-f` 參數。Docker 會發送 `SIGKILL` 信號給容器。
|
||||||
|
|
||||||
|
|
||||||
##清理所有处于终止状态的容器
|
|
||||||
用 `docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。
|
|
||||||
|
|
||||||
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。
|
|
||||||
@@ -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'
|
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
|
||||||
Hello world
|
Hello world
|
||||||
```
|
```
|
||||||
这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。
|
這跟在本地直接執行 `/bin/echo 'hello world'` 相同, 幾乎感覺不出任何區別。
|
||||||
|
|
||||||
下面的命令则启动一个 bash 终端,允许用户进行交互。
|
下面的命令則啟動一個 bash 終端,允許使用者進行交互。
|
||||||
```
|
```
|
||||||
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
|
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
|
||||||
root@af8bae53bdd3:/#
|
root@af8bae53bdd3:/#
|
||||||
```
|
```
|
||||||
其中,`-t` 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, `-i` 则让容器的标准输入保持打开。
|
其中,`-t` 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, `-i` 則讓容器的標準輸入保持打開。
|
||||||
|
|
||||||
在交互模式下,用户可以通过所创建的终端来输入命令,例如
|
在交互模式下,使用者可以透過所建立的終端來輸入命令,例如
|
||||||
```
|
```
|
||||||
root@af8bae53bdd3:/# pwd
|
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
|
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
|
root@ba267838cc1b:/# ps
|
||||||
PID TTY TIME CMD
|
PID TTY TIME CMD
|
||||||
1 ? 00:00:00 bash
|
1 ? 00:00:00 bash
|
||||||
11 ? 00:00:00 ps
|
11 ? 00:00:00 ps
|
||||||
```
|
```
|
||||||
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。
|
可見,容器中僅執行了指定的 bash 應用。這種特點使得 Docker 對資源的使用率極高,是貨真價實的輕量級虛擬化。
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
##终止容器
|
##終止容器
|
||||||
可以使用 `docker stop` 来终止一个运行中的容器。
|
可以使用 `docker stop` 來終止一個執行中的容器。
|
||||||
|
|
||||||
此外,当Docker容器中指定的应用终结时,容器也自动终止。
|
此外,當Docker容器中指定的應用終結時,容器也自動終止。
|
||||||
例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。
|
例如對於上一章節中只啟動了一個終端機的容器,使用者透過 `exit` 命令或 `Ctrl+d` 來退出終端時,所建立的容器立刻終止。
|
||||||
|
|
||||||
终止状态的容器可以用 `docker ps -a` 命令看到。例如
|
終止狀態的容器可以用 `docker ps -a` 命令看到。例如
|
||||||
```
|
```
|
||||||
sudo docker ps -a
|
sudo docker ps -a
|
||||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
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
|
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` 命令會將一個執行中的容器終止,然後再重新啟動它。
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#CoreOS
|
|
||||||
|
|
||||||
CoreOS的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。
|
|
||||||
|
|
||||||
CoreOS的安装文件和运行依赖非常小,它提供了精简的Linux系统。它使用Linux容器在更高的抽象层来管理你的服务,而不是通过常规的YUM和APT来安装包。
|
|
||||||
|
|
||||||
同时,CoreOS几乎可以运行在任何平台:Vagrant, Amazon EC2, QEMU/KVM, VMware 和 OpenStack 等等,甚至你所使用的硬件环境。
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#CoreOS介绍
|
|
||||||
|
|
||||||
提起Docker,我们不得不提的就是[CoreOS](https://coreos.com/).
|
|
||||||
|
|
||||||
CoreOS对Docker甚至容器技术的发展都带来了巨大的推动作用。
|
|
||||||
|
|
||||||
CoreOS是一种支持大规模服务部署的Linux系统。
|
|
||||||
|
|
||||||
CoreOS使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
|
|
||||||
|
|
||||||
CoreOS是一个新的Linux发行版。通过重构,CoreOS提供了运行现代基础设施的特性。
|
|
||||||
|
|
||||||
CoreOS的这些策略和架构允许其它公司像Google,Facebook和Twitter那样高弹性的运行自己得服务。
|
|
||||||
|
|
||||||
CoreOS遵循Apache 2.0协议并且可以运行在现有的硬件或云提供商之上。
|
|
||||||
|
|
||||||
#CoreOS特性
|
|
||||||
|
|
||||||
##一个最小化操作系统
|
|
||||||
|
|
||||||
CoreOS被设计成一个来构建你平台的最小化的现代操作系统。
|
|
||||||
|
|
||||||
它比现有的Linux安装平均节省40%的RAM(大约114M)并允许从 PXE/iPXE 非常快速的启动。
|
|
||||||
|
|
||||||
##无痛更新
|
|
||||||
|
|
||||||
利用主动和被动双分区方案来更新OS,使用分区作为一个单元而不是一个包一个包得更新。
|
|
||||||
|
|
||||||
这使得每次更新变得快速,可靠,而且很容易回滚。
|
|
||||||
|
|
||||||
##Docker容器
|
|
||||||
|
|
||||||
应用作为Docker容器运行在CoreOS上。容器以包得形式提供最大得灵活性并且可以在几毫秒启动。
|
|
||||||
|
|
||||||
##支持集群
|
|
||||||
|
|
||||||
CoreOS可以在一个机器上很好地运行,但是它被设计用来搭建集群。
|
|
||||||
|
|
||||||
可以通过fleet很容易得使应用容器部署在多台机器上并且通过服务发现把他们连接在一起。
|
|
||||||
|
|
||||||
##分布式系统工具
|
|
||||||
|
|
||||||
内置诸如分布式锁和主选举等原生工具用来构建大规模分布式系统得构建模块。
|
|
||||||
|
|
||||||
##服务发现
|
|
||||||
|
|
||||||
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。在CoreOS中构建高可用和自动故障负载。
|
|
||||||
@@ -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提供的三大工具。
|
|
||||||
@@ -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的三大工具做任务分发,分布式存储等很多功能了。
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Docker 数据管理
|
# Docker 數據管理
|
||||||
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
|
這一章介紹如何在 Docker 內部以及容器之間管理數據,在容器中管理數據主要有兩種方式:
|
||||||
* 数据卷(Data volumes)
|
* 數據卷(Data volumes)
|
||||||
* 数据卷容器(Data volume containers)
|
* 數據卷容器(Data volume containers)
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
## 数据卷容器
|
## 數據卷容器
|
||||||
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
|
如果你有一些持續更新的數據需要在容器之間共享,最好建立數據卷容器。
|
||||||
|
|
||||||
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
|
數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
|
||||||
|
|
||||||
首先,创建一个名为 dbdata 的数据卷容器:
|
首先,建立一個命名的數據卷容器 dbdata:
|
||||||
```
|
```
|
||||||
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
|
$ 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 db1 training/postgres
|
||||||
$ sudo docker run -d --volumes-from dbdata --name db2 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
|
$ 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` 命令來指定同時刪除關聯的容器。
|
||||||
这可以让用户在容器之间升级和移动数据卷。具体的操作将在下一节中进行讲解。
|
這可以讓使用者在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。
|
||||||
|
|||||||
@@ -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
|
$ 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
|
$ 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
|
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
|
||||||
/backup/backup.tar
|
/backup/backup.tar
|
||||||
```
|
```
|
||||||
为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
|
|
||||||
```
|
|
||||||
$ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
|
|
||||||
```
|
|
||||||
@@ -1,68 +1,45 @@
|
|||||||
## 数据卷
|
## 數據卷
|
||||||
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
|
數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
|
||||||
* 数据卷可以在容器之间共享和重用
|
* 數據卷可以在容器之間共享和重用
|
||||||
* 对数据卷的修改会立马生效
|
* 對數據卷的修改會立馬生效
|
||||||
* 对数据卷的更新,不会影响镜像
|
* 對數據卷的更新,不會影響鏡像
|
||||||
* 数据卷默认会一直存在,即使容器被删除
|
* 卷會一直存在,直到沒有容器使用
|
||||||
|
|
||||||
|
*數據卷的使用,類似於 Linux 下對目錄或文件進行 mount。
|
||||||
|
|
||||||
|
|
||||||
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
|
### 建立一個數據卷
|
||||||
|
在用 `docker run` 命令的時候,使用 `-v` 標記來建立一個數據卷並掛載到容器裡。在一次 run 中多次使用可以掛載多個數據卷。
|
||||||
|
|
||||||
|
下面建立一個 web 容器,並載入一個數據卷到容器的 `/webapp` 目錄。
|
||||||
### 创建一个数据卷
|
|
||||||
在用 `docker run` 命令的时候,使用 `-v` 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
|
|
||||||
|
|
||||||
下面创建一个名为 web 的容器,并加载一个数据卷到容器的 `/webapp` 目录。
|
|
||||||
```
|
```
|
||||||
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
|
$ 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
|
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
|
||||||
```
|
```
|
||||||
上面的命令加载主机的 `/src/webapp` 目录到容器的 `/opt/webapp`
|
上面的命令載入主機的 `/src/webapp` 目錄到容器的 `/opt/webapp`
|
||||||
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
|
目錄。這個功能在進行測試的時候十分方便,比如使用者可以放置一些程式到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你建立它。
|
||||||
|
|
||||||
*注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
|
*註意:Dockerfile 中不支持這種用法,這是因為 Dockerfile 是為了移植和分享用的。然而,不同作業系統的路徑格式不一樣,所以目前還不能支持。
|
||||||
|
|
||||||
Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读。
|
Docker 掛載數據卷的默認權限是讀寫,使用者也可以透過 `:ro` 指定為唯讀。
|
||||||
```
|
```
|
||||||
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
|
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
|
||||||
training/webapp python app.py
|
training/webapp python app.py
|
||||||
```
|
```
|
||||||
加了 `:ro` 之后,就挂载为只读了。
|
加了 `:ro` 之後,就掛載為唯讀了。
|
||||||
|
|
||||||
### 查看数据卷的具体信息
|
### 掛載一個本地主機文件作為數據卷
|
||||||
|
`-v` 標記也可以從主機掛載單個文件到容器中
|
||||||
在主机里使用以下命令可以查看指定容器的信息
|
|
||||||
```
|
|
||||||
$ docker inspect web
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的`/var/lib/docker/volumes/`下面的
|
|
||||||
```
|
|
||||||
"Volumes": {
|
|
||||||
"/webapp": "/var/lib/docker/volumes/fac362...80535"
|
|
||||||
},
|
|
||||||
"VolumesRW": {
|
|
||||||
"/webapp": true
|
|
||||||
}
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
### 挂载一个本地主机文件作为数据卷
|
|
||||||
`-v` 标记也可以从主机挂载单个文件到容器中
|
|
||||||
```
|
```
|
||||||
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
|
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
|
||||||
```
|
```
|
||||||
这样就可以记录在容器输入过的命令了。
|
這樣就可以記錄在容器輸入過的命令了。
|
||||||
|
|
||||||
*注意:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能会造成文件 inode 的改变,从 Docker 1.1
|
*註意:如果直接掛載一個文件,很多文件編輯工具,包括 `vi` 或者 `sed --in-place`,可能會造成文件 inode 的改變,從 Docker 1.1
|
||||||
.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。
|
.0起,這會導致報錯誤訊息。所以最簡單的辦法就直接掛載文件的父目錄。
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 54 KiB |
@@ -1,3 +1,3 @@
|
|||||||
# Dockerfile
|
# Dockerfile
|
||||||
使用 Dockerfile 可以允许用户创建自定义的镜像。
|
使用 Dockerfile 讓使用者可以建立自定義的映像檔。
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
## 基本结构
|
## 基本結構
|
||||||
Dockerfile 由一行行命令语句组成,并且支持以 `#` 开头的注释行。
|
Dockerfile 由一行行命令語句組成,並且支援以 `#` 開頭的註解行。
|
||||||
|
|
||||||
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
|
一般而言,Dockerfile 分為四部分:基底映像檔資訊、維護者資訊、映像檔操作指令和容器啟動時執行指令。
|
||||||
|
|
||||||
例如
|
例如
|
||||||
```
|
```
|
||||||
@@ -10,28 +10,28 @@ Dockerfile 由一行行命令语句组成,并且支持以 `#` 开头的注释
|
|||||||
# Author: docker_user
|
# Author: docker_user
|
||||||
# Command format: Instruction [arguments / command] ..
|
# Command format: Instruction [arguments / command] ..
|
||||||
|
|
||||||
# Base image to use, this must be set as the first line
|
# 基本映像檔,必須是第一個指令
|
||||||
FROM ubuntu
|
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
|
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 echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
|
||||||
RUN apt-get update && apt-get install -y nginx
|
RUN apt-get update && apt-get install -y nginx
|
||||||
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
|
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
|
||||||
|
|
||||||
# Commands when creating a new container
|
# 建立新容器時要執行的指令
|
||||||
CMD /usr/sbin/nginx
|
CMD /usr/sbin/nginx
|
||||||
```
|
```
|
||||||
|
|
||||||
其中,一开始必须指明所基于的镜像名称,接下来推荐说明维护者信息。
|
其中,一開始必須指明作為基底的映像檔名稱,接下來說明維護者資訊(建議)。
|
||||||
|
|
||||||
后面则是镜像操作指令,例如 `RUN` 指令,`RUN` 指令将对镜像执行跟随的命令。每运行一条 `RUN` 指令,镜像添加新的一层,并提交。
|
接著則是映像檔操作指令,例如 `RUN` 指令,`RUN` 指令將對映像檔執行相對應的命令。每運行一條 `RUN` 指令,映像檔就會新增一層。
|
||||||
|
|
||||||
最后是 `CMD` 指令,来指定运行容器时的操作命令。
|
最後是 `CMD` 指令,指定執行容器時的操作命令。
|
||||||
|
|
||||||
下面是一个更复杂的例子
|
下面來看一個更複雜的例子
|
||||||
```
|
```
|
||||||
# Nginx
|
# Nginx
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -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/
|
$ sudo docker build -t myrepo/myapp /tmp/test1/
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
## 指令
|
## 指令
|
||||||
指令的一般格式为 `INSTRUCTION arguments`,指令包括 `FROM`、`MAINTAINER`、`RUN` 等。
|
指令的一般格式為 `INSTRUCTION arguments`,指令包括 `FROM`、`MAINTAINER`、`RUN` 等。
|
||||||
|
|
||||||
### FROM
|
### FROM
|
||||||
格式为 `FROM <image>`或`FROM <image>:<tag>`。
|
格式為 `FROM <image>`或`FROM <image>:<tag>`。
|
||||||
|
|
||||||
第一条指令必须为 `FROM` 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 `FROM` 指令(每个镜像一次)。
|
第一條指令必須為 `FROM` 指令。並且,如果在同一個Dockerfile中建立多個映像檔時,可以使用多個 `FROM` 指令(每個映像檔一次)。
|
||||||
|
|
||||||
### MAINTAINER
|
### MAINTAINER
|
||||||
格式为 `MAINTAINER <name>`,指定维护者信息。
|
格式為 `MAINTAINER <name>`,指定維護者訊息。
|
||||||
|
|
||||||
### RUN
|
### 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
|
||||||
支持三种格式
|
支持三種格式
|
||||||
* `CMD ["executable","param1","param2"]` 使用 `exec` 执行,推荐方式;
|
* `CMD ["executable","param1","param2"]` 使用 `exec` 執行,推薦使用;
|
||||||
* `CMD command param1 param2` 在 `/bin/sh` 中执行,提供给需要交互的应用;
|
* `CMD command param1 param2` 在 `/bin/sh` 中執行,使用在給需要互動的指令;
|
||||||
* `CMD ["param1","param2"]` 提供给 `ENTRYPOINT` 的默认参数;
|
* `CMD ["param1","param2"]` 提供給 `ENTRYPOINT` 的預設參數;
|
||||||
|
|
||||||
|
|
||||||
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 `CMD` 命令。如果指定了多条命令,只有最后一条会被执行。
|
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 `CMD` 命令。如果指定了多條命令,只有最後一條會被執行。
|
||||||
|
|
||||||
如果用户启动容器时候指定了运行的命令,则会覆盖掉 `CMD` 指定的命令。
|
如果使用者啟動容器時候指定了運行的命令,則會覆蓋掉 `CMD` 指定的命令。
|
||||||
|
|
||||||
### EXPOSE
|
### EXPOSE
|
||||||
格式为 `EXPOSE <port> [<port>...]`。
|
格式為 `EXPOSE <port> [<port>...]`。
|
||||||
|
|
||||||
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
|
設定 Docker 伺服器容器對外的埠號,供外界使用。在啟動容器時需要透過 -P,Docker 會自動分配一個埠號轉發到指定的埠號。
|
||||||
|
|
||||||
### ENV
|
### ENV
|
||||||
格式为 `ENV <key> <value>`。
|
格式為 `ENV <key> <value>`。
|
||||||
指定一个环境变量,会被后续 `RUN` 指令使用,并在容器运行时保持。
|
指定一個環境變數,會被後續 `RUN` 指令使用,並在容器運行時保持。
|
||||||
|
|
||||||
例如
|
例如
|
||||||
```
|
```
|
||||||
@@ -45,59 +45,59 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
|||||||
```
|
```
|
||||||
|
|
||||||
### ADD
|
### ADD
|
||||||
格式为 `ADD <src> <dest>`。
|
格式為 `ADD <src> <dest>`。
|
||||||
|
|
||||||
该命令将复制指定的 `<src>` 到容器中的 `<dest>`。
|
該命令將複製指定的 `<src>` 到容器中的 `<dest>`。
|
||||||
其中 `<src>` 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
|
其中 `<src>` 可以是 Dockerfile 所在目錄的相對路徑;也可以是一個 URL;還可以是一個 tar 文件(其複製後會自動解壓縮)。
|
||||||
|
|
||||||
### COPY
|
### COPY
|
||||||
格式为 `COPY <src> <dest>`。
|
格式為 `COPY <src> <dest>`。
|
||||||
|
|
||||||
复制本地主机的 `<src>`(为 Dockerfile 所在目录的相对路径)到容器中的 `<dest>`。
|
複製本地端的 `<src>`(為 Dockerfile 所在目錄的相對路徑)到容器中的 `<dest>`。
|
||||||
|
|
||||||
当使用本地目录为源目录时,推荐使用 `COPY`。
|
當使用本地目錄為根目錄時,推薦使用 `COPY`。
|
||||||
|
|
||||||
### ENTRYPOINT
|
### ENTRYPOINT
|
||||||
两种格式:
|
兩種格式:
|
||||||
* `ENTRYPOINT ["executable", "param1", "param2"]`
|
* `ENTRYPOINT ["executable", "param1", "param2"]`
|
||||||
* `ENTRYPOINT command param1 param2`(shell中执行)。
|
* `ENTRYPOINT command param1 param2`(shell中執行)。
|
||||||
|
|
||||||
配置容器启动后执行的命令,并且不可被 `docker run` 提供的参数覆盖。
|
指定容器啟動後執行的命令,並且不會被 `docker run` 提供的參數覆蓋。
|
||||||
|
|
||||||
每个 Dockerfile 中只能有一个 `ENTRYPOINT`,当指定多个时,只有最后一个起效。
|
每個 Dockerfile 中只能有一個 `ENTRYPOINT`,當指定多個時,只有最後一個會生效。
|
||||||
|
|
||||||
### VOLUME
|
### VOLUME
|
||||||
格式为 `VOLUME ["/data"]`。
|
格式為 `VOLUME ["/data"]`。
|
||||||
|
|
||||||
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
|
建立一個可以從本地端或其他容器掛載的掛載點,一般用來存放資料庫和需要保存的資料等。
|
||||||
|
|
||||||
### USER
|
### 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
|
||||||
格式为 `WORKDIR /path/to/workdir`。
|
格式為 `WORKDIR /path/to/workdir`。
|
||||||
|
|
||||||
为后续的 `RUN`、`CMD`、`ENTRYPOINT` 指令配置工作目录。
|
為後續的 `RUN`、`CMD`、`ENTRYPOINT` 指令指定工作目錄。
|
||||||
|
|
||||||
可以使用多个 `WORKDIR` 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
|
可以使用多個 `WORKDIR` 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如
|
||||||
```
|
```
|
||||||
WORKDIR /a
|
WORKDIR /a
|
||||||
WORKDIR b
|
WORKDIR b
|
||||||
WORKDIR c
|
WORKDIR c
|
||||||
RUN pwd
|
RUN pwd
|
||||||
```
|
```
|
||||||
则最终路径为 `/a/b/c`。
|
則最終路徑為 `/a/b/c`。
|
||||||
|
|
||||||
### ONBUILD
|
### ONBUILD
|
||||||
格式为 `ONBUILD [INSTRUCTION]`。
|
格式為 `ONBUILD [INSTRUCTION]`。
|
||||||
|
|
||||||
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
|
指定當建立的映像檔作為其它新建立映像檔的基底映像檔時,所執行的操作指令。
|
||||||
|
|
||||||
例如,Dockerfile 使用如下的内容创建了镜像 `image-A`。
|
例如,Dockerfile 使用以下的內容建立了映像檔 `image-A`。
|
||||||
```
|
```
|
||||||
[...]
|
[...]
|
||||||
ONBUILD ADD . /app/src
|
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
|
FROM image-A
|
||||||
|
|
||||||
@@ -114,5 +114,4 @@ ADD . /app/src
|
|||||||
RUN /usr/local/bin/python-build --dir /app/src
|
RUN /usr/local/bin/python-build --dir /app/src
|
||||||
```
|
```
|
||||||
|
|
||||||
使用 `ONBUILD` 指令的镜像,推荐在标签中注明,例如 `ruby:1.9-onbuild`。
|
使用 `ONBUILD` 指令的映像檔,推薦在標簽中註明,例如 `ruby:1.9-onbuild`。
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
# etcd
|
|
||||||
|
|
||||||
etcd 是 CoreOS 团队发起的一个管理配置信息和服务发现(service discovery)的项目,在这一章里面,我们将介绍该项目的目标,安装和使用,以及实现的技术。
|
|
||||||
282
etcd/etcdctl.md
@@ -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` 打印版本信息
|
|
||||||
@@ -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
|
|
||||||
```
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
## 什么是 etcd
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
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 实例将会保持彼此信息的一致性。
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#Fig
|
|
||||||
在你的应用里面添加一个 `fig.yml` 文件,并指定一些简单的内容,执行 `fig up` 它就能帮你快速建立起一个容器。目前已经正式更名为 [Compose](../compose/README.md)。
|
|
||||||
141
fig/cli_ref.md
@@ -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` 。
|
|
||||||
@@ -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
|
|
||||||
```
|
|
||||||
@@ -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`
|
|
||||||
@@ -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` ,确认能够正常运行。
|
|
||||||
|
|
||||||
141
fig/intro.md
@@ -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 就会启动并运行你的应用了。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
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)。
|
|
||||||
|
|
||||||
103
fig/rails.md
@@ -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` ,就会看到它的地址)。
|
|
||||||
|
|
||||||

|
|
||||||
@@ -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` ,就会看到它的地址)。
|
|
||||||
|
|
||||||
151
fig/yml_ref.md
@@ -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
|
|
||||||
```
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
# Docker 镜像
|
# Docker 鏡像
|
||||||
|
|
||||||
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。
|
在之前的介紹中,我們知道鏡像是 Docker 的三大組件之一。
|
||||||
|
|
||||||
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
|
Docker 在執行容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載(預設是 Docker Hub 公共註冊伺服器中的倉庫)。
|
||||||
|
|
||||||
本章将介绍更多关于镜像的内容,包括:
|
本章將介紹更多關於鏡像的內容,包括:
|
||||||
* 从仓库获取镜像;
|
* 從倉庫取得鏡像;
|
||||||
* 管理本地主机上的镜像;
|
* 管理本地主機上的鏡像;
|
||||||
* 介绍镜像实现的基本原理。
|
* 介紹鏡像實做的基本原理。
|
||||||
|
|||||||
@@ -1,28 +1,28 @@
|
|||||||
##创建镜像
|
##建立鏡像
|
||||||
|
|
||||||
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
|
建立鏡像有很多方法,使用者可以從 Docker Hub 取得已有鏡像並更新,也可以利用本地文件系統建立一個。
|
||||||
|
|
||||||
### 修改已有镜像
|
### 修改已有鏡像
|
||||||
先使用下载的镜像启动容器。
|
先使用下載的鏡像啟動容器。
|
||||||
```
|
```
|
||||||
$ sudo docker run -t -i training/sinatra /bin/bash
|
$ sudo docker run -t -i training/sinatra /bin/bash
|
||||||
root@0b2616b0e5a8:/#
|
root@0b2616b0e5a8:/#
|
||||||
```
|
```
|
||||||
注意:记住容器的 ID,稍后还会用到。
|
註意:記住容器的 ID,稍後還會用到。
|
||||||
|
|
||||||
在容器中添加 json package(一个 ruby gem)。
|
在容器中新增 json 和 gem 兩個應用。
|
||||||
```
|
```
|
||||||
root@0b2616b0e5a8:/# gem install json
|
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
|
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
|
||||||
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
|
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
|
||||||
```
|
```
|
||||||
其中,`-m` 来指定提交的说明信息,跟我们使用的版本控制工具一样;`-a` 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。
|
其中,`-m` 來指定提交的說明訊息,跟我們使用的版本控制工具一樣;`-a` 可以指定更新的使用者訊息;之後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 訊息。建立成功後會返回這個鏡像的 ID 訊息。
|
||||||
|
|
||||||
|
|
||||||
使用 `docker images` 来查看新创建的镜像。
|
使用 `docker images` 來查看新建立的鏡像。
|
||||||
```
|
```
|
||||||
$ sudo docker images
|
$ sudo docker images
|
||||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
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 v2 3c59e02ddd1a 10 hours ago 446.7 MB
|
||||||
ouruser/sinatra latest 5db5f8471261 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
|
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
|
||||||
root@78e82f680994:/#
|
root@78e82f680994:/#
|
||||||
```
|
```
|
||||||
|
|
||||||
###利用 Dockerfile 来创建镜像
|
###利用 Dockerfile 來建立鏡像
|
||||||
使用 `docker commit` 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 `docker build` 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
|
使用 `docker commit` 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我們可以使用 `docker build` 來建立一個新的鏡像。為此,首先需要建立一個 Dockerfile,包含一些如何建立鏡像的指令。
|
||||||
|
|
||||||
新建一个目录和一个 Dockerfile
|
新建一個目錄和一個 Dockerfile
|
||||||
```
|
```
|
||||||
$ mkdir sinatra
|
$ mkdir sinatra
|
||||||
$ cd sinatra
|
$ cd sinatra
|
||||||
$ touch Dockerfile
|
$ touch Dockerfile
|
||||||
```
|
```
|
||||||
Dockerfile 中每一条指令都创建镜像的一层,例如:
|
Dockerfile 中每一條指令都建立鏡像的一層,例如:
|
||||||
```
|
```
|
||||||
# This is a comment
|
# This is a comment
|
||||||
FROM ubuntu:14.04
|
FROM ubuntu:14.04
|
||||||
@@ -54,13 +54,13 @@ RUN apt-get -qq update
|
|||||||
RUN apt-get -qqy install ruby ruby-dev
|
RUN apt-get -qqy install ruby ruby-dev
|
||||||
RUN gem install sinatra
|
RUN gem install sinatra
|
||||||
```
|
```
|
||||||
Dockerfile 基本的语法是
|
Dockerfile 基本的語法是
|
||||||
* 使用`#`来注释
|
* 使用`#`來註解
|
||||||
* `FROM` 指令告诉 Docker 使用哪个镜像作为基础
|
* `FROM` 指令告訴 Docker 使用哪個鏡像作為基礎
|
||||||
* 接着是维护者的信息
|
* 接著是維護者的訊息
|
||||||
* `RUN`开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件
|
* `RUN`開頭的指令會在建立中執行,比如安裝一個軟件包,在這裡使用 apt-get 來安裝了一些軟件
|
||||||
|
|
||||||
编写完成 Dockerfile 后可以使用 `docker build` 来生成镜像。
|
編寫完成 Dockerfile 後可以使用 `docker build` 來生成鏡像。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo docker build -t="ouruser/sinatra:v2" .
|
$ sudo docker build -t="ouruser/sinatra:v2" .
|
||||||
@@ -68,7 +68,7 @@ Uploading context 2.56 kB
|
|||||||
Uploading context
|
Uploading context
|
||||||
Step 0 : FROM ubuntu:14.04
|
Step 0 : FROM ubuntu:14.04
|
||||||
---> 99ec81b80c55
|
---> 99ec81b80c55
|
||||||
Step 1 : MAINTAINER Newbee <newbee@docker.com>
|
Step 1 : MAINTAINER Kate Smith <ksmith@example.com>
|
||||||
---> Running in 7c5664a8a0c1
|
---> Running in 7c5664a8a0c1
|
||||||
---> 2fa8ca4e2a13
|
---> 2fa8ca4e2a13
|
||||||
Removing intermediate container 7c5664a8a0c1
|
Removing intermediate container 7c5664a8a0c1
|
||||||
@@ -96,15 +96,15 @@ Successfully installed sinatra-1.4.5
|
|||||||
Removing intermediate container 5e9d0065c1f7
|
Removing intermediate container 5e9d0065c1f7
|
||||||
Successfully built 324104cde6ad
|
Successfully built 324104cde6ad
|
||||||
```
|
```
|
||||||
其中 `-t` 标记来添加 tag,指定新的镜像的用户信息。
|
其中 `-t` 標記來新增 tag,指定新的鏡像的使用者訊息。
|
||||||
“.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
|
“.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。
|
||||||
|
|
||||||
可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。
|
可以看到 build 程式在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據 Dockerfile 來進行。
|
||||||
然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 `docker commit` 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
|
然後,Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟之前介紹過的 `docker commit` 一樣)。當所有的指令都執行完畢之後,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被刪除和清理了。
|
||||||
|
|
||||||
*注意一个镜像不能超过 127 层
|
*註意一個鏡像不能超過 127 層
|
||||||
|
|
||||||
此外,还可以利用 `ADD` 命令复制本地文件到镜像;用 `EXPOSE` 命令来向外部开放端口;用 `CMD` 命令来描述容器启动后运行的程序等。例如
|
此外,還可以利用 `ADD` 命令復制本地文件到鏡像;用 `EXPOSE` 命令來向外部開放端口;用 `CMD` 命令來描述容器啟動後執行的程式等。例如
|
||||||
```
|
```
|
||||||
# put my local web site in myApp folder to /var/www
|
# put my local web site in myApp folder to /var/www
|
||||||
ADD myApp /var/www
|
ADD myApp /var/www
|
||||||
@@ -114,12 +114,12 @@ EXPOSE 80
|
|||||||
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
|
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
|
||||||
```
|
```
|
||||||
|
|
||||||
现在可以利用新创建的镜像来启动一个容器。
|
現在可以利用新建立的鏡像來啟動一個容器。
|
||||||
```
|
```
|
||||||
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
|
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
|
||||||
root@8196968dac35:/#
|
root@8196968dac35:/#
|
||||||
```
|
```
|
||||||
还可以用 `docker tag` 命令来修改镜像的标签。
|
還可以用 `docker tag` 命令來修改鏡像的標簽。
|
||||||
```
|
```
|
||||||
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
|
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
|
||||||
$ sudo docker images ouruser/sinatra
|
$ 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
|
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
|
||||||
```
|
```
|
||||||
|
|
||||||
*注:更多用法,请参考 [Dockerfile](../dockerfile/README.md) 章节。
|
*註:更多用法,請參考 [Dockerfile](../dockerfile/README.md) 章節。
|
||||||
|
|
||||||
### 从本地文件系统导入
|
### 從本地文件系統導入
|
||||||
要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建:
|
要從本地文件系統導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術)的模板來建立:
|
||||||
openvz 的模板下载地址为 [templates](http://openvz.org/Download/templates/precreated) 。
|
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
|
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
|
||||||
```
|
```
|
||||||
然后查看新导入的镜像。
|
然後查看新導入的鏡像。
|
||||||
```
|
```
|
||||||
docker images
|
docker images
|
||||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||||
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
|
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
|
||||||
```
|
```
|
||||||
|
|
||||||
###上传镜像
|
###上傳鏡像
|
||||||
用户可以通过 `docker push` 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。
|
使用者可以透過 `docker push` 命令,把自己建立的鏡像上傳到倉庫中來共享。例如,使用者在 Docker Hub 上完成註冊後,可以推送自己的鏡像到倉庫中。
|
||||||
```
|
```
|
||||||
$ sudo docker push ouruser/sinatra
|
$ sudo docker push ouruser/sinatra
|
||||||
The push refers to a repository [ouruser/sinatra] (len: 1)
|
The push refers to a repository [ouruser/sinatra] (len: 1)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
## 镜像的实现原理
|
## 鏡像的實做原理
|
||||||
|
|
||||||
Docker 镜像是怎么实现增量的修改和维护的?
|
Docker 鏡像是怎麽實做增量的修改和維護的?
|
||||||
每个镜像都由很多层次构成,Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 将这些不同的层结合到一个镜像中去。
|
每個鏡像都由很多層次構成,Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 將這些不同的層結合到一個鏡像中去。
|
||||||
|
|
||||||
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。
|
通常 Union FS 有兩個用途, 一方面可以實做不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個唯讀的分支和一個可寫的分支聯合在一起,Live CD 正是基於此方法可以允許在鏡像不變的基礎上允許使用者在其上進行一些寫操作。
|
||||||
Docker 在 AUFS 上构建的容器也是利用了类似的原理。
|
Docker 在 AUFS 上建立的容器也是利用了類似的原理。
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
## 列出本地镜像
|
## 列出本地鏡像
|
||||||
使用 `docker images` 显示本地已有的镜像。
|
使用 `docker images` 顯示本地已有的鏡像。
|
||||||
```
|
```
|
||||||
$ sudo docker images
|
$ sudo docker images
|
||||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||||
@@ -11,19 +11,19 @@ ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
在列出信息中,可以看到几个字段信息
|
在列出訊息中,可以看到幾段文字訊息
|
||||||
|
|
||||||
* 来自于哪个仓库,比如 ubuntu
|
* 來自於哪個倉庫,比如 ubuntu
|
||||||
* 镜像的标记,比如 14.04
|
* 鏡像的標記,比如 14.04
|
||||||
* 它的 `ID` 号(唯一)
|
* 它的 `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
|
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
|
||||||
```
|
```
|
||||||
|
|
||||||
如果不指定具体的标记,则默认使用 `latest` 标记信息。
|
如果不指定具體的標記,則預設使用 `latest`
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## 获取镜像
|
## 取得映像檔
|
||||||
|
|
||||||
可以使用 `docker pull` 命令来从仓库获取所需要的镜像。
|
可以使用 `docker pull` 命令來從倉庫取得所需要的映像檔。
|
||||||
|
|
||||||
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。
|
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 作業系統的映像檔。
|
||||||
```
|
```
|
||||||
$ sudo docker pull ubuntu:12.04
|
$ sudo docker pull ubuntu:12.04
|
||||||
Pulling repository ubuntu
|
Pulling repository ubuntu
|
||||||
@@ -14,12 +14,12 @@ a300658979be: Download complete
|
|||||||
ffdaafd1ca50: Download complete
|
ffdaafd1ca50: Download complete
|
||||||
d047ae21eeaf: 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
|
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
|
||||||
Pulling dl.dockerpool.com:5000/ubuntu
|
Pulling dl.dockerpool.com:5000/ubuntu
|
||||||
@@ -32,7 +32,7 @@ ffdaafd1ca50: Download complete
|
|||||||
d047ae21eeaf: Download complete
|
d047ae21eeaf: Download complete
|
||||||
```
|
```
|
||||||
|
|
||||||
完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。
|
完成後,即可隨時使用該映像檔了,例如建立一個容器,讓其中執行 bash 應用。
|
||||||
```
|
```
|
||||||
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
|
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
|
||||||
root@fe7fc4bd8fc9:/#
|
root@fe7fc4bd8fc9:/#
|
||||||
|
|||||||
22
image/rmi.md
@@ -1,5 +1,5 @@
|
|||||||
## 移除本地镜像
|
## 移除本地鏡像
|
||||||
如果要移除本地的镜像,可以使用 `docker rmi` 命令。注意 `docker rm` 命令是移除容器。
|
如果要移除本地的鏡像,可以使用 `docker rmi` 命令。註意 `docker rm` 命令是移除容器。
|
||||||
```
|
```
|
||||||
$ sudo docker rmi training/sinatra
|
$ sudo docker rmi training/sinatra
|
||||||
Untagged: training/sinatra:latest
|
Untagged: training/sinatra:latest
|
||||||
@@ -8,20 +8,4 @@ Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
|
|||||||
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
|
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
|
||||||
```
|
```
|
||||||
|
|
||||||
*注意:在删除镜像之前要先用 `docker rm` 删掉依赖于这个镜像的所有容器。
|
*註意:在刪除鏡像之前要先用 `docker rm` 刪掉依賴於這個鏡像的所有容器。
|
||||||
|
|
||||||
##清理所有未打过标签的本地镜像
|
|
||||||
|
|
||||||
`docker images` 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。
|
|
||||||
|
|
||||||
使用下面的命令可以清理所有未打过标签的本地镜像
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo docker rmi $(docker images -q -f "dangling=true")
|
|
||||||
```
|
|
||||||
|
|
||||||
其中 `-q` 和 `-f` 是缩写, 完整的命令其实可以写着下面这样,是不是更容易理解一点?
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo docker rmi $(docker images --quiet --filter "dangling=true")
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
## 存出和载入镜像
|
## 存出和載入鏡像
|
||||||
|
|
||||||
### 存出镜像
|
### 存出鏡像
|
||||||
如果要导出镜像到本地文件,可以使用 `docker save` 命令。
|
如果要導出鏡像到本地文件,可以使用 `docker save` 命令。
|
||||||
```
|
```
|
||||||
$ sudo docker images
|
$ sudo docker images
|
||||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
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
|
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
|
||||||
```
|
```
|
||||||
|
|
||||||
### 载入镜像
|
### 載入鏡像
|
||||||
可以使用 `docker load` 从导出的本地文件中再导入到本地镜像库,例如
|
可以使用 `docker load` 從導出的本地文件中再導入到本地鏡像庫,例如
|
||||||
```
|
```
|
||||||
$ sudo docker load --input ubuntu_14.04.tar
|
$ 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
|
$ sudo docker load < ubuntu_14.04.tar
|
||||||
```
|
```
|
||||||
这将导入镜像以及其相关的元数据信息(包括标签等)。
|
這將導入鏡像以及其相關的元數據訊息(包括標簽等)。
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# 安装
|
# 安裝
|
||||||
官方网站上有各种环境下的 [安装指南](https://docs.docker.com/installation/#installation),这里主要介绍下Ubuntu和CentOS系列的安装。
|
官方網站上有各種環境下的 [安裝指南](https://docs.docker.com/installation/#installation),這裡主要介紹下Ubuntu和CentOS系列的安裝。
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
## CentOS 系列安装 Docker
|
## CentOS 系列安裝 Docker
|
||||||
|
|
||||||
Docker 支持 CentOS6 及以后的版本。
|
Docker 支持 CentOS6 及以後的版本。
|
||||||
|
|
||||||
### 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 http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
|
||||||
$ sudo yum install docker-io
|
$ sudo yum install docker-io
|
||||||
```
|
```
|
||||||
|
|
||||||
### CentOS7
|
### CentOS7
|
||||||
CentOS7 系统 `CentOS-Extras` 库中已带 Docker,可以直接安装:
|
CentOS7 系統 `CentOS-Extras` 庫中已內建 Docker,可以直接安裝:
|
||||||
```
|
```
|
||||||
$ sudo yum install docker
|
$ sudo yum install docker
|
||||||
```
|
```
|
||||||
|
|
||||||
安装之后启动 Docker 服务,并让它随系统启动自动加载。
|
安裝之後啟動 Docker 服務,並讓它隨系統啟動自動載入。
|
||||||
```
|
```
|
||||||
$ sudo service docker start
|
$ sudo service docker start
|
||||||
$ sudo chkconfig docker on
|
$ sudo chkconfig docker on
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
## Ubuntu 系列安装 Docker
|
## Ubuntu 系列安裝 Docker
|
||||||
|
|
||||||
### 通过系统自带包安装
|
### 透過系統內建套件安裝
|
||||||
Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。
|
Ubuntu 14.04 版本套件庫中已經內建了 Docker 套件,可以直接安裝。
|
||||||
```
|
```
|
||||||
$ sudo apt-get update
|
$ sudo apt-get update
|
||||||
$ sudo apt-get install -y docker.io
|
$ 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
|
$ 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 套件庫安裝最新版本
|
||||||
要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。
|
要安裝最新的 Docker 版本,首先需要安裝 apt-transport-https 支持,之後透過新增套件庫來安裝。
|
||||||
```
|
```
|
||||||
$ sudo apt-get install apt-transport-https
|
$ sudo apt-get install apt-transport-https
|
||||||
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
|
$ 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 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 update
|
||||||
$ sudo apt-get install lxc-docker
|
$ sudo apt-get install -y lxc-docker
|
||||||
```
|
```
|
||||||
|
|
||||||
### 14.04 之前版本
|
### 14.04 之前版本
|
||||||
如果是较低版本的 Ubuntu 系统,需要先更新内核。
|
如果是較舊版本的 Ubuntu 系統,需要先更新核心。
|
||||||
```
|
```
|
||||||
$ sudo apt-get update
|
$ sudo apt-get update
|
||||||
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
|
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
|
||||||
$ sudo reboot
|
$ sudo reboot
|
||||||
```
|
```
|
||||||
然后重复上面的步骤即可。
|
然後重複上面的步驟即可。
|
||||||
|
|
||||||
安装之后启动 Docker 服务。
|
安裝之後啟動 Docker 服務。
|
||||||
```
|
```
|
||||||
$ sudo service docker start
|
$ sudo service docker start
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# 简介
|
# 簡介
|
||||||
本章将带领你进入 Docker 的世界。
|
本章將帶領你進入 Docker 的世界。
|
||||||
|
|
||||||
什么是 Docker?
|
什麼是 Docker?
|
||||||
|
|
||||||
用它会带来什么样的好处?
|
用它會帶來什麼樣的好處?
|
||||||
|
|
||||||
好吧,让我们带着问题开始这神奇之旅。
|
好吧,讓我們帶著問題開始這神奇之旅。
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
## 什么是 Docker
|
## 什麼是 Docker
|
||||||
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。
|
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實做。
|
||||||
项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护。
|
項目後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,原始碼在 [GitHub](https://github.com/docker/docker) 上進行維護。
|
||||||
|
|
||||||
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
|
Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用。
|
||||||
|
|
||||||
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。
|
Docker 項目的目標是實做輕量級的作業系統虛擬化解決方案。
|
||||||
Docker 的基础是 Linux 容器(LXC)等技术。
|
Docker 的基礎是 Linux 容器(LXC)等技術。
|
||||||
|
|
||||||
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
|
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
|
||||||
|
|
||||||
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
|
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實做虛擬化,直接使用本地主機的作業系統,而傳統方式則是在硬體層面實做。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|||||||