88 Commits

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

119
README.md
View File

@@ -1,66 +1,95 @@
Docker —— 从入门到实践
Docker —— 從入門到實踐
===============
v0.2.9
[Docker](docker.com) 是个伟大的目,它彻底释放了虚拟化的威力,让应用的分、部署和管理都得前所未有的高效和轻松
[Docker](docker.com) 是個偉大的目,它徹底釋放了虛擬化的,讓應用程式的分、部署和管理都得前所未有的有效率和輕鬆
书既适用于具备基础 Linux 知的 Docker 初者,也可供希望理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴
書既適用於具備基礎 Linux 知的 Docker 初者,也可供希望理解原理和實做的進階使用者參考。同時,書中給出的實踐案例,可供在進行實際部署時借鑒
书源于 [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 版本对内容进行了修和重写,并增加容;经协商将所有内容开源,采用互联网合作的方式进行维护
書源於 [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 版本對內容進行了修和重寫,並增加容;經協商將所有內容開源,採用網路合作的方式進行維護
前六章为基础内容,供用户理解 Docker 的基本概念和操作7 ~ 9 章介一些高级操作;第 10 章出典型的应用场景和实践案例11 ~ 13 章介绍关于 Docker 实现的相关技术
前六章為基礎內容,供使用者理解 Docker 的基本概念和操作7 ~ 9 章介一些進階操作;第 10 章出典型的應用場景和實踐案例11 ~ 13 章介紹關於 Docker 實做的相關技術
最新版本在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [DockerPool](http://dockerpool.com/static/books/docker_practice/index.html)。
最新版本線上閱讀:[正體版](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)。
另外,迎加入 DockerPool QQ 群341410255,分享 Docker 源,交流 Docker 技
另外,迎加入 [Docker.Taipei](https://www.facebook.com/groups/docker.taipei/) 和 [Meetup](http://www.meetup.com/Docker-Taipei/) ,分享 Docker 源,交流 Docker 技
书源码在 Github 上维护,欢迎参与 [https://github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice)。
書原始碼在 Github 上維護,歡迎參與 [https://github.com/philipz/docker_practice](https://github.com/philipz/docker_practice)。
所有的 [贡献](https://github.com/yeasy/docker_practice/graphs/contributors)。
所有的 [貢獻](https://github.com/philipz/docker_practice/graphs/contributors)。
## 主要版本
## 主要版本
* 0.3: 2014-10-TODO
* 完成仓库章节
*安全章
* 修正底层实现章节的架、名字空、控制组、文件系统、容器格式等容;
* 添加对常见仓库和镜像的介
* 添加 Dockerfile 的介
* 重新校中英文混排格式。
* 完成倉庫章節
*安全章
* 修正底層實做章節的架、名字空、控制組、檔案系統、容器格式等容;
* 新增對常見倉庫和鏡像的介
* 新增 Dockerfile 的介
* 重新校中英文混排格式。
* 0.2: 2014-09-18
* 照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章
* 添加底层实现章节
* 添加命令查询和资源链接章节
* 照官方文檔重寫介紹、基本概念、安裝、鏡像、容器、倉庫、資料管理、網路等章
* 新增底層實做章節
* 新增命令查詢和資源連結章節
* 其它修正。
* 0.1: 2014-09-05
* 添加基本容;
* 修正错别字和表不通的地方。
* 新增基本容;
* 修正錯別字和表不通的地方。
## 貢獻力量
## 参加步骤
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```
$ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice
$ git config user.name "Docker User"
$ git config user.email docker_user@dockcer.com
```
* 修改代码后提交,并推送到自己的仓库。
```
$ #do some change on the content
$ git commit -am "Fix issue #1: change helo to hello"
$ git push
```
* 在 GitHub 网站上提交 pull request。
* 定期使用项目仓库内容更新自己仓库内容。
```
$ git remote add upstream https://github.com/yeasy/docker_practice
$ git fetch upstream
$ git checkout master
$ git rebase upstream/master
$ git push -f origin master
```
如果想做出貢獻的話,你可以:
- 幫忙校對,挑錯別字、語病等等
- 提出修改建議
- 提出術語翻譯建議
## 翻譯建議
如果你願意一起校對的話,請仔細閱讀:
- 使用 markdown 進行翻譯,文件名必須使用英文,因為中文的話 gitbook 編譯的時候會出問題
- 引號請使用「」和『』
- fork 過去之後新建一個分支進行翻譯,完成後 pull request 這個分支,沒問題的話我會合併到 master 分支中
- 有其他任何問題都歡迎發 issue我看到了會盡快回覆
謝謝!
## 關於術語
翻譯術語的時候請參考這個流程:
- 盡量保證與台灣習慣術語和已翻譯的內容一致
- 盡量先搜尋,一般來說程式語言的大部分術語是一樣的,可以參考[這個網站](http://jjhou.boolan.com/terms.htm)
- 如果以上兩條都沒有找到合適的結果,請自己決定一個合適的翻譯或者直接使用英文原文,後期校對的時候會進行統一
- 校稿時,若有發現沒有被翻譯成台灣術語的大陸術語,可以將它新增到 translation.json 中
- 可以主動提交替換過的文本給我,或是僅提交新增過的 translation.json 也可,我會再進行文本的替換
- 請務必確定提交的翻譯對照組不會造成字串循環替代ex: 因為「類」->「類別」,造成下次再執行自動翻譯時「類別」又變成「類別別」)
對翻譯有任何意見都歡迎發 issue我看到了會盡快回覆
## 參加步驟
參考 [Swift 說明](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/),欲翻譯章節就直接在 github 上發 Issue 中註明或直接發Pull Request 修改。m(_ _)m
有些朋友可能不太清楚如何幫忙翻譯,我這裡寫一個簡單的流程,大家可以參考一下:
1. 首先 fork 我的項目
2. 把 fork 過去的項目也就是你的項目 clone 到你的本地
3. 在命令行執行 `git branch develop` 來建立一個新分支
4. 執行 `git checkout develop` 來切換到新分支
5. 執行 `git remote add upstream https://github.com/philipz/docker_practice` 把我的庫新增為遠端庫
6. 執行 `git remote update`更新
7. 執行 `git fetch upstream master` 拉取我的庫的更新到本地
8. 執行 `git rebase upstream/master` 將我的更新合並到你的分支
這是一個初始化流程,只需要做一遍就行,之後請一直在 develop 分支進行修改。
如果修改過程中我的庫有了更新,請重復 6、7、8 步。
修改之後,首先 push 到你的庫,然後登錄 GitHub在你的 repo 的首頁可以看到一個 `pull request` 按鈕,點擊它,填寫一些說明資訊,然後提交即可。
## 原出處及參考資料
1. [Docker —— 从入门到实践](https://github.com/yeasy/docker_practice/)
2. [《The Swift Programming Language­》正體中文版](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/)

View File

@@ -1,76 +1,76 @@
# Summary
* [前言](README.md)
* [Docker ](introduction/README.md)
* [是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md)
* [Docker ](introduction/README.md)
* [是 Docker](introduction/what.md)
* [為什麼要用 Docker](introduction/why.md)
* [基本概念](basic_concept/README.md)
* [镜像](basic_concept/image.md)
* [映像檔](basic_concept/image.md)
* [容器](basic_concept/container.md)
* [仓库](basic_concept/repository.md)
* [](install/README.md)
* [倉庫](basic_concept/repository.md)
* [](install/README.md)
* [Ubuntu](install/ubuntu.md)
* [CentOS](install/centos.md)
* [镜像](image/README.md)
* [获取镜像](image/pull.md)
* [映像檔](image/README.md)
* [取得映像檔](image/pull.md)
* [列出](image/list.md)
* [](image/create.md)
* [存出和](image/save_load.md)
* [](image/create.md)
* [存出和](image/save_load.md)
* [移除](image/rmi.md)
* [实现原理](image/internal.md)
* [實做原理](image/internal.md)
* [容器](container/README.md)
* [启动](container/run.md)
* [护态运](container/daemon.md)
* [](container/stop.md)
* [入容器](container/enter.md)
* [导出和导](container/import_export.md)
* [](container/rm.md)
* [仓库](repository/README.md)
* [啟動](container/run.md)
* [護態執](container/daemon.md)
* [](container/stop.md)
* [入容器](container/enter.md)
* [導出與導](container/import_export.md)
* [](container/rm.md)
* [倉庫](repository/README.md)
* [Docker Hub](repository/dockerhub.md)
* [私有仓库](repository/local_repo.md)
* [配置文件](repository/config.md)
* [数据管理](data_management/README.md)
* [数据](data_management/volume.md)
* [数据卷容器](data_management/container.md)
* [份、恢复、迁移数据](data_management/management.md)
* [使用网络](network/README.md)
* [外部访问容器](network/port_mapping.md)
* [容器互](network/linking.md)
* [高级网络配置](advanced_network/README.md)
* [快速配置指南](advanced_network/quick_guide.md)
* [配置 DNS](advanced_network/dns.md)
* [容器访问控制](advanced_network/access_control.md)
* [端口映射实现](advanced_network/port_mapping.md)
* [配置 docker0 网桥](advanced_network/docker0.md)
* [自定义网桥](advanced_network/bridge.md)
* [工具和示](advanced_network/example.md)
* [编辑网络配置文件](advanced_network/config_file.md)
* [例:创建一个点到点连](advanced_network/ptp.md)
* [实战案例](cases/README.md)
* [使用 Supervisor 管理](cases/supervisor.md)
* [建 tomcat/weblogic 集群](cases/tomcat.md)
* [多台物理主机之间的容器互](cases/container_connect.md)
* [标准化开发测试和生产环](cases/environment.md)
* [私有倉庫](repository/local_repo.md)
* [設定文件](repository/config.md)
* [數據管理](data_management/README.md)
* [數據](data_management/volume.md)
* [數據卷容器](data_management/container.md)
* [份、恢復、遷移數據](data_management/management.md)
* [使用網路](network/README.md)
* [外部訪問容器](network/port_mapping.md)
* [容器互](network/linking.md)
* [進階網路設定](advanced_network/README.md)
* [快速設定指南](advanced_network/quick_guide.md)
* [設定 DNS](advanced_network/dns.md)
* [容器訪問控制](advanced_network/access_control.md)
* [端口映射實做](advanced_network/port_mapping.md)
* [設定 docker0 網橋](advanced_network/docker0.md)
* [自定義網橋](advanced_network/bridge.md)
* [工具與範](advanced_network/example.md)
* [編輯網路設定文件](advanced_network/config_file.md)
* [例:創造一個點對點連](advanced_network/ptp.md)
* [實戰案例](cases/README.md)
* [使用 Supervisor 管理程](cases/supervisor.md)
* [ tomcat/weblogic 集群](cases/tomcat.md)
* [多台實體主機之間的容器互](cases/container_connect.md)
* [標準化開發測試和生產環](cases/environment.md)
* [安全](security/README.md)
* [内核名字空间](security/kernel_ns.md)
* [控制](security/control_group.md)
* [端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [总结](security/summary.md)
* [內核命名空間](security/kernel_ns.md)
* [控制](security/control_group.md)
* [服端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [總結](security/summary.md)
* [Dockerfile](dockerfile/README.md)
* [基本结构](dockerfile/basic_structure.md)
* [基本結構](dockerfile/basic_structure.md)
* [指令](dockerfile/instructions.md)
* [创建镜像](dockerfile/build_image.md)
* [层实现](underly/README.md)
* [基本架](underly/arch.md)
* [名字空间](underly/namespace.md)
* [控制](underly/cgroups.md)
* [Union 文件系](underly/ufs.md)
* [建立映像檔](dockerfile/build_image.md)
* [層實做](underly/README.md)
* [基本架](underly/arch.md)
* [命名空間](underly/namespace.md)
* [控制](underly/cgroups.md)
* [Union 文件系](underly/ufs.md)
* [容器格式](underly/container_format.md)
* [网络](underly/network.md)
* [一:命令查](appendix_command/README.md)
* [二:常见仓库介绍](appendix_repo/README.md)
* [網路](underly/network.md)
* [一:命令查](appendix_command/README.md)
* [二:常見倉庫介紹](appendix_repo/README.md)
* [Ubuntu](appendix_repo/ubuntu.md)
* [CentOS](appendix_repo/centos.md)
* [MySQL](appendix_repo/mysql.md)
@@ -79,5 +79,5 @@
* [Nginx](appendix_repo/nginx.md)
* [WordPress](appendix_repo/wordpress.md)
* [Node.js](appendix_repo/nodejs.md)
* [三:资源链接](appendix_resources/README.md)
* [三:資源連結](appendix_resources/README.md)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,20 +1,20 @@
##守护态运
##守護態執
更多的候,需要 Docker 容器在后台以守护态Daemonized形式行。此,可以通过添加 `-d` 参数来实现
更多的候,需要 Docker 容器在後臺以守護態Daemonized形式行。此,可以透過新增 `-d` 參數來實做
下面的命令会在后台运行容器。
下面的命令會在後臺執行容器。
```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
```
容器启动后会返回一唯一的 id也可以通过 `docker ps` 命令查看容器息。
容器啟動後會返回一唯一的 id也可以透過 `docker ps` 命令查看容器息。
```
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
```
取容器的输出信息,可以通过 `docker logs` 命令。
要取容器的輸出訊息,可以透過 `docker logs` 命令。
```
$ sudo docker logs insane_babbage
hello world

View File

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

View File

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

View File

@@ -1,9 +1,9 @@
##除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。
##除容器
可以使用 `docker rm` 來刪除一個處於終止狀態的容器。
例如
```
$sudo docker rm trusting_newton
trusting_newton
```
如果要除一个运行中的容器,可以添加 `-f` 参数。Docker 会发`SIGKILL`号给容器。
如果要除一個執行中的容器,可以新增 `-f` 參數。Docker 會發`SIGKILL`號給容器。

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,45 +1,45 @@
## 数据
数据卷是一可供一或多容器使用的特殊目,它绕过 UFS可以提供很多有用的特性
* 数据卷可以在容器之共享和重用
* 对数据卷的修改会立马生效
* 对数据卷的更新,不会影响镜
*一直存在,直到有容器使用
## 數據
數據卷是一可供一或多容器使用的特殊目,它繞過 UFS可以提供很多有用的特性
* 數據卷可以在容器之共享和重用
* 對數據卷的修改會立馬生效
* 對數據卷的更新,不會影響鏡
*一直存在,直到有容器使用
*数据卷的使用,类似于 Linux 下对目录或文件行 mount。
*數據卷的使用,類似於 Linux 下對目錄或文件行 mount。
### 创建一个数据
在用 `docker run` 命令的候,使用 `-v` 标记来创建一个数据卷并挂载到容器。在一次 run 中多次使用可以挂载多个数据卷。
### 建立一個數據
在用 `docker run` 命令的候,使用 `-v` 標記來建立一個數據卷並掛載到容器。在一次 run 中多次使用可以掛載多個數據卷。
下面创建一个 web 容器,并加载一个数据卷到容器的 `/webapp`
下面建立一個 web 容器,並載入一個數據卷到容器的 `/webapp`
```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
```
*意:也可以在 Dockerfile 中使用 `VOLUME` 来添加一个或者多新的卷到由该镜像创建的任意容器。
*意:也可以在 Dockerfile 中使用 `VOLUME` 來新增一個或者多新的卷到由該鏡像建立的任意容器。
### 挂载一个主机目录作为数据
使用 `-v` 标记也可以指定挂载一个本地主的目到容器中去。
### 掛載一個主機目錄作為數據
使用 `-v` 標記也可以指定掛載一個本地主的目到容器中去。
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
```
上面的命令加载主机`/src/webapp`到容器的 `/opt/webapp`
录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程到本地目中,查看容器是否正常工作。本地目的路径必须是绝对路径,如果目不存在 Docker 会自动为你创建它。
上面的命令載入主機`/src/webapp`到容器的 `/opt/webapp`
錄。這個功能在進行測試的時候十分方便,比如使用者可以放置一些程到本地目中,查看容器是否正常工作。本地目的路徑必須是絕對路徑,如果目不存在 Docker 會自動為你建立它。
*Dockerfile 中不支持这种用法,是因 Dockerfile 是了移植和分享用的。然而,不同操作系统的路格式不一,所以目前不能支持。
*Dockerfile 中不支持這種用法,是因 Dockerfile 是了移植和分享用的。然而,不同作業系統的路格式不一,所以目前不能支持。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读
Docker 掛載數據卷的默認權限是讀寫,使用者也可以透過 `:ro` 指定為唯讀
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py
```
加了 `:ro`,就挂载为只读了。
加了 `:ro`,就掛載為唯讀了。
### 挂载一个本地主文件作为数据
`-v` 标记也可以从主机挂载单个文件到容器中
### 掛載一個本地主文件作為數據
`-v` 標記也可以從主機掛載單個文件到容器中
```
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
```
这样就可以记录在容器输入过的命令了。
這樣就可以記錄在容器輸入過的命令了。
*意:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改变,从 Docker 1.1
.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目
*意:如果直接掛載一個文件,很多文件編輯工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改變,從 Docker 1.1
.0起,這會導致報錯誤訊息。所以最簡單的辦法就直接掛載文件的父目

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
```
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
@@ -8,4 +8,4 @@ Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
```
*意:在删除镜像之前要先用 `docker rm` 掉依赖于这个镜像的所有容器。
*意:在刪除鏡像之前要先用 `docker rm` 掉依賴於這個鏡像的所有容器。

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,35 +1,36 @@
## 为什么要使用 Docker
为一种新兴的虚拟化方式Docker 跟传统的虚拟化方式相比具有多的优势
## 為什麼要使用 Docker
為一種新興的虛擬化方式Docker 跟傳統的虛擬化方式相比具有多的優勢
首先Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
其次Docker 对系统资源的用率很高,一台主上可以同时运行数千个 Docker 容器。
首先Docker 容器的啟動可以在秒級實做,這相比傳統的虛擬機方式要快得多。
其次Docker 對系統資源的使用率很高,一台主上可以同時執行數千個 Docker 容器。
容器除了行其中用外,基本不消耗外的系统资源,使得用的能很高,同时系统的开销尽量小。传统虚拟机方式行 10 不同的用就要 10 个虚拟机而Docker 只需要启动 10 个隔离的应用即可。
容器除了行其中用外,基本不消耗外的系統資源,使得用的能很高,同時系統資源消耗更少。傳統虛擬機方式行 10 不同的用就要啟動 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。
体说来Docker 在如下几个方面具有大的优势
體說來Docker 在以下幾個方面具有大的優勢
### 更快速的交付和部署
对开发和运维devop员来说,最希望的就是一次创建或配置,可以在任意地方正常行。
對開發和維運develop員來說,最希望的就是一次建立或設定,可以在任意地方正常行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器部署代码
Docker 可以快速建容器,快速迭代用程序,并让整个过程全程可,使团队中的其他成更容易理解用程是如何建和工作的。
Docker 容器很很快!容器的启动时间是秒的,大量地节约开发、测试、部署的时间
開發者可以使用一個標準的映像檔來建立一套開發容器,開發完成之後,維運人員可以直接使用這個容器部署程式碼
Docker 可以快速建容器,快速迭代用程式,並讓整個過程全程可,使團隊中的其他成更容易理解用程是如何建和工作的。
Docker 容器很很快!容器的啟動時間是秒的,大量地節約開發、測試、部署的時間
### 更高效的虚拟
Docker 容器的行不需要外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的能和效率。
### 更有效率的虛擬
Docker 容器的行不需要外的虛擬化支持,它是核心層級的虛擬化,因此可以實做更高的能和效率。
### 更轻松的迁移和
### 更輕鬆的遷移和
Docker 容器乎可以在任意的平台上行,包括物理机、虚拟机、公有、私有云、个人电脑、服务器等。
这种兼容性可以让用户把一个应用程序从一个平台直接移到另外一
Docker 容器乎可以在任意的平台上行,包括實體機器、虛擬機、公有、私有雲、個人電腦、伺服器等。
這種兼容性可以讓使用者把一個應用程式從一個平台直接移到另外一
### 更简单的管理
使用 Docker只需要小小的修改就可以替代以往大量的更新工作。所有的修改都以增量的方式被分和更新,从而实现自动化并且高效的管理。
### 更簡單的管理
使用 Docker只需要小小的修改就可以替代以往大量的更新工作。所有的修改都以增量的方式被分和更新,從而實做自動化並且有效率的管理。
### 对比传统虚拟机总结
| 特性 | 容器 | 虚拟机 |
| -- | -- | -- |
| 启动 | 秒级 | 分钟级 |
| 硬盘使用 | 一般为 MB | 一般为 GB |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |
### 對比傳統虛擬機總結
| 特性 | 容器 | 虛擬機 |
| ---- | ---- | ------ |
| 啟動 | 秒級 | 分鐘級 |
| 硬碟容量 | 一般為 MB | 一般為 GB |
| 效能 | 接近原生 | 比較慢 |
| 系統支持量 | 單機支持上千個容器 | 一般幾十個 |

View File

@@ -1,2 +1,2 @@
# Docker 中的网络功能介
Docker 允许通过外部访问容器或容器互的方式提供网络服务
# Docker 中的網路功能介
Docker 允許透過外部訪問容器或容器互的方式提供網路服務

View File

@@ -1,70 +1,70 @@
## 容器互
容器的linking是除了端口映射外,另一跟容器中用交互的方式。
## 容器互
容器的linking是除了端口映射外,另一跟容器中用交互的方式。
该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的息。
該系統會在源和接收容器之間建立一個隧道,接收容器可以看到源容器指定的息。
### 自定容器命名
接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
### 自定容器命名
接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名。
虽然当创建容器的候,系统默认会分配一名字。自定命名容器有2个好处
* 自定的命名,比较好记,比如一web用容器我可以它起名叫web
* 当要连接其他容器候,可以作为一个有用的参考点,比如接web容器到db容器
雖然當建立容器的候,系統默認會分配一名字。自定命名容器有2個好處
* 自定的命名,比較好記,比如一web用容器我可以它起名叫web
* 當要連接其他容器候,可以作為一個有用的參考點,比如接web容器到db容器
使用 `--name` 标记可以容器自定命名。
使用 `--name` 標記可以容器自定命名。
```
$ sudo docker run -d -P --name web training/webapp python app.py
```
使用 `docker ps` 来验证设定的命名。
使用 `docker ps` 來驗證設定的命名。
```
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
```
也可以使用 `docker inspect` 查看容器的名字
也可以使用 `docker inspect` 查看容器的名字
```
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web
```
意:容器的名是唯一的。如果已命名了一叫 web 的容器,你要再次使用 web 这个名称的时候,需要先用`docker rm` 来删除之前建的同名容器。
意:容器的名是唯一的。如果已命名了一叫 web 的容器,你要再次使用 web 這個名稱的時候,需要先用`docker rm` 來刪除之前建的同名容器。
`docker run`候如果添加 `--rm` 标记,则容器在终止后会立刻除。意,`--rm``-d` 参数不能同使用。
`docker run`候如果新增 `--rm` 標記,則容器在終止後會立刻除。意,`--rm``-d` 參數不能同使用。
###容器互
使用 `--link` 参数可以容器之安全的行交互。
###容器互
使用 `--link` 參數可以容器之安全的行交互。
下面先创建一个新的数据库容器。
下面先建立一個新的數據庫容器。
```
$ sudo docker run -d --name db training/postgres
```
除之前建的 web 容器
除之前建的 web 容器
```
$ docker rm -f web
```
后创建一个新的 web 容器,并将它连接到 db 容器
後建立一個新的 web 容器,並將它連接到 db 容器
```
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
```
db 容器和 web 容器建立互联关系。
db 容器和 web 容器建立互聯關系。
`--link` 参数的格式 `--link name:alias`,其中 `name` 是要接的容器的名`alias`这个连接的名。
`--link` 參數的格式 `--link name:alias`,其中 `name` 是要接的容器的名`alias`這個連接的名。
使用 `docker ps` 查看容器的
使用 `docker ps` 查看容器的
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web
```
可以看到自定命名的容器db 和 webdb 容器的 names 列有 db 也有 web/db。表示 web 容器接到 db 容器web 容器被允许访问 db 容器的息。
可以看到自定命名的容器db 和 webdb 容器的 names 列有 db 也有 web/db。表示 web 容器接到 db 容器web 容器被允許訪問 db 容器的息。
Docker 在两个互联的容器之间创建了一安全隧道,而且不用映射它的端口到宿主主上。在启动 db 容器的时候并没有使用 `-p``-P` 标记,从而避免了暴露数据库端口到外部网络上。
Docker 在兩個互聯的容器之間建立了一安全隧道,而且不用映射它的端口到宿主主上。在啟動 db 容器的時候並沒有使用 `-p``-P` 標記,從而避免了暴露數據庫端口到外部網路上。
Docker 通过 2 方式容器公开连接信息:
* 环境变
Docker 透過 2 方式容器公開連接訊息:
* 環境變
* 更新 `/etc/hosts` 文件
使用 `env` 命令查看 web 容器的环境变
使用 `env` 命令查看 web 容器的環境變
```
$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
@@ -76,9 +76,9 @@ DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .
```
其中 DB_ 开头的环境变量是供 web 容器接 db 容器使用,前采用大写的连接别名。
其中 DB_ 開頭的環境變量是供 web 容器接 db 容器使用,前采用大寫的連接別名。
除了环境变Docker 还添加 host 息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
除了環境變Docker 還新增 host 息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
```
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
@@ -86,8 +86,8 @@ root@aed84ee21bde:/opt/webapp# cat /etc/hosts
. . .
172.17.0.5 db
```
这里有 2 hosts第一是 web 容器web 容器用 id 作他的主名,第二是 db 容器的 ip 和主名。
可以在 web 容器中安 ping 命令来测试跟db容器的通。
這裡有 2 hosts第一是 web 容器web 容器用 id 作他的主名,第二是 db 容器的 ip 和主名。
可以在 web 容器中安 ping 命令來測試跟db容器的通。
```
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
@@ -96,7 +96,7 @@ PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
```
用 ping 来测试db容器解析成 `172.17.0.5`
*意:官方的 ubuntu 像默认没有安 ping需要自行安
用 ping 來測試db容器解析成 `172.17.0.5`
*意:官方的 ubuntu 像默認沒有安 ping需要自行安
用户可以接多子容器到父容器,比如可以接多 web 到 db 容器上。
使用者可以接多子容器到父容器,比如可以接多 web 到 db 容器上。

View File

@@ -1,16 +1,16 @@
## 外部访问容器
容器中可以行一些网络应用,要外部也可以访问这些应用,可以通过 `-P``-p` 参数来指定端口映射。
## 外部訪問容器
容器中可以行一些網路應用,要外部也可以訪問這些應用,可以透過 `-P``-p` 參數來指定端口映射。
使用 -P 标记时Docker 会随机映射一 `49000~49900` 的端口到部容器放的网络端口。
使用 -P 標記時Docker 會隨機映射一 `49000~49900` 的端口到部容器放的網路端口。
使用 `docker ps` 可以看到,本地主的 49155 被映射到了容器的 5000 端口。此时访问本机的 49115 端口即可访问容器 web 用提供的界面。
使用 `docker ps` 可以看到,本地主的 49155 被映射到了容器的 5000 端口。此時訪問本機的 49115 端口即可訪問容器 web 用提供的界面。
```
$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
```
的,可以通过 `docker logs` 命令查看用的息。
的,可以透過 `docker logs` 命令查看用的息。
```
$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
@@ -18,38 +18,38 @@ $ sudo docker logs -f nostalgic_morse
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
```
-p的)可以指定要映射的端口,且,在一指定端口上只可以定一容器。支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`
-p的)可以指定要映射的端口,且,在一指定端口上只可以定一容器。支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`
### 映射所有接口地址
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以
```
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
```
时默认会绑定本地所有接口上的所有地址。
時默認會綁定本地所有接口上的所有地址。
### 映射到指定地址的指定端口
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一特定地址,比如 localhost 地址 127.0.0.1
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一特定地址,比如 localhost 地址 127.0.0.1
```
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
```
### 映射到指定地址的任意端口
使用 `ip::containerPort` 定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一端口。
使用 `ip::containerPort` 定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一端口。
```
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
```
可以使用 udp 标记来指定 udp 端口
可以使用 udp 標記來指定 udp 端口
```
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
```
### 查看映射端口配置
使用 `docker port` 查看前映射的端口配置,也可以查看到定的地址
### 查看映射端口設定
使用 `docker port` 查看前映射的端口設定,也可以查看到定的地址
```
$ docker port nostalgic_morse 5000
127.0.0.1:49155.
```
意:
* 容器有自己的内部网络和 ip 地址(使用 `docker inspect` 可以取所有的Docker 可以有一个可变的网络配置。)
* -p 标记可以多次使用来绑定多端口
意:
* 容器有自己的內部網路和 ip 地址(使用 `docker inspect` 可以取所有的Docker 可以有一個可變的網路設定。)
* -p 標記可以多次使用來綁定多端口
例如
```

View File

@@ -1,10 +1,10 @@
# 仓库
# 倉庫
仓库Repository是集中存放镜像的地方。
倉庫Repository是集中存放映像檔的地方。
容易混淆的概念是注册服务Registry实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目。例如对于仓库地址 `dl.dockerpool.com/ubuntu` 来说`dl.dockerpool.com`注册服务器地址,`ubuntu`仓库名。
容易混淆的概念是註冊伺服Registry實際上註冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個映像檔。從這方面來說,倉庫可以被認為是一個具體的項目或目。例如對於倉庫地址 `dl.dockerpool.com/ubuntu` 來說`dl.dockerpool.com`註冊伺服器地址,`ubuntu`倉庫名。
大部分候,不需要严格区分这两者的概念。
大部分候,不需要嚴格區分這兩者的概念。

View File

@@ -1,30 +1,30 @@
## 仓库配置文件
Docker 的 Registry 利用配置文件提供了一些仓库的模flavor用户可以直接使用它们来进行开发或生部署。
## 倉庫設定文件
Docker 的 Registry 利用設定文件提供了一些倉庫的模flavor使用者可以直接使用它們來進行開發或生部署。
### 模
`config_sample.yml` 文件中,可以看到一些成的模段:
* `common`:基础配置
* `local`存储数据到本地文件系
* `s3`存储数据到 AWS S3 中
* `dev`:使用 `local`的基本配置
* `test`单元测试使用
* `prod`:生产环境配置基本上跟s3配置类似)
* `gcs`存储数据到 Google 的云存储
* `swift`存储数据到 OpenStack Swift 服
* `glance`存储数据到 OpenStack Glance 服,本地文件系统为后备
* `glance-swift`存储数据到 OpenStack Glance 服Swift 为后备
* `elliptics`存储数据到 Elliptics key/value 存
### 模
`config_sample.yml` 文件中,可以看到一些成的模段:
* `common`:基礎設定
* `local`儲存數據到本地文件系
* `s3`儲存數據到 AWS S3 中
* `dev`:使用 `local`的基本設定
* `test`單元測試使用
* `prod`:生產環境設定基本上跟s3設定類似)
* `gcs`儲存數據到 Google 的雲端
* `swift`儲存數據到 OpenStack Swift 服
* `glance`儲存數據到 OpenStack Glance 服,本地文件系統為後備
* `glance-swift`儲存數據到 OpenStack Glance 服Swift 為後備
* `elliptics`儲存數據到 Elliptics key/value 存
用户也可以添加自定的模版段。
使用者也可以新增自定的模版段。
默认情况下使用的模`dev`,要使用某个模板作为默认值,可以添加 `SETTINGS_FLAVOR`环境变量中,例如
預設情況下使用的模`dev`,要使用某個模組作為預設值,可以新增 `SETTINGS_FLAVOR`環境變數中,例如
```
export SETTINGS_FLAVOR=dev
```
另外,配置文件中支持从环境变量中加载值,法格式 `_env:VARIABLENAME[:DEFAULT]`
另外,設定文件中支持從環境變數中載入值,法格式 `_env:VARIABLENAME[:DEFAULT]`
### 示例配置
### 範例設定
```
common:
loglevel: info
@@ -54,4 +54,4 @@ test:
storage_path: /tmp/tmpdockertmp
```
### 选项
### 選項

View File

@@ -1,14 +1,14 @@
## Docker Hub
目前 Docker 官方维护了一公共仓库 [Docker Hub](https://hub.docker.com/),其中已包括了超 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现
目前 Docker 官方維護了一公共倉庫 [Docker Hub](https://hub.docker.com/),其中已包括了超 15,000 的映像檔。大部分需求,都可以透過在 Docker Hub 中直接下載映像檔來實做
### 登
可以通过执`docker login` 命令来输入用户名、密码和邮箱来完成注册和登
注册成功,本地用户目录`.dockercfg`保存用户的认证信息。
### 登
可以透過執`docker login` 命令來輸入使用者名稱、密碼和電子信箱來完成註冊和登
註冊成功,本地使用者目錄`.dockercfg`保存使用者的認證訊息。
### 基本操作
用户无需登即可通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下到本地。
使用者無需登即可透過 `docker search` 命令來查詢官方倉庫中的映像檔,並利用 `docker pull` 命令來將它下到本地。
例如以 centos 为关键词进行搜索:
例如以 centos 為關鍵字進行搜索:
```
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
@@ -19,16 +19,16 @@ saltstack/centos-6-minimal
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK]
...
```
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星(表示该镜像的受迎程度)、是否官方建、是否自动创建
官方的镜像说明是官方项目组创建和维护automated 源允许用户验证镜像的来源和容。
可以看到顯示了很多包含關鍵字的映像檔,其中包括映像檔名字、描述、星(表示該映像檔的受迎程度)、是否官方建、是否自動建立
官方的映像檔說明是官方項目組建立和維護automated 源允許使用者驗證映像檔的來源和容。
是否是官方提供,可将镜像资源分为两类
种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
有一种类型,比如 `tianon/centos` 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 `user_name/` 指定使用某个用户提供的镜像,比如 tianon 用户
是否是官方提供,可將映像檔資源分為兩類
種是類似 centos 這樣的基礎映像檔,被稱為基礎或根映像檔。這些基礎映像檔是由 Docker 公司建立、驗證、支持、提供。這樣的映像檔往往使用單個單詞作為名字。
有一種類型,比如 `tianon/centos` 映像檔,它是由 Docker 的使用者建立並維護的,往往帶有使用者名稱前綴。可以透過前綴 `user_name/` 指定使用某個使用者提供的映像檔,比如 tianon 使用者
另外,在查找的时候通过 `-s N` 参数可以指定仅显示评价为 `N` 星以上的镜像
另外,在查詢的時候透過 `-s N` 參數可以指定僅顯示評價為 `N` 星以上的映像檔
官方 centos 镜像到本地。
官方 centos 映像檔到本地。
```
$ sudo docker pull centos
Pulling repository centos
@@ -37,19 +37,19 @@ Pulling repository centos
511136ea3c5a: Download complete
7064731afe90: Download complete
```
用户也可以在登录后通过 `docker push` 命令来将镜像推送到 Docker Hub。
使用者也可以在登錄後透過 `docker push` 命令來將映像檔推送到 Docker Hub。
### 自动创建
动创建Automated Builds功能对于需要常升级镜像内程序来说,十分方便。
候,用户创建了镜像,安了某个软件,如果软件发布新版本需要手更新镜像。。
### 自動建立
動建立Automated Builds功能對於需要常升級映像檔內程式來說,十分方便。
候,使用者建立了映像檔,安了某個軟體,如果軟體發布新版本需要手更新映像檔。。
而自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 [GitHub](github.org) 或 [BitBucket](bitbucket.org))上的目,一旦项目发生新的提交,则自动执行创建
而自動建立允許使用者透過 Docker Hub 指定跟蹤一個目標網站(目前支持 [GitHub](github.org) 或 [BitBucket](bitbucket.org))上的目,一旦項目發生新的提交,則自動執行建立
配置自动创建,包括下的步
* 创建并登陆 Docker Hub以及目标网站;
* 在目标网站中连接帐户到 Docker Hub
* 在 Docker Hub 中 [配置一个自动创建](https://registry.hub.docker.com/builds/add/)
* 取一个目标网站中的目(需要含 Dockerfile和分支
* 指定 Dockerfile 的位置,提交建。
設定自動建立,包括下的步
* 建立並登陸 Docker Hub以及目標網站;
* 在目標網站中連接帳戶到 Docker Hub
* 在 Docker Hub 中 [設定一個自動建立](https://registry.hub.docker.com/builds/add/)
* 取一個目標網站中的目(需要含 Dockerfile和分支
* 指定 Dockerfile 的位置,提交建
,可以 在Docker Hub 的 [动创建页](https://registry.hub.docker.com/builds/) 中跟每次创建的状态
,可以 在Docker Hub 的 [動建立頁](https://registry.hub.docker.com/builds/) 中跟每次建立的狀態

View File

@@ -1,18 +1,18 @@
## 私有仓库
## 私有倉庫
候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
候使用 Docker Hub 這樣的公共倉庫可能不方便,使用者可以建立一個本地倉庫供私人使用。
节介绍如何使用本地仓库
節介紹如何使用本地倉庫
`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库
### 安装运行 docker-registry
#### 容器
在安了 Docker ,可以通过获取官方 registry 镜像来运行。
`docker-registry` 是官方提供的工具,可以用於建立私有的映像檔倉庫
### 安裝執行 docker-registry
#### 容器
在安了 Docker ,可以透過取得官方 registry 映像檔來執行。
```
$ sudo docker run -d -p 5000:5000 registry
```
这将使用官方的 registry 镜像来启动本地的私有仓库
用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服
這將使用官方的 registry 映像檔來啟動本地的私有倉庫
使用者可以透過指定參數來設定私有倉庫位置,例如設定映像檔存儲到 Amazon S3 服
```
$ sudo docker run \
-e SETTINGS_FLAVOR=s3 \
@@ -24,18 +24,18 @@ $ sudo docker run \
-p 5000:5000 \
registry
````
此外,可以指定本地路(如 `/home/user/registry-conf` )下的配置文件。
此外,可以指定本地路(如 `/home/user/registry-conf` )下的設定文件。
```
$ sudo docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry
```
默认情况下,仓库会被创建在容器的 `/tmp/registry` 下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路
下面的例子将上传的镜像放到 `/opt/data/registry` 目
預設情況下,倉庫會被建立在容器的 `/tmp/registry` 下。可以透過 `-v` 參數來將映像檔文件存放在本地的指定路
下面的例子將上傳的映像檔放到 `/opt/data/registry` 目
```
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
```
#### 本地安
对于 Ubuntu 或 CentOS 等行版,可以直接通过源安装
#### 本地安
對於 Ubuntu 或 CentOS 等行版,可以直接透過套件庫安裝
* Ubuntu
```
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev
@@ -47,18 +47,18 @@ $ sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel
$ sudo python-pip install docker-registry
```
也可以 [docker-registry](https://github.com/docker/docker-registry) 目下载源码进行安
也可以 [docker-registry](https://github.com/docker/docker-registry) 目下載原始碼進行安
```
$ sudo apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev
$ git clone https://github.com/docker/docker-registry.git
$ cd docker-registry
$ sudo python setup.py install
```
修改配置文件,主要修改 dev 模板段的 `storage_path` 到本地的存储仓库的路
修改設定文件,主要修改 dev 模板段的 `storage_path` 到本地的儲存倉庫的路
```
$ cp config/config_sample.yml config/config.yml
```
后启动 Web 服
後啟動 Web 服
```
$ sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
```
@@ -66,14 +66,14 @@ $ sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
```
$ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
```
使用访问本地的 5000 端口,看到出 docker-registry 的版本信息说明运行成功。
使用連結本地的 5000 端口,看到出 docker-registry 的版本訊息說明執行成功。
*`config/config_sample.yml` 文件是示例配置文件。
*`config/config_sample.yml` 文件是範例設定文件。
###在私有仓库上传、下、搜索镜像
建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址 `192.168.7.26:5000`。
###在私有倉庫上傳、下、搜索映像檔
好私有倉庫之後,就可以使用 `docker tag` 來標記一個映像檔,然推送它到倉庫,別的機器上就可以下載下來了。例如私有倉庫地址 `192.168.7.26:5000`。
先在本查看已有的镜像
先在本查看已有的映像檔
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -81,7 +81,7 @@ ubuntu latest ba5877dc9bec 6 week
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
```
使用`docker tag` `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
使用`docker tag` `ba58` 這個映像檔標記為 `192.168.7.26:5000/test`(格式 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
```
$ sudo docker tag ba58 192.168.7.26:5000/test
root ~ # docker images
@@ -90,7 +90,7 @@ ubuntu 14.04 ba5877dc9bec 6 week
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
使用 `docker push` 上传标记的镜像
使用 `docker push` 上傳標記的映像檔
```
$ sudo docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1)
@@ -104,14 +104,14 @@ Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
```
用 curl 查看仓库中的镜像
用 curl 查看倉庫中的映像檔
```
$ curl http://192.168.7.26:5000/v1/search
{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
```
这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上了。
這裡可以看到 `{"description": "", "name": "library/test"}`,表明映像檔已經被成功上了。
在可以到另外一台机器去下载这个镜像
在可以到另外一臺機器去下載這個映像檔
```
$ sudo docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test
@@ -126,7 +126,7 @@ REPOSITORY TAG IMAGE ID CREAT
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
可以使用 [这个脚本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 批量上传本地的镜像到注册服务器中,默认是本地注册服务器 `127.0.0.1:5000`。例如:
可以使用 [這個腳本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 批次上傳本地的映像檔到註冊伺服器中,預設為本地註冊伺服器 `127.0.0.1:5000`。例如:
```
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh
$ ./push_images.sh ubuntu:latest centos:centos7

View File

@@ -1,5 +1,5 @@
# 安全
估 Docker 的安全性,主要考虑三个方面:
*核的名字空和控制组机制提供的容器在安全
* Docker程(特是服端)本身的抗攻
* 核安全性的加强机制对容器安全性的影
估 Docker 的安全性,主要考慮三個方面:
*核的名字空和控制組機制提供的容器在安全
* Docker程(特是服端)本身的抗攻
* 核安全性的加強機制對容器安全性的影

View File

@@ -1,8 +1,8 @@
## 控制
控制是 Linux 容器制的另外一个关键组件,负责实现资源的审计和限制。
## 控制
控制是 Linux 容器制的另外一個關鍵組件,負責實做資源的審計和限制。
它提供了很多有用的特性;以及保各容器可以公平地分享主机的内存、CPU、磁 IO 等源;然,更重要的是,控制组确保了容器内的资源使用产生压力时不会连累主机系统
它提供了很多有用的特性;以及保各容器可以公平地分享主機的內存、CPU、磁 IO 等源;然,更重要的是,控制組確保了容器內的資源使用產生壓力時不會連累主機系統
管控制组不负责隔离容器之相互访问、处理数据和进程,它在防止拒绝服务DDOS方面是必不可少的。尤其是在多用户的平(比如公有或私有的 PaaS控制十分重要。例如,某些用程序表现异常的候,可以保一致地正常行和能。
管控制組不負責隔離容器之相互訪問、處理數據和程式,它在防止拒絕服務DDOS方面是必不可少的。尤其是在多使用者的平(比如公有或私有的 PaaS控制十分重要。例如,某些用程式表現異常的候,可以保一致地正常行和能。
控制组机制始 2006 年,内核从 2.6.24 版本始被引入。
控制組機制始 2006 年,內核從 2.6.24 版本始被引入。

View File

@@ -1,18 +1,18 @@
## Docker服端的防
行一容器或用程的核心是通过 Docker 服端。Docker 服务的运行目前需要 root 限,因此其安全性十分关键
## Docker服端的防
行一容器或用程的核心是透過 Docker 服端。Docker 服務的執行目前需要 root 限,因此其安全性十分關鍵
首先,保只有可信的用户才可以访问 Docker 服。Docker 允许用户在主和容器共享文件,同不需要限制容器的访问权限,就容易容器突破源限制。例如,恶意用户启动容器的时候将主机的根目`/`映射到容器的 `/host`中,那容器理上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?但是事实上几乎所有虚拟化系都允许类似的源共享,而法禁止用户共享主根文件系统到虚拟机系统
首先,保只有可信的使用者才可以訪問 Docker 服。Docker 允許使用者在主和容器共享文件,同不需要限制容器的訪問權限,就容易容器突破源限制。例如,惡意使用者啟動容器的時候將主機的根目`/`映射到容器的 `/host`中,那容器理上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系都允許類似的源共享,而法禁止使用者共享主根文件系統到虛擬機系統
这将会造成很重的安全果。因此,提供容器创建服务时(例如通过一个 web 服器),要更加注意进行参数的安全查,防止意的用户用特定参数来创建一些破性的容器
這將會造成很重的安全果。因此,提供容器建立服務時(例如透過一個 web 服器),要更加註意進行參數的安全查,防止意的使用者用特定參數來建立一些破性的容器
了加强对服务端的保Docker 的 REST API端用跟服端通信)在 0.5.2 之使用本地的 Unix 套接字制替代了原先定在 127.0.0.1 上的 TCP 套接字,因为后者容易遭受跨站本攻击。现在用户使用 Unix 权限检查来加强套接字的访问安全。
了加強對服務端的保Docker 的 REST API端用跟服端通信)在 0.5.2 之使用本地的 Unix 套接字制替代了原先定在 127.0.0.1 上的 TCP 套接字,因為後者容易遭受跨站本攻擊。現在使用者使用 Unix 權限檢查來加強套接字的訪問安全。
用户仍可以利用 HTTP 提供 REST API 访问。建使用安全制,保只有可信的网络或 VPN证书保护机制(例如受保的 stunnel 和 ssl 认证)下的访问可以行。此外,可以使用 HTTPS 和证书来加强保护
使用者仍可以利用 HTTP 提供 REST API 訪問。建使用安全制,保只有可信的網路或 VPN證書保護機制(例如受保的 stunnel 和 ssl 認證)下的訪問可以行。此外,可以使用 HTTPS 和證書來加強保護
最近改的 Linux 名字空间机制将可以实现使用非 root 用户来运行全功能的容器。这将从根本上解了容器和主机之间共享文件系而引起的安全问题
最近改的 Linux 名字空間機制將可以實做使用非 root 使用者來執行全功能的容器。這將從根本上解了容器和主機之間共享文件系而引起的安全問題
终极目标是改 2 重要的安全特性:
* 容器的 root 用户映射到本地主上的非 root 用户,减轻容器和主机之间因权限提升而引起的安全问题
* Docker 服端在非 root 限下行,利用安全可靠的子进程来代理行需要特权权限的操作。些子进程将只允在限定范围内进行操作,例如仅仅负责虚拟网络设定或文件系管理、配置操作等。
終極目標是改 2 重要的安全特性:
* 容器的 root 使用者映射到本地主上的非 root 使用者,減輕容器和主機之間因權限提升而引起的安全問題
* Docker 服端在非 root 限下行,利用安全可靠的子程式來代理行需要特權權限的操作。些子程式將只允在限定範圍內進行操作,例如僅僅負責虛擬網路設定或文件系管理、設定操作等。
,建采用用的服务器来运行 Docker 和相的管理服(例如管理服比如 ssh 控和进程监控、管理工具 nrpe、collectd 等)。其它的业务服务都放到容器中去行。
,建采用用的伺服器來執行 Docker 和相的管理服(例如管理服比如 ssh 控和程式監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去行。

View File

@@ -1,26 +1,26 @@
## 核能力
## 核能力
能力Capability是 Linux 核一个强大的特性,可以提供粒度的权限访问控制。
Linux 核自 2.2 版本起就支持能力制,它将权限划分为更加粒度的操作能力,既可以作用在程上,也可以作用在文件上。
能力Capability是 Linux 核一個強大的特性,可以提供粒度的權限訪問控制。
Linux 核自 2.2 版本起就支持能力制,它將權限劃分為更加粒度的操作能力,既可以作用在程上,也可以作用在文件上。
例如,一 Web 服务进程只需要定一个低于 1024 的端口的限,不需要 root 限。那它只需要被授 `net_bind_service` 能力即可。此外,有很多其他的似能力避免进程获取 root 限。
例如,一 Web 服務程式只需要定一個低於 1024 的端口的限,不需要 root 限。那它只需要被授 `net_bind_service` 能力即可。此外,有很多其他的似能力避免程式取得 root 限。
认情况Docker 启动的容器被格限制只允使用核的一部分能力。
認情況Docker 啟動的容器被格限制只允使用核的一部分能力。
使用能力机制对加强 Docker 容器的安全有很多好。通常,在服务器上会运行一堆需要特权权限的进程,包括有 ssh、cron、syslogd、硬件管理工具模(例如负载模块)、网络配置工具等等。容器跟这些进程是不同的,因为几乎所有的特权进程都由容器以外的支持系统来进行管理。
* ssh 访问被主上ssh服务来管理;
* cron 通常应该作为用户进程执行,限交使用它服务的应用来处理;
*志系统可由 Docker 或第三方服管理;
* 硬件管理无关紧要,容器中也就无需执行 udevd 以及似服
* 网络管理也都在主机上设置,除非特殊需求,容器不需要对网络进行配置
使用能力機制對加強 Docker 容器的安全有很多好。通常,在伺服器上會執行一堆需要特權權限的程式,包括有 ssh、cron、syslogd、硬件管理工具模(例如負載模塊)、網路設定工具等等。容器跟這些程式是不同的,因為幾乎所有的特權程式都由容器以外的支持系統來進行管理。
* ssh 訪問被主上ssh服務來管理;
* cron 通常應該作為使用者程式執行,限交使用它服務的應用來處理;
*誌系統可由 Docker 或第三方服管理;
* 硬件管理無關緊要,容器中也就無需執行 udevd 以及似服
* 網路管理也都在主機上設置,除非特殊需求,容器不需要對網路進行設定
上面的例子可以看出,大部分情下,容器不需要“真正的” root 限,容器只需要少的能力即可。了加安全,容器可以禁用一些必要的限。
上面的例子可以看出,大部分情下,容器不需要“真正的” root 限,容器只需要少的能力即可。了加安全,容器可以禁用一些必要的限。
* 完全禁止任何 mount 操作;
* 禁止直接访问本地主的套接字;
* 禁止访问一些文件系的操作,比如创建新的设备、修改文件性等;
* 禁止模块加载
* 禁止直接訪問本地主的套接字;
* 禁止訪問一些文件系的操作,比如建立新的設備、修改文件性等;
* 禁止模塊載入
这样,就算攻者在容器中取得了 root 限,也不能得本地主机的较高权限,能行的破也有限。
這樣,就算攻者在容器中取得了 root 限,也不能得本地主機的較高權限,能行的破也有限。
认情况Docker采用 [白名](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 制,禁用 [必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它限。
然,用户也可以根自身需求来为 Docker 容器启用额外的限。
認情況Docker采用 [白名](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 制,禁用 [必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它限。
然,使用者也可以根自身需求來為 Docker 容器啟用額外的限。

View File

@@ -1,15 +1,15 @@
## 核名字空
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。`docker run` 启动一个容器,在后台 Docker 容器创建了一个独立的名字空和控制集合。
## 核名字空
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。`docker run` 啟動一個容器,在後臺 Docker 容器建立了一個獨立的名字空和控制集合。
名字空提供了最基也是最直接的隔,在容器中行的进程不会被运行在主上的程和其它容器发现和作用。
名字空提供了最基也是最直接的隔,在容器中行的程式不會被執行在主上的程和其它容器發現和作用。
容器都有自己有的网络栈,意味着它们不能访问其他容器的 sockets 或接口。不,如果主机系统上做了相应的设置,容器可以像跟主交互一的和其他容器交互。指定公共端口或使用 links 来连接 2 容器,容器就可以相互通信了(可以根据配置来限制通信的策略)。
容器都有自己有的網路棧,意味著它們不能訪問其他容器的 sockets 或接口。不,如果主機系統上做了相應的設置,容器可以像跟主交互一的和其他容器交互。指定公共端口或使用 links 來連接 2 容器,容器就可以相互通信了(可以根據設定來限制通信的策略)。
从网络架构的角度看,所有的容器通过本地主机的网桥接口相互通信,就像物理机器通过物理交换机通信一
從網路架構的角度看,所有的容器透過本地主機的網橋接口相互通信,就像物理機器透過物理交換機通信一
么,内核中实现名字空和私有网络的代是否足成熟?
麽,內核中實做名字空和私有網路的代是否足成熟?
核名字空间从 2.6.15 版本2008 年 7 月布)之被引入,数年间,这些机制的可靠性在多大型生产系统中被实践验证
核名字空間從 2.6.15 版本2008 年 7 月布)之被引入,數年間,這些機制的可靠性在多大型生產系統中被實踐驗證
实际上,名字空的想法和设计提出的时间要更早,最初是了在核中引入一种机制来实现 [OpenVZ](http://en.wikipedia.org/wiki/OpenVZ) 的特性。
而 OpenVZ 目早在 2005 年就布了,其设计和实现都已十分成熟。
實際上,名字空的想法和設計提出的時間要更早,最初是了在核中引入一種機制來實做 [OpenVZ](http://en.wikipedia.org/wiki/OpenVZ) 的特性。
而 OpenVZ 目早在 2005 年就布了,其設計和實做都已十分成熟。

View File

@@ -1,9 +1,9 @@
## 其它安全特性
除了能力制之外,可以利用一些有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
除了能力制之外,可以利用一些有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
Docker 前默认只启用了能力制。用户可以采用多方案来加强 Docker 主的安全,例如:
*核中用 GRSEC 和 PAX这将增加很多编译和运行时的安全查;通过地址随机化避免意探等。且,启用该特性不需要 Docker 行任何配置
* 使用一些有增安全特性的容器模板,比如 AppArmor 的模板和 Redhat SELinux 策略的模板。些模板提供了外的安全特性。
* 用户可以自定义访问控制机制来定制安全策略。
Docker 前默認只啟用了能力制。使用者可以采用多方案來加強 Docker 主的安全,例如:
*核中用 GRSEC 和 PAX這將增加很多編譯和執行時的安全查;透過地址隨機化避免意探等。且,啟用該特性不需要 Docker 行任何設定
* 使用一些有增安全特性的容器模板,比如 AppArmor 的模板和 Redhat SELinux 策略的模板。些模板提供了外的安全特性。
* 使用者可以自定義訪問控制機制來定制安全策略。
跟其它添加到 Docker 容器的第三方工具一(比如网络拓扑和文件系共享),有很多似的制,在不改 Docker 核情下就可以加固有的容器。
跟其它新增到 Docker 容器的第三方工具一(比如網路拓撲和文件系共享),有很多似的制,在不改 Docker 核情下就可以加固有的容器。

View File

@@ -1,4 +1,4 @@
## 总结
总体来Docker 容器是十分安全的,特是在容器不使用 root 权限来运行进程的话
## 總結
總體來Docker 容器是十分安全的,特是在容器不使用 root 權限來執行程式的話
另外,用户可以使用有工具,比如 Apparmor, SELinux, GRSEC 来增强安全性;甚至自己在核中实现更复杂的安全制。
另外,使用者可以使用有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在核中實做更復雜的安全制。

View File

@@ -1,13 +1,13 @@
# 底层实现
# 底層實做
Docker 底的核心技包括 Linux 上的名字空Namespaces、控制Control groups、Union 文件系Union file systems和容器格式Container format
Docker 底的核心技包括 Linux 上的名字空Namespaces、控制Control groups、Union 文件系Union file systems和容器格式Container format
知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件境提供给虚拟机的操作系统。虚拟机系统看到的境是可限制的,也是彼此隔的。
这种直接的做法实现了对资源最完整的封,但很多候往往意味着系统资源的浪
例如,以宿主机和虚拟机系统都为 Linux 系统为例,虚拟机中运行的用其可以利用宿主机系统中的运行环境。
知道,傳統的虛擬機透過在宿主主機中執行 hypervisor 來模擬一整套完整的硬件境提供給虛擬機的作業系統。虛擬機系統看到的境是可限制的,也是彼此隔的。
這種直接的做法實做了對資源最完整的封,但很多候往往意味著系統資源的浪
例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中執行的用其可以利用宿主機系統中的執行環境。
知道,在操作系统中,包括核、文件系统、网络、PID、UID、IPC、存、硬、CPU 等等,所有的源都是应用进程直接共享的。
要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔
前者相容易实现一些,后者则需要宿主机系统的深入支持。
知道,在作業系統中,包括核、文件系統、網路、PID、UID、IPC、存、硬、CPU 等等,所有的源都是應用程式直接共享的。
要想實做虛擬化,除了要實做對內存、CPU、網路IO、硬IO、存儲空間等的限制外,還要實做文件系統、網路、PID、UID、IPC等等的相互隔
前者相容易實做一些,後者則需要宿主機系統的深入支持。
随着 Linux 系统对于名字空功能的完善实现,程序员已经可以实现上面的所有需求,某些程在彼此隔的名字空间中运行。大家然都共用一个内核和某些运行时环境(例如一些系命令和系统库),但是彼此看不到,都以为系统中只有自己的存在。这种机制就是容器Container利用名字空间来做权限的隔控制,利用 cgroups 来做资源分配。
隨著 Linux 系統對於名字空功能的完善實做,程式員已經可以實做上面的所有需求,某些程在彼此隔的名字空間中執行。大家然都共用一個內核和某些執行時環境(例如一些系命令和系統庫),但是彼此看不到,都以為系統中只有自己的存在。這種機制就是容器Container利用名字空間來做權限的隔控制,利用 cgroups 來做資源分配。

View File

@@ -1,10 +1,10 @@
## 基本架
Docker 采用了 C/S架,包括客端和服端。
Docker daemon 作为服务端接受自客户的请求,并处理这些请求(创建、运行、分容器)。
端和服端既可以行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。
## 基本架
Docker 采用了 C/S架,包括客端和服端。
Docker daemon 作為服務端接受自客戶的請求,並處理這些請求(建立、執行、分容器)。
端和服端既可以行在一個機器上,也可透過 socket 或者 RESTful API 來進行通信。
![Docker 基本架](../_images/docker_arch.png)
![Docker 基本架](../_images/docker_arch.png)
Docker daemon 一般在宿主主机后台运行,等待接收自客端的消息。
Docker 客户端则为用户提供一系列可行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker daemon 一般在宿主主機後臺執行,等待接收自客端的消息。
Docker 客戶端則為使用者提供一系列可行命令,使用者用這些命令實做跟 Docker daemon 交互。

View File

@@ -1,9 +1,9 @@
## 控制
## 控制
控制[cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 核的一特性,主要用来对共享资源进行隔、限制、审计等。只有能控制分配到容器的源,才能避免当多个容器同时运行时的对系统资源的竞争
控制[cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 核的一特性,主要用來對共享資源進行隔、限制、審計等。只有能控制分配到容器的源,才能避免當多個容器同時執行時的對系統資源的競爭
控制组技术最早是由 Google 的程序员 2006 年起提出Linux 核自 2.6.24 始支持。
控制組技術最早是由 Google 的程式員 2006 年起提出Linux 核自 2.6.24 始支持。
控制可以提供容器的存、CPU、磁 IO 等源的限制和审计管理。
控制可以提供容器的存、CPU、磁 IO 等源的限制和審計管理。

View File

@@ -1,4 +1,4 @@
## 容器格式
最初Docker 采用了 LXC 中的容器格式。自 1.20 版本Docker 也始支持新的 [libcontainer](https://github.com/docker/libcontainer) 格式,并作为默认选项
最初Docker 采用了 LXC 中的容器格式。自 1.20 版本Docker 也始支持新的 [libcontainer](https://github.com/docker/libcontainer) 格式,並作為默認選項
更多容器格式的支持,还在进一步的展中。
更多容器格式的支持,還在進一步的展中。

View File

@@ -1,22 +1,22 @@
## 名字空
名字空是 Linux 核一个强大的特性。每容器都有自己单独的名字空间,运行在其中的用都像是在立的操作系统中运行一。名字空间保证了容器之彼此互不影
## 名字空
名字空是 Linux 核一個強大的特性。每容器都有自己單獨的名字空間,執行在其中的用都像是在立的作業系統中執行一。名字空間保證了容器之彼此互不影
### pid 名字空
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空中可以有相同 pid。所有的 LXC 程在 Docker 中的父进程为Docker程,每 LXC 程具有不同的名字空。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
### pid 名字空
不同使用者的程式就是透過 pid 名字空間隔離開的,且不同名字空中可以有相同 pid。所有的 LXC 程在 Docker 中的父程式為Docker程,每 LXC 程具有不同的名字空。同時由於允許嵌套,因此可以很方便的實做嵌套的 Docker 容器。
### net 名字空
有了 pid 名字空, 每名字空中的 pid 能相互隔,但是网络端口是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默采用 veth 的方式,容器中的虚拟网卡同 host 上的一 Docker 网桥 docker0 接在一起。
### net 名字空
有了 pid 名字空, 每名字空中的 pid 能相互隔,但是網路端口是共享 host 的端口。網路隔離是透過 net 名字空間實做的, 每 net 名字空間有獨立的 網路設備, IP 地址, 路由表, /proc/net 目錄。這樣每個容器的網路就能隔離開來。Docker 默采用 veth 的方式,容器中的虛擬網卡同 host 上的一 Docker 網橋 docker0 接在一起。
### ipc 名字空
容器中程交互是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信量、消息列和共享存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 名字空中的进程间交互,因此需要在 IPC 源申请时加入名字空间信息,每 IPC 源有一唯一的 32 位 id。
### ipc 名字空
容器中程交互是采用了 Linux 常見的程式間交互方法(interprocess communication - IPC), 包括信量、消息列和共享存等。然而同 VM 不同的是,容器的程式間交互實際上還是 host 上具有相同 pid 名字空中的程式間交互,因此需要在 IPC 源申請時加入名字空間訊息,每 IPC 源有一唯一的 32 位 id。
### mnt 名字空
似 chroot将一个进程放到一特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空 中的程所看到的文件目就被隔离开了。同 chroot 不同,每名字空中的容器在 /proc/mounts 的息只包含所在名字空的 mount point。
### mnt 名字空
似 chroot將一個程式放到一特定的目錄執行。mnt 名字空間允許不同名字空間的程式看到的文件結構不同,這樣每個名字空 中的程所看到的文件目就被隔離開了。同 chroot 不同,每名字空中的容器在 /proc/mounts 的息只包含所在名字空的 mount point。
### uts 名字空
UTS("UNIX Time-sharing System") 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被作一个独立的节点而非 主上的一个进程
### uts 名字空
UTS("UNIX Time-sharing System") 名字空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網路上可以被作一個獨立的節點而非 主上的一個程式
### user 名字空
容器可以有不同的用户和组 id, 也就是可以在容器用容器部的用户执行程而非主上的用户
### user 名字空
容器可以有不同的使用者和組 id, 也就是可以在容器用容器部的使用者執行程而非主上的使用者
*注:关于 Linux 上的名字空[篇文章](http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/) 介的很好。
*註:關於 Linux 上的名字空[篇文章](http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/) 介的很好。

View File

@@ -1,39 +1,39 @@
## Docker 网络实现
## Docker 網路實做
Docker 的网络实现其实就是利用了 Linux 上的网络名字空间和虚拟网络设备(特是 veth pair。建先熟悉了解这两部分的基本概念再阅读本章。
Docker 的網路實做其實就是利用了 Linux 上的網路名字空間和虛擬網路設備(特是 veth pair。建先熟悉了解這兩部分的基本概念再閱讀本章。
### 基本原理
首先,要实现网络通信,器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由制。
首先,要實做網路通信,器需要至少一個網路接口(物理接口或虛擬接口)來收發數據包;此外,如果不同子網之間要進行通信,需要路由制。
Docker 中的网络接口默都是虚拟的接口。虚拟接口的优势之一是转发效率高。
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接制到接收接口的接收存中。对于本地系和容器内系统看来就像是一正常的以太卡,只是它不需要真正同外部网络设备通信,速度要快很多。
Docker 中的網路接口默都是虛擬的接口。虛擬接口的優勢之一是轉發效率高。
Linux 透過在內核中進行數據復制來實做虛擬接口之間的數據轉發,發送接口的發送緩存中的數據包被直接制到接收接口的接收存中。對於本地系和容器內系統看來就像是一正常的以太卡,只是它不需要真正同外部網路設備通信,速度要快很多。
Docker 容器网络就利用了这项技术。它在本地主和容器内分别创建一个虚拟接口,并让它们彼此通(这样的一接口叫做 `veth pair`)。
Docker 容器網路就利用了這項技術。它在本地主和容器內分別建立一個虛擬接口,並讓它們彼此通(這樣的一接口叫做 `veth pair`)。
### 创建网络参数
Docker 创建一个容器的候,会执行如下操作:
* 创建一对虚拟接口,分放到本地主和新容器中;
* 本地主一端接到默的 docker0 或指定网桥上,具有一唯一的名字,如 veth65f9
* 容器一端放到新容器中,修改名字作 eth0这个接口只在容器的名字空间可见
* 从网桥可用地址段中获取一个空闲地址分配容器的 eth0并配置默认路由到桥接网卡 veth65f9。
### 建立網路參數
Docker 建立一個容器的候,會執行以下操作:
* 建立一對虛擬接口,分放到本地主和新容器中;
* 本地主一端接到默的 docker0 或指定網橋上,具有一唯一的名字,如 veth65f9
* 容器一端放到新容器中,修改名字作 eth0這個接口只在容器的名字空間可見
* 從網橋可用地址段中取得一個空閑地址分配容器的 eth0並設定默認路由到橋接網卡 veth65f9。
完成些之,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络
完成些之,容器就可以使用 eth0 虛擬網卡來連接其他容器和其他網路
可以在 `docker run`时候通过 `--net` 参数来指定容器的网络配置有4个可选值:
* `--net=bridge` 这个是默值,接到默认的网桥
* `--net=host` Docker 不要容器网络放到隔的名字空中,即不要容器化容器内的网络。此容器使用本地主机的网络,它有完全的本地主接口访问权限。容器程可以跟主其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus可以容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果一步的使用 `--privileged=true`,容器被允直接配置主机的网络堆栈
* `--net=container:NAME_or_ID` Docker 新建容器的程放到一已存在容器的网络栈中,新容器程有自己的文件系统、进程列表和源限制,但和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 `lo` 回接口通信。
* `--net=none` Docker 新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置
可以在 `docker run`時候透過 `--net` 參數來指定容器的網路設定有4個可選值:
* `--net=bridge` 這個是默值,接到默認的網橋
* `--net=host` Docker 不要容器網路放到隔的名字空中,即不要容器化容器內的網路。此容器使用本地主機的網路,它有完全的本地主接口訪問權限。容器程可以跟主其它 root 程式一樣可以打開低範圍的端口,可以訪問本地網路服務比如 D-bus可以容器做一些影響整個主機系統的事情,比如重啟主機。因此使用這個選項的時候要非常小心。如果一步的使用 `--privileged=true`,容器被允直接設定主機的網路堆棧
* `--net=container:NAME_or_ID` Docker 新建容器的程放到一已存在容器的網路棧中,新容器程有自己的文件系統、程式列表和源限制,但和已存在的容器共享 IP 地址和端口等網路資源,兩者程式可以直接透過 `lo` 回接口通信。
* `--net=none` Docker 新容器放到隔離的網路棧中,但是不進行網路設定。之後,使用者可以自己進行設定
### 网络配置细节
用户使用 `--net=none` ,可以自行配置网络,让容器到跟平常一具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节
### 網路設定細節
使用者使用 `--net=none` ,可以自行設定網路,讓容器到跟平常一具有訪問網路的權限。透過這個過程,可以了解 Docker 設定網路的細節
首先,启动一个 `/bin/bash` 容器,指定 `--net=none` 参数
首先,啟動一個 `/bin/bash` 容器,指定 `--net=none` 參數
```
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/#
```
在本地主查找容器的程 id并为它创建网络命名空
在本地主查找容器的程 id並為它建立網路命名空
```
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778
@@ -41,20 +41,20 @@ $ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
```
检查桥接网卡的 IP 和子网掩码信息。
檢查橋接網卡的 IP 和子網掩碼訊息。
```
$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0
...
```
创建一对 “veth pair” 接口 A 和 B定 A 到网桥 `docker0`并启用它
建立一對 “veth pair” 接口 A 和 B定 A 到網橋 `docker0`並啟用它
```
$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up
```
B放到容器的网络命名空,命名 eth0启动它并配置一个可用 IP桥接网段)和默认网关
B放到容器的網路命名空,命名 eth0啟動它並設定一個可用 IP橋接網段)和默認網關
```
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
@@ -62,8 +62,8 @@ $ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1
```
以上,就是 Docker 配置网络的具体过程。
以上,就是 Docker 設定網路的具體過程。
容器结束后Docker 清空容器,容器的 eth0 会随网络命名空一起被清除A 接口也被自动从 `docker0`
容器結束後Docker 清空容器,容器的 eth0 會隨網路命名空一起被清除A 接口也被自動從 `docker0`
此外,用户可以使用 `ip netns exec` 命令在指定网络名字空间中进行配置,从而配置容器内的网络
此外,使用者可以使用 `ip netns exec` 命令在指定網路名字空間中進行設定,從而設定容器內的網路

View File

@@ -1,10 +1,10 @@
## Union 文件系
Union文件系[UnionFS](http://en.wikipedia.org/wiki/UnionFS))是一种分层、轻量级并且高能的文件系,它支持文件系的修改作一次提交来一层层的叠加,同可以不同目录挂载到同一个虚拟文件系下(unite several directories into a single virtual filesystem)。
## Union 文件系
Union文件系[UnionFS](http://en.wikipedia.org/wiki/UnionFS))是一種分層、輕量級並且高能的文件系,它支持文件系的修改作一次提交來一層層的疊加,同可以不同目錄掛載到同一個虛擬文件系下(unite several directories into a single virtual filesystem)。
Union 文件系是 Docker 像的基础。镜像可以通过分层来进行继承,基于基础镜像(有父像),可以制作各种具体的应用镜像。
Union 文件系是 Docker 像的基礎。鏡像可以透過分層來進行繼承,基於基礎鏡像(有父像),可以制作各種具體的應用鏡像。
另外,不同 Docker 容器就可以共享一些基的文件系统层,同再加上自己有的改动层,大大提高了存的效率。
另外,不同 Docker 容器就可以共享一些基的文件系統層,同再加上自己有的改動層,大大提高了存的效率。
Docker 中使用的 AUFSAnotherUnionFS就是一 Union FS。 AUFS 支持每一个成员目录(类似 Git 的分支)设定只读readonly读写readwritewhiteout-able限, 同 AUFS 有一个类似分的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 中使用的 AUFSAnotherUnionFS就是一 Union FS。 AUFS 支持每一個成員目錄(類似 Git 的分支)設定唯讀readonly讀寫readwritewhiteout-able限, 同 AUFS 有一個類似分的概念, 對唯讀權限的分支可以邏輯上進行增量地修改(不影響唯讀部分的)。
Docker 目前支持的 Union 文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
Docker 目前支持的 Union 文件系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。