84 Commits

Author SHA1 Message Date
khs1994
2535813859 归档 0.8 版本,增加离线阅读 2017-11-22 22:06:02 +08:00
khs1994
c8260780d9 归档 0.8 版本,内容适用于 Docker 1.13.0 以下版本 2017-11-22 21:40:27 +08:00
Baohua Yang
d8b2a7a303 Remove failed qq group number 2017-09-01 11:28:04 +08:00
Baohua Yang
41779a5661 Merge pull request #188 from pkking/master
Add new registry mirror from official site
2017-08-21 16:58:07 +08:00
pkking
fc86abea99 1. 增加docker 官方registry mirror的地址
2. 增加新版本检查registry生效的方法

Signed-off-by: pkking <pkwarcraft@gmail.com>
2017-08-21 15:29:02 +08:00
Baohua Yang
62f9976b0d Merge pull request #187 from silenceper/master
Fix consul name
2017-08-16 13:49:04 +08:00
silenceper
70d77b489d fix:单词错误 2017-08-15 15:12:36 +08:00
silenceper
060dee21d5 fix:consel=>consul 2017-08-15 15:11:10 +08:00
Baohua Yang
f59dd5bdc0 Merge pull request #184 from liu4480/master
Update docker-registry repo
2017-07-28 14:13:21 +08:00
Bin Liu
6612b45387 docker-registry is DEPRECATED 2017-07-28 14:06:48 +08:00
Baohua Yang
f7e6d648f5 Merge pull request #183 from wzcboss/master
Remove ";" in python code
2017-07-25 10:38:38 +08:00
wzcboss
1a5c72ee10 remove ;in index.py 2017-07-24 17:18:05 +08:00
Baohua Yang
de972a0404 Merge pull request #179 from alex8866/master
Update tencent cloud introduction
2017-07-18 20:53:59 +08:00
Lingfei Kong
5217746e64 change term 你 to 用户 2017-07-18 14:50:06 +08:00
Baohua Yang
91e53f489a Merge pull request #138 from rockcitystore/master
Fix docker registry path to 2.0 by default
2017-07-18 14:27:28 +08:00
Baohua Yang
f1a9e3372c Merge pull request #182 from leotian/fix-img
Fix missing image
2017-07-17 23:10:48 +08:00
leotian
647828bf85 refactor: image not found 2017-07-17 11:12:42 +08:00
Lingfei Kong
9e2cdc0779 腾讯云已经推出了容器服务,更新容器与云计算章节中的腾讯云部分介绍 2017-07-03 10:40:25 +08:00
Baohua Yang
62c03c1c53 Merge pull request #177 from wenfengshi/master
Fix typo and broken links
2017-06-18 14:59:13 +08:00
onephone
b0d1050cfb Fix issue #176: remove the dead links 2017-06-18 14:35:52 +08:00
onephone
0fd286a5d1 完善命令,补充新版本命令说明 2017-06-18 11:35:34 +08:00
onephone
f07c51e2e7 Fix issue: change github.org to github.com 2017-06-18 09:01:46 +08:00
Baohua Yang
705fb2efc3 Merge pull request #175 from shuizhongyueming/f/RUN命令调整
Fix run cmd
2017-06-01 18:50:13 +08:00
shuizhongyueming
f23e8f8ce7 修复在ONBUILD章节里面RUN命令的使用错误
在ONBUILD章节里面RUN后面要执行的命令被双引号括起来了
在基于demo提供的Dockerfile来构建镜像时,Docker会报类似"/bin/sh: 1: mkdir /app: not found"的错误
去掉之后就一切正常了
2017-06-01 18:11:18 +08:00
Baohua Yang
5f481b90dc Update figure path 2017-05-24 11:44:57 +08:00
Baohua Yang
a7ac3b4273 Update v2 registry path 2017-05-24 11:40:47 +08:00
Baohua Yang
e33150db73 Update figure location 2017-05-24 11:37:58 +08:00
Baohua Yang
095244b371 Add os cases 2017-05-24 11:22:23 +08:00
Baohua Yang
4f7a1ef89c Remove unused content 2017-05-24 11:17:11 +08:00
Baohua Yang
6e3c7fd2a5 Fix issue#174 2017-05-24 11:13:57 +08:00
Baohua Yang
5786333a3b Update swarm and mesos chapter 2017-05-02 23:17:58 +08:00
Baohua Yang
2568854736 Merge pull request #171 from glixingxian/master
Improve nsenter example
2017-05-02 11:31:51 +08:00
Xingxian LI
79f0fc403f improve nsenter example 2017-05-01 16:35:43 +02:00
Baohua Yang
4ca37a0de7 Merge pull request #170 from shuizhongyueming/master
Update using mirror at MacOS
2017-04-29 22:46:46 +08:00
happy wang
34b0969ef7 更新mirror.md
新增macOS下配置加速器的方法
2017-04-27 18:53:06 +08:00
Baohua Yang
1bfd80b970 Merge pull request #167 from aleen42/patch-1
Add a plugin `page-treeview`
2017-04-24 16:49:30 +08:00
Aleen
8f7b408091 Adding a plugin named page-treeview 2017-04-24 15:59:27 +08:00
Baohua Yang
e87ff1bb1e Merge pull request #165 from wg1j/master
Fixed url and add footnote to new Docker Store
2017-04-24 10:32:11 +08:00
wg1j
7ef6616b1c Fixed url and add footnote to new Docker Store 2017-04-22 00:27:44 +08:00
Baohua Yang
fcabe5bc3b Add new book link 2017-03-21 09:22:20 +08:00
Baohua Yang
60ebacfda4 Merge pull request #163 from shijinzhan/patch-1
Add space before title
2017-03-15 11:36:04 +08:00
shijinzhan
df6d092c11 标题细节调整 2017-03-15 09:48:29 +08:00
Baohua Yang
2a39cf4ce8 Merge pull request #162 from stenote/patch-1
Update WORKDIR usage
2017-03-14 20:47:39 +08:00
Rui Ma
22fa7ea709 Update workdir.md
workdir 可以自动帮忙建立目录
2017-03-14 17:06:48 +08:00
Baohua Yang
17add1cda4 Merge pull request #161 from Howld/master
Fix typos
2017-03-03 11:29:39 +08:00
Howld
a56376fc7c #160 2017-03-02 19:58:32 +08:00
Baohua Yang
9c93015ed3 Merge branch 'master' of github.com:yeasy/docker_practice 2017-02-22 10:17:08 +08:00
Baohua Yang
c703cae1cf Update china-pub link 2017-02-22 10:17:02 +08:00
Baohua Yang
86523b981e Merge pull request #158 from 374632897/master
Fix typos
2017-02-19 16:08:12 +08:00
Jason
4f3ecaa0df 在 -> 再 2017-02-18 22:07:35 +08:00
Jason
f22277afbf 是用 -> 使用 2017-02-18 21:02:39 +08:00
Jason
d9648a2544 至于修改为置于 2017-02-18 14:35:44 +08:00
Baohua Yang
12ddbfda1e Merge pull request #157 from twang2218/fix-basic-concept-typo
Fix basic concept chapter's typo, make it clearer
2017-02-16 14:50:48 +08:00
Tao Wang
0d2cc4a8d3 Fix basic concept chapter's typo, make it clearer
Signed-off-by: Tao Wang <twang2218@gmail.com>
2017-02-16 14:11:24 +11:00
Baohua Yang
e003739d1a Merge pull request #155 from gerryke/master
Fix typo
2017-02-10 21:32:17 +08:00
gerryke
59e80243dc 修改Entrypoint介绍章节中错别字“远了”为“原来” 2017-02-09 17:12:26 +08:00
Baohua Yang
8a8edc3767 Merge branch 'master' of github.com:yeasy/docker_practice 2017-02-09 09:36:10 +08:00
Baohua Yang
94e6ed39cc Add version 2 release news 2017-02-09 09:36:05 +08:00
Baohua Yang
3344b31dcc Merge pull request #154 from mzeht/master
Fix format
2017-02-07 22:15:49 +08:00
mzeht
caf3cdf801 appendix/repo目录下语法格式修改 2017-02-07 22:04:05 +08:00
mzeht
53aca57515 appendix/repo/ubuntu.md语法格式修改 2017-02-07 21:59:32 +08:00
Baohua Yang
7726d62b7a Merge pull request #150 from qiuyin/master
Update volume.md
2017-01-26 15:32:06 +08:00
qiuyin
b003629be5 Update volume.md 2017-01-26 11:10:42 +09:00
Baohua Yang
8291e13c27 Merge pull request #149 from qiuyin/master
Update volume, will need more explicit change point info
2017-01-25 20:10:17 +08:00
qiuyin
05120d9e5e 对查看数据卷的具体信息,补充了最新版的内容。 2017-01-21 20:18:39 +09:00
qiuyin
d4c1f98702 Update volume.md 2017-01-20 18:10:20 +09:00
Baohua Yang
a3bec5ffba Merge pull request #148 from hkKimWu/master
Fix missing comma
2017-01-13 17:07:31 +08:00
Kim Wu
78e5d45125 改正输入错漏。
CMD ["nginx" "-g" "daemon off;"] -> CMD ["nginx", "-g", "daemon off;"]
2017-01-13 14:21:35 +08:00
yeasy
37b4149605 Add cloud chapter 2017-01-12 16:11:33 +08:00
Baohua Yang
ec70b04ff0 Add cloud chapter 2017-01-12 15:41:14 +08:00
Baohua Yang
c247ef2aef Add revision and contribute section 2017-01-12 13:25:22 +08:00
Baohua Yang
60388ba6e9 Merge pull request #147 from QwertyJack/master
Fix typo
2017-01-11 17:44:36 +08:00
Baohua Yang
bcb673ad00 Add figure 2017-01-11 17:17:49 +08:00
jack@yfy
9e60e762f5 a little spelling mistake 2017-01-10 22:30:02 +08:00
Baohua Yang
db5da49511 release 0.8.0 2017-01-08 22:48:29 +08:00
Baohua Yang
dd33dea8e4 Merge pull request #146 from JohannLai/master
Fix “Web” to "web",consistent with sub directories
2017-01-06 22:43:35 +08:00
johannlai
0b99f62220 修改Web为web,与目录中的命名一致 2017-01-06 15:44:31 +08:00
Baohua Yang
8daf9c4f15 Fix figure path 2016-12-20 15:47:31 +08:00
Baohua Yang
57b6e46ad2 Update version number 2016-12-20 15:46:42 +08:00
yeasy
0f91a0ed7d Track 2 files into repository.
- untracked _images/docker_primer.png
- removed docker_primer.png

Auto commit by GitBook Editor
2016-12-20 07:26:13 +00:00
yeasy
b2508c8bac Updates Compose usage 2016-12-20 15:35:52 +08:00
Baohua Yang
2226d748e3 Merge pull request #145 from twang2218/install-mac
Add Homebrew Cask install method to install/mac.md
2016-12-20 09:56:09 +08:00
Tao Wang
52934e24c9 Add Homebrew Cask install method to install/mac.md
Signed-off-by: Tao Wang <twang2218@gmail.com>
2016-12-20 12:03:56 +11:00
chenan
e8389a46b3 fix:local_repo.md 2016-11-29 10:14:36 +08:00
155 changed files with 2935 additions and 1718 deletions

26
.travis/Dockerfile Normal file
View File

@@ -0,0 +1,26 @@
FROM node:9-alpine
ENV TZ=Asia/Shanghai
WORKDIR /srv/gitbook
COPY book.json book.json
COPY docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache \
tzdata \
&& npm install -g gitbook-cli \
&& gitbook install \
&& ln -s /usr/local/bin/docker-entrypoint.sh / \
&& rm -rf /root/.npm /tmp/*
EXPOSE 4000
VOLUME /srv/gitbook-src
WORKDIR /srv/gitbook-src
ENTRYPOINT ["docker-entrypoint.sh"]
CMD server

30
.travis/book.json Normal file
View File

@@ -0,0 +1,30 @@
{
"title": "Docker -- 从入门到实践",
"author": "yeasy",
"plugins": [
"image-captions",
"github-buttons",
"page-treeview"
],
"pluginsConfig": {
"image-captions": {
"attributes": {
"width": "600"
},
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
},
"github-buttons": {
"repo": "yeasy/docker_practice",
"types": [
"star",
"watch"
],
"size": "small"
},
"page-treeview": {
"copyright": "Copyright &#169; yeasy",
"minHeaderCount": "2",
"minHeaderDeep": "2"
}
}
}

View File

@@ -0,0 +1,5 @@
sut:
build: .
volumes:
- ../:/srv/gitbook-src
command: build

19
.travis/docker-entrypoint.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/sh
START=`date "+%F %T"`
if [ $1 = "sh" ];then sh ; exit 0; fi
rm -rf node_modules _book
cp -a . ../gitbook
cd ../gitbook
main(){
if [ "$1" = build ];then gitbook build; cp -a _book ../gitbook-src; echo $START; date "+%F %T"; exit 0; fi
gitbook serve
exit 0
}
main $1 $2 $3

8
.travis/update.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# cd .travis
# ./update.sh
if [ ! -f Dockerfile ];then exit 1; fi
cp -a ../book.json book.json

122
README.md
View File

@@ -1,18 +1,38 @@
# Docker — 从入门到实践
0.7.6
0.8.3
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本,同时让应用的部署、测试和分发都变得前所未有的高效和轻松!
更新说明2017年底本书内容将基于 Docker v17.09 进行重新修订,发布 0.9 版本。如果您由于特殊原因不能使用 Docker CE v17.09 以上版本,请阅读 [bump-0.8](https://github.com/yeasy/docker_practice/tree/bump-0.8) 分支的内容。
无论是应用开发者,运维人员,还是云计算从业人员,都有必要认识和掌握 Docker以在有限的时间内做更多有意义的事。
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例11 ~ 13 章介绍关于 Docker 实现的相关细节技术。后续章节则分别介绍一些相关的热门开源项目
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker以在有限的时间内做更多有意义的事
本开源书籍既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例11、12 章介绍关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍一些相关的热门开源项目。
在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)。
* pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice)
* epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
离线阅读:
```bash
$ git clone -b bump-0.8 --depth=1 https://github.com/yeasy/docker_practice.git
$ cd docker_practice
$ docker-compose pull # 如果您位于国外,这一步请改为 $ docker-compose build
$ docker-compose up
```
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。欢迎参与维护项目:[如何贡献](contribute.md)。
* [修订记录](revision.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
## 技术交流
欢迎关注 DockerPool 社区微博 [@dockerpool](http://weibo.com/u/5345404432),或加入 Docker 技术交流 QQ 群或微信组,分享 Docker 资源,交流 Docker 技术。
* QQ 群 I 已满341410255
@@ -23,94 +43,18 @@
* QQ 群 VI 已满581983671
* QQ 群 VII 已满252403484
* QQ 群 VIII已满544818750
* QQ 群 IX 已满571502246
* QQ 群 X 可加366203473
* QQ 群 IX 可加571502246
![Docker 技术入门与实战](docker_primer.png)
## 进阶学习
![Docker 技术入门与实战](_images/docker_primer2.png)
《[Docker 技术入门与实战](http://item.jd.com/11598400.html)》一书已经正式出版,包含大量第一手实战案例和更为深入的技术剖析,欢迎大家阅读使用并反馈建议。
《[Docker 技术入门与实战](http://item.jd.com/12121728.html)》第二版已经正式出版,针对初版进行内容升级,欢迎大家阅读使用并反馈建议。
* [China-Pub](http://product.china-pub.com/3770833)
* [京东图书](http://item.jd.com/11598400.html)
* [当当图书](http://product.dangdang.com/23620853.html)
* [亚马逊图书](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00R5MYI7C/ref=lh_ni_t?ie=UTF8&psc=1&smid=A1AJ19PSB66TGU)
* [京东图书](https://item.jd.com/12121728.html)
* [China-Pub](http://product.china-pub.com/5089907)
## 主要版本历史
* 0.8.0: 2016-MM-DD
* 修正文字内容
* 根据最新版本修订安装使用
* 补充附录章节
* 0.7.0: 2016-06-12
* 根据最新版本进行命令调整
* 修正若干文字描述
* 0.6.0: 2015-12-24
* 补充 Machine 项目
* 修正若干 bug
* 0.5.0: 2015-06-29
* 添加 Compose 项目
* 添加 Machine 项目
* 添加 Swarm 项目
* 完善 Kubernetes 项目内容
* 添加 Mesos 项目内容
* 0.4.0: 2015-05-08
* 添加 Etcd 项目
* 添加 Fig 项目
* 添加 CoreOS 项目
* 添加 Kubernetes 项目
* 0.3.0: 2014-11-25
* 完成仓库章节;
* 重写安全章节;
* 修正底层实现章节的架构、命名空间、控制组、文件系统、容器格式等内容;
* 添加对常见仓库和镜像的介绍;
* 添加 Dockerfile 的介绍;
* 重新校订中英文混排格式。
* 修订文字表达。
* 发布繁体版本分支zh-Hant。
* 0.2.0: 2014-09-18
* 对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节;
* 添加底层实现章节;
* 添加命令查询和资源链接章节;
* 其它修正。
* 0.1.0: 2014-09-05
* 添加基本内容;
* 修正错别字和表达不通顺的地方。
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。源码开源托管在 Github 上,欢迎参与维护:[https:\/\/github.com\/yeasy\/docker\_practice](https://github.com/yeasy/docker_practice)。贡献者 [名单](https://github.com/yeasy/docker_practice/graphs/contributors)。
## 参加步骤
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```
$ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice
$ git config user.name "yourname"
$ git config user.email "your email"
```
* 修改代码后提交,并推送到自己的仓库。
```
$ #do some change on the content
$ git commit -am "Fix issue #1: change helo to hello"
$ git push
```
* 在 GitHub 网站上提交 pull request。
* 定期使用项目仓库内容更新自己仓库内容。
```
$ git remote add upstream https://github.com/yeasy/docker_practice
$ git fetch upstream
$ git checkout master
$ git rebase upstream/master
$ git push -f origin master
```
## 鼓励项目
欢迎鼓励项目一杯 coffee~
![coffee](_images/donate.jpeg)

View File

@@ -1,6 +1,8 @@
# Summary
* [前言](README.md)
* [修订记录](revision.md)
* [如何贡献](contribute.md)
* [Docker 简介](introduction/README.md)
* [什么是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md)
@@ -8,12 +10,12 @@
* [镜像](basic_concept/image.md)
* [容器](basic_concept/container.md)
* [仓库](basic_concept/repository.md)
* [安装](install/README.md)
* [安装 Docker](install/README.md)
* [Ubuntu、Debian](install/ubuntu.md)
* [CentOS](install/centos.md)
* [macOS](install/mac.md)
* [镜像加速器](install/mirror.md)
* [镜像](image/README.md)
* [使用镜像](image/README.md)
* [获取镜像](image/pull.md)
* [列出镜像](image/list.md)
* [利用 commit 理解镜像构成](image/commit.md)
@@ -35,14 +37,14 @@
* [其它制作镜像的方式](image/other.md)
* [删除本地镜像](image/rmi.md)
* [实现原理](image/internal.md)
* [容器](container/README.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)
* [访问仓库](repository/README.md)
* [Docker Hub](repository/dockerhub.md)
* [私有仓库](repository/local_repo.md)
* [配置文件](repository/config.md)
@@ -63,11 +65,6 @@
* [工具和示例](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)
@@ -82,25 +79,27 @@
* [联合文件系统](underly/ufs.md)
* [容器格式](underly/container_format.md)
* [网络](underly/network.md)
* [Docker Compose 项目](compose/README.md)
* [Docker 三剑客之 Compose 项目](compose/README.md)
* [简介](compose/intro.md)
* [安装](compose/install.md)
* [安装与卸载](compose/install.md)
* [使用](compose/usage.md)
* [命令说明](compose/commands.md)
* [YAML 模板文件](compose/yaml_file.md)
* [实战 Django](compose/django.md)
* [实战 Rails](compose/rails.md)
* [实战 wordpress](compose/wordpress.md)
* [Docker Machine 项目](machine/README.md)
* [Docker 三剑客之 Machine 项目](machine/README.md)
* [简介](machine/intro.md)
* [安装](machine/install.md)
* [使用](machine/usage.md)
* [Docker Swarm 项目](swarm/README.md)
* [简介](swarm/intro.md)
* [安装](swarm/install.md)
* [使用](swarm/usage.md)
* [调度器](swarm/scheduling.md)
* [过滤](swarm/filter.md)
* [Docker 三剑客之 Docker Swarm](swarm/README.md)
* [Swarm 简介](swarm/intro.md)
* [安装 Swarm](swarm/install.md)
* [使用 Swarm](swarm/usage.md)
* [使用其它服务发现后端](swarm/servicebackend.md)
* [Swarm 中的调度](swarm/scheduling.md)
* [Swarm 中的过滤器](swarm/filter.md)
* [本章小结](swarm/summary.md)
* [Etcd 项目](etcd/README.md)
* [简介](etcd/intro.md)
* [安装](etcd/install.md)
@@ -115,12 +114,27 @@
* [基本概念](kubernetes/concepts.md)
* [kubectl 使用](kubernetes/kubectl.md)
* [架构设计](kubernetes/design.md)
* [Mesos 项目](mesos/README.md)
* [简介](mesos/intro.md)
* [Mesos - 优秀的集群资源调度平台](mesos/README.md)
* [Mesos 简介](mesos/intro.md)
* [安装与使用](mesos/installation.md)
* [原理与架构](mesos/architecture.md)
* [配置项解析](mesos/configuration.md)
* [常见框架](mesos/framework.md)
* [Mesos 配置项解析](mesos/configuration.md)
* [日志与监控](mesos/monitor.md)
* [常见应用框架](mesos/framework.md)
* [本章小结](mesos/summary.md)
* [容器与云计算](cloud/README.md)
* [简介](cloud/intro.md)
* [亚马逊云](cloud/aws.md)
* [腾讯云](cloud/qcloud.md)
* [阿里云](cloud/alicloud.md)
* [小结](cloud/summary.md)
* [实战案例-操作系统](cases/os/README.md)
* [Busybox](cases/os/busybox.md)
* [Alpine](cases/os/alpine.md)
* [Debian\/Ubuntu](cases/os/debian.md)
* [CentOS\/Fedora](cases/os/centos.md)
* [CoreOS](cases/os/coreos.md)
* [本章小结](cases/os/summary.md)
* [附录](appendix/README.md)
* [附录一:常见问题总结](appendix/faq/README.md)
* [附录二:热门镜像介绍](appendix/repo/README.md)
@@ -134,3 +148,4 @@
* [Node.js](appendix/repo/nodejs.md)
* [附录三Docker 命令查询](appendix/command/README.md)
* [附录四:资源链接](appendix/resources/README.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 214 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

BIN
_images/docker_primer2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
_images/donate.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

View File

@@ -7,6 +7,6 @@
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`。通过这种方式主机可以跟容器通信容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
![Docker 网络](../_images/network.png)
![Docker 网络](_images/network.png)
接下来的部分将介绍在一些场景中Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -3,7 +3,7 @@
### 基本信息
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
该仓库位于 https://hub.docker.com/_/centos/,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/centos/ ,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
### 使用方法
默认会启动一个最小化的 CentOS 环境。
@@ -56,3 +56,5 @@ LABEL name="CentOS Base Image" \
CMD ["/bin/bash"]
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
该仓库位于 https://hub.docker.com/_/mongo/,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/mongo/ ,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
### 使用方法
默认会在 `27017` 端口启动数据库。
@@ -260,4 +260,5 @@ ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
该仓库位于 https://hub.docker.com/_/mysql/,提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。
该仓库位于 https://hub.docker.com/_/mysql/ ,提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。
### 使用方法
默认会在 `3306` 端口启动数据库。
@@ -122,3 +122,5 @@ ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3306
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
该仓库位于 https://hub.docker.com/_/nginx/,提供了 Nginx 1.0 ~ 1.11.x 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/nginx/ ,提供了 Nginx 1.0 ~ 1.11.x 各个版本的镜像。
### 使用方法
下面的命令将作为一个静态页面服务器启动。
@@ -99,3 +99,5 @@ EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基于 JavaScript 的可扩展服务端和网络软件开发平台。
该仓库位于 https://hub.docker.com/_/node/,提供了 Node.js 0.10 ~ 6.3.x 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/node/ ,提供了 Node.js 0.10 ~ 6.3.x 各个版本的镜像。
### 使用方法
在项目中创建一个 Dockerfile。

View File

@@ -3,7 +3,7 @@
### 基本信息
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
该仓库位于 https://hub.docker.com/_/redis/,提供了 Redis 3.x 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/redis/ ,提供了 Redis 3.x 各个版本的镜像。
### 使用方法
默认会在 `6379` 端口启动数据库。
@@ -139,3 +139,5 @@ ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD [ "redis-server" ]
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
该仓库位于 https://hub.docker.com/_/ubuntu/,提供了 Ubuntu 从 12.04 ~ 16.10 各个版本的镜像。
该仓库位于 https://hub.docker.com/_/ubuntu/ ,提供了 Ubuntu 从 12.04 ~ 16.10 各个版本的镜像。
### 使用方法
默认会启动一个最小化的 Ubuntu 环境。
@@ -140,3 +140,5 @@ RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
```

View File

@@ -3,7 +3,7 @@
### 基本信息
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。
该仓库位于 https://hub.docker.com/_/wordpress/,提供了 WordPress 4.x 版本的镜像。
该仓库位于 https://hub.docker.com/_/wordpress/ ,提供了 WordPress 4.x 版本的镜像。
### 使用方法
启动容器需要 MySQL 的支持,默认端口为 `80`
@@ -114,4 +114,5 @@ COPY docker-entrypoint.sh /entrypoint.sh
# grr, ENTRYPOINT resets CMD now
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]
```
```

View File

@@ -4,7 +4,7 @@
一个 **Docker Registry** 中可以包含多个**仓库**Repository每个仓库可以包含多个**标签**Tag每个标签对应一个镜像。
一般而言,一个仓库包含的是同一个软件不同版本的镜像,而标签用于对应软件的的不同版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
通常,一个仓库包含同一个软件不同版本的镜像,而标签就常用于对应软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu/) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`

View File

@@ -3,7 +3,8 @@
"author": "yeasy",
"plugins": [
"image-captions",
"github-buttons"
"github-buttons",
"page-treeview"
],
"pluginsConfig": {
"image-captions": {
@@ -19,6 +20,11 @@
"watch"
],
"size": "small"
}
},
"page-treeview": {
"copyright": "Copyright &#169; yeasy",
"minHeaderCount": "2",
"minHeaderDeep": "2"
}
}
}

View File

@@ -1,2 +0,0 @@
#实战案例
介绍一些典型的应用场景和案例。

View File

@@ -1,78 +0,0 @@
## 多台物理主机之间的容器互联(暴露容器到真实网络中)
Docker 默认的桥接网卡是 docker0。它只会在本机桥接所有的容器网卡举例来说容器的虚拟网卡在主机上看一般叫做 veth*** 而 Docker 只是把所有这些网卡桥接在一起,如下:
```
[root@opnvz ~]# brctl show
bridge name bridge id STP enabled interfaces
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
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
11: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 4a:7d:68:da:09:cf brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::487d:68ff:feda:9cf/64 scope link
valid_lft forever preferred_lft forever
```
这样就可以把这个网络看成是一个私有的网络,通过 nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数。
如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。
### 拓扑图
主机 A 和主机 B 的网卡一都连着物理交换机的同一个 vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。
![物理拓扑图](../_images/container_connect_topology.png)
### ubuntu 示例
下面以 ubuntu 为例创建多个主机的容器联网:
创建自己的网桥,编辑 /etc/network/interface 文件
```
auto br0
iface br0 inet static
address 192.168.7.31
netmask 255.255.240.0
gateway 192.168.7.254
bridge_ports em1
bridge_stp off
dns-nameservers 8.8.8.8 192.168.6.1
```
将 Docker 的默认网桥绑定到这个新建的 br0 上面,这样就将这台机器上容器绑定到 em1 这个网卡所对应的物理网络上了。
ubuntu 修改 /etc/default/docker 文件,添加最后一行内容
```
# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
DOCKER_OPTS="-b=br0"
```
在启动 Docker 的时候 使用 -b 参数 将容器绑定到物理网络上。重启 Docker 服务后,再进入容器可以看到它已经绑定到你的物理网络上了。
```
root@ubuntudocker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx
root@ubuntudocker:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.7e6e617c8d53 no em1
vethe6e5
```
这样就直接把容器暴露到物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。

View File

@@ -1,14 +0,0 @@
## 标准化开发测试和生产环境
对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点。
可以用 Docker 来标准化开发、测试、生产环境。
![企业应用结构](../_images/enterprise_usage.png)
Docker 占用资源小,在一台 E5 128 G 内存的服务器上部署 100 个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署 samba利用 samba 的 home 分享方案将每个用户的 home 目录映射到开发中心和测试部门的 Windows 机器上。
针对某个项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过 `docker run -v` 将用户的 home 目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用 `-v` 加载测试部门的 home 目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发部门提交的代码,测试部门部署不了的问题。
测试部门发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中了。这种方式的部署横向性能的扩展性也极好。

9
cases/os/README.md Normal file
View File

@@ -0,0 +1,9 @@
# 操作系统
目前常用的 Linux 发行版主要包括 Debian/Ubuntu 系列和 CentOS/Fedora 系列。
前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时,社区还推出了完全基于 Docker 的 Linux 发行版 CoreOS。
使用 Docker读者只需要一个命令就能快速获取一个 linux 发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整 linux 系统的大部分功能。
本章将介绍如何使用 Docker 安装和使用 Busybox、Alphine、Debian/Ubuntu、CentOS/Fedora、CoreOS 等操作系统。

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

73
cases/os/alpine.md Normal file
View File

@@ -0,0 +1,73 @@
## Alpine
### 简介
![Apline Linux 操作系统](_images/alpinelinux-logo.png)
`Alpine` 操作系统是一个面向安全的轻型 `Linux` 发行版。它不同于通常 `Linux` 发行版,`Alpine` 采用了 `musl libc``busybox` 以减小系统的体积和运行时资源消耗,但功能上比 `busybox` 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,`Alpine` 还提供了自己的包管理工具 `apk`,可以通过 `https://pkgs.alpinelinux.org/packages` 网站上查询包信息,也可以直接通过 `apk` 命令直接查询和安装各种软件。
`Alpine` 由非商业组织维护的,支持广泛场景的 `Linux`发行版,它特别为资深/重度`Linux`用户而优化,关注安全,性能和资源效能。`Alpine` 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
`Alpine` Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。
目前 Docker 官方已开始推荐使用 `Alpine` 替代之前的 `Ubuntu` 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
下表是官方镜像的大小比较:
```sh
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
alpine latest 4e38e38c8ce0 4.799 MB
debian latest 4d6ce913b130 84.98 MB
ubuntu latest b39b81afc8ca 188.3 MB
centos latest 8efe422e6104 210 MB
```
### 获取并使用官方镜像
由于镜像很小,下载时间往往很短,读者可以直接使用 `docker run` 指令直接运行一个 `Alpine` 容器,并指定运行的 Linux 指令,例如:
```sh
$ docker run alpine echo '123'
123
```
笔者使用 time 工具来测试下在本地没有提前 pull 镜像情况下,执行 echo 命令的时间,仅需要 3 秒左右。
```sh
$ time docker run alpine echo '123'Unable to find image 'alpine:latest' locallylatest: Pulling from library/alpine
e110a4a17941: Pull completeDigest: sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73aStatus: Downloaded newer image for alpine:latest123
real 0m3.367s user 0m0.040s sys 0m0.007s
```
### 迁移至 `Alpine` 基础镜像
目前,大部分 Docker 官方镜像都已经支持 Alpine 作为基础镜像,可以很容易进行迁移。
例如:
* ubuntu/debian -> alpine
* python:2.7 -> python:2.7-alpine
* ruby:2.3 -> ruby:2.3-alpine
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 apk 包管理器替换 apt 工具,如
```sh
$ apk add --no-cache <package>
```
`Alpine` 中软件安装包的名字可能会与其他发行版有所不同,可以在 `https://pkgs.alpinelinux.org/packages` 网站搜索并确定安装包名称。如果需要的安装包不在主索引内,但是在测试或社区索引中。那么可以按照以下方法使用这些安装包。
```sh
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
$ apk --update add --no-cache <package>
```
### 相关资源
* `Apline` 官网:`http://alpinelinux.org/`
* `Apline` 官方仓库:`https://github.com/alpinelinux`
* `Apline` 官方镜像:`https://hub.docker.com/_/alpine/`
* `Apline` 官方镜像仓库:`https://github.com/gliderlabs/docker-alpine`

114
cases/os/busybox.md Normal file
View File

@@ -0,0 +1,114 @@
## Busybox
### 简介
![Busybox - Linux 瑞士军刀](_images/busybox-logo.png)
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 等)的精简工具箱,它只需要几 MB 的大小很方便进行各种快速验证被誉为“Linux 系统的瑞士军刀”。
BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux包括 Android、Hurd、FreeBSD 等。
### 获取官方镜像
在 Docker Hub 中搜索 busybox 相关的镜像。
```sh
$ docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 755 [OK]
progrium/busybox 63 [OK]
radial/busyboxplus Full-chain, Internet enabled, busybox made... 11 [OK]
odise/busybox-python 3 [OK]
multiarch/busybox multiarch ports of ubuntu-debootstrap 2 [OK]
azukiapp/busybox This image is meant to be used as the base... 2 [OK]
...
```
读者可以看到最受欢迎的镜像同时带有 OFFICIAL 标记,说明它是官方镜像。用户使用 docker pull 指令下载镜像 `busybox:latest`
```sh
$ docker pull busybox:latest
busybox:latest: The image you are pulling has been verified
e433a6c5b276: Pull complete
e72ac664f4f0: Pull complete
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
Status: Downloaded newer image for busybox:latest
```
下载后,可以看到 busybox 镜像只有2.433 MB
```sh
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest e72ac664f4f0 6 weeks ago 2.433 MB
```
### 运行 busybox
启动一个 busybox 容器,并在容器中执行 grep 命令。
```sh
$ docker run -it busybox
/ # grep
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.
Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...
Search for PATTERN in FILEs (or stdin)
-H Add 'filename:' prefix
-h Do not add 'filename:' prefix
-n Add 'line_no:' prefix
-l Show only names of files that match
-L Show only names of files that don't match
-c Show only count of matching lines
-o Show only the matching part of line
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
-v Select non-matching lines
-s Suppress open and read errors
-r Recurse
-i Ignore case
-w Match whole words only
-x Match whole lines only
-F PATTERN is a literal (not regexp)
-E PATTERN is an extended regexp
-m N Match up to N times per file
-A N Print N lines of trailing context
-B N Print N lines of leading context
-C N Same as '-A N -B N'
-e PTRN Pattern to match
-f FILE Read pattern from file
```
查看容器内的挂载信息。
```sh
/ # mount
rootfs on / type rootfs (rw)
none on / type aufs (rw,relatime,si=b455817946f8505c)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)
devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)
```
busybox 镜像虽然小巧,但包括了大量常见的 Linux 命令,读者可以用它快速熟悉 Linux 命令。
### 相关资源
* `Busybox` 官网:`https://busybox.net/`
* `Busybox` 官方仓库:`https://git.busybox.net/busybox/`
* `Busybox` 官方镜像:`https://hub.docker.com/_/busybox/`
* `Busybox` 官方仓库:`https://github.com/docker-library/busybox`

76
cases/os/centos.md Normal file
View File

@@ -0,0 +1,76 @@
## CentOS/Fedora
### CentOS 系统简介
CentOS 和 Fedora 都是基于 Redhat 的常见 Linux 分支。CentOS 是目前企业级服务器的常用操作系统Fedora 则主要面向个人桌面用户。
![CentOS 操作系统](_images/centos-logo.png)
CentOSCommunity Enterprise Operating System中文意思是社区企业操作系统它是基于 Red Hat Enterprise Linux 源代码编译而成。由于 CentOS 与 Redhat Linux 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 CentOS 来替代商业版 Red Hat Enterprise Linux。CentOS 自身不包含闭源软件。
#### 使用 CentOS 官方镜像
首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。
```sh
$ docker search -f stars=25 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official... 2543 [OK]
jdeathe/centos-ssh 27 [OK]
```
使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。
```sh
$ docker run -it centos bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3d8673bd162a: Pull complete
Digest: sha256:a66ffcb73930584413de83311ca11a4cb4938c9b2521d331026dad970c19adf4
Status: Downloaded newer image for centos:latest
[root@43eb3b194d48 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```
### Fedora 系统简介
![Fedora 操作系统](_images/fedora-logo.png)
Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 Red Hat 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 Red Hat Enterprise Linux中。
#### 使用 Fedora 官方镜像
首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。
```sh
$ docker search -f stars=2 fedora
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
fedora Official Docker builds of Fedora 433 [OK]
dockingbay/fedora-rust Trusted build of Rust programming language... 3 [OK]
gluster/gluster-fedora Official GlusterFS image [ Fedora 21 + Glu... 3 [OK]
startx/fedora Simple container used for all startx based... 2 [OK]
```
使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。
```sh
$ docker run -it fedora bash
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
2bf01635e2a0: Pull complete
Digest: sha256:64a02df6aac27d1200c2572fe4b9949f1970d05f74d367ce4af994ba5dc3669e
Status: Downloaded newer image for fedora:latest
[root@196ca341419b /]# cat /etc/redhat-release
Fedora release 24 (Twenty Four)
```
### 相关资源
* `Fedora` 官网:`https://getfedora.org/`
* `Fedora` 官方仓库:`https://github.com/fedora-infra`
* `Fedora` 官方镜像:`https://hub.docker.com/_/fedora/`
* `Fedora` 官方镜像仓库:`https://github.com/fedora-cloud/docker-brew-fedora`
* `CentOS` 官网:`https://getfedora.org/`
* `CentOS` 官方仓库:`https://github.com/CentOS`
* `CentOS` 官方镜像:`https://hub.docker.com/_/centos/`
* `CentOS` 官方镜像仓库:`https://github.com/CentOS/CentOS-Dockerfiles`

116
cases/os/coreos.md Normal file
View File

@@ -0,0 +1,116 @@
## CoreOS
### 简介
![CoreOS - 容器化操作系统](_images/coreos-logo.jpg)
CoreOS 是一个轻量级容器化 Linux 发行版专为数据中心场景而设计旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。CoreOS 作为 Docker 生态圈中的重要一员日益得到各大云服务商的重视。CoreOS 于 2014 年 7 月首次发布了稳定版本。
与其他历史悠久、使用广泛的 Linux 操作系统相比CoreOS 拥有下面几个优点。
* CoreOS 通过容器化Containerized的运算环境向应用程序提供运算资源。
传统类 Unix 系统往往提供包管理工具。随着系统安装更多的程序而程序的依赖要求各不相同这就容易出现“依赖地狱”Dependency Hell系统的更新和安装会非常痛苦。
CoreOS 的应用程序通过 Docker 运行在容器中,彼此之间共享系统内核和资源,同时互不可见。这种方式使得操作系统、应用程序及运行环境之间的耦合度大大降低。相对于传统的部署方式而言,运维可以更加灵活便捷的在 CoreOS 集群中部署应用程序,同时各运行环境之间的干扰更少,操作系统自身的维护也更加容易。
* CoreOS 采用双系统分区Dual Root Partition设计。
CoreOs 的两个分区在系统运行期间各司其职,它们分别被设置成主动模式和被动模式。主动分区负责系统运行,被动分区负责系统升级。一旦 CoreOS 发布了新版系统,运维只需下载一个完整的系统安装文件至被动分区,然后设置系统下一次重启时从新版本分区启动,将主、被动分区的职能进行调换即可。在 CoreOS 系统运行期间,系统分区被设置成只读状态,这样也确保了 CoreOS 的安全性。CoreOS 的升级过程在默认条件下将自动完成,并且通过 cgroup 对升级过程中使用到的网络和磁盘资源进行限制,这将系统升级所带来的影响降至最低。
* CoreOS 使用 Systemd 取代 SysV 作为系统和服务的管理工具。
与 SysV 相比Systemd 不仅可以更好的追踪系统进程还具备优秀的并行化处理能力。Systemd 将自己的按需启动的特性与 Docker 的快速启动能力相结合,在 CoreOS 集群中大规模部署 Docker Containers 的业务中优势明显。Systemd 引入了“target”的概念每个 target 应用于一个特定的服务,并且可以通过继承一个已有的 target 来扩展额外的功能,即操作系统对系统上运行的服务拥有更好的控制力。
CoreOS 团队还推出了很多有益的工具,包括 etcd, fleet, flannel 等。
安装 CoreOS 有几种方法,笔者推荐初学者使用 VMware Workstation 虚拟机方式来运行 CoreOS。VMware Workstation 工具则可以前往其官网`http://www.vmware.com/products/workstation/` 下载获取。
### 使用官方镜像
#### 获取虚拟机镜像
从官方网站下载 CoreOS 镜像,地址为 [https:\/\/coreos.com\/releases\/](http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware_insecure.zip)。
如果读者已经安装 VMware Workstation则解压镜像包后双击`vmx` 文件:
![虚拟机镜像文件](_images/coreos_list.png)
双击`vmx` 文件后,即可启动 CoreOS 虚拟机,如下图所示:
![启动 CoreOS 虚拟机](_images/vmware_coreos.png)
*注意:使用免费版 VMware Player 运行 CoreOS 官方镜像时,可能出现无法通过 DHCP 自动获取 IP 地址的问题,读者可配置静态地址或使用 VMware Workstation 来运行 `vmx` 文件。*
#### 获取地址信息
此时CoreOS 系统已经在 VMware Station 中启动,显示登录提示:
![登录 CoreOS](_images/coreos-login.png)
直接按回车键,获取当前系统的 IP 地址,如下图所示:
![获取 IP 地址](_images/coreos_run_ip.png)
如上图所示,查看此时 CoreOS 的 IP地址是`192.168.66.128`
#### 使用 SSH 客户端访问镜像
笔者以 Windows 环境为例,使用 SecureCRT 工具进行连接。此处读者需要确定:
* CoreOS 虚拟机的 IP地址
* CoreOS 虚拟机的文件目录下含有 `insecure_ssh_key` 公钥文件
打开 SecureCRT建立新的 SSH 连接,如下图示:
![使用 SecureCRT 访问 CoreOS](_images/coreos_crt.png)
点击 ` 属性` 按钮添加 `insecure_ssh_key` 公钥文件后,即可点击 `连接`
如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息:
```sh
$ docker version
```
结果如下图示:
![查看 Docker 版本信息](_images/docker_version.png)
此时CoreOS 虚拟机已经成功运行,并且读者可以使用 SSH 客户端方便的操作 CoreOS 虚拟机。 Docker 已经内置于 CoreOS 中,读者可以进行各种 Docker 操作,如下图示:
![使用 Docker 命令](_images/php_pulling.png)
如果读者的本机环境是 Linux 系统,读者可以使用 SSH 公钥(在解压后的根目录下),直接使用 `ssh` 命令连接 CoreOS 虚拟机,并使用 `ip a` 命令查看 IP 地址信息。
如下所示:
```sh
$ ssh -i ~/insecure_ssh_key core@192.168.6.153
CoreOS (alpha)
core@localhost ~ $ ls
core@localhost ~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
core@localhost ~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:ff:73:46 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.153/20 brd 192.168.15.255 scope global dynamic enp0s17
valid_lft 604500sec preferred_lft 604500sec
inet6 fe80::20c:29ff:feff:7346/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
core@localhost ~ $
```
### 相关资源
* `CoreOS` 官网:`https://coreos.com/`
* `CoreOS` 官方仓库:`https://github.com/coreos/`

170
cases/os/debian.md Normal file
View File

@@ -0,0 +1,170 @@
## Debian/Ubuntu
Debian 和 Ubuntu 都是目前较为流行的 Debian 系的服务器操作系统十分适合研发场景。Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
### Debian 系统简介
![Debian 操作系统](_images/debian-logo.png)
Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统由Debian 计划Debian Project组织维护。Debian 计划是一个独立的、分散的组织,由 3000 人志愿者组成接受世界多个非盈利组织的资金支持Software in the Public Interest 提供支持并持有商标作为保护机构。Debian 以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 Debian 包括了超过 25,000 个软件包并支持 12 个计算机系统结构。
Debian 作为一个大的系统组织框架,其下有多种不同操作系统核心的分支计划,主要为采用 Linux 核心的 Debian GNU/Linux 系统,其他还有采用 GNU Hurd 核心的 Debian GNU/Hurd 系统、采用 FreeBSD 核心的 Debian GNU/kFreeBSD 系统,以及采用 NetBSD 核心的 Debian GNU/NetBSD 系统。甚至还有利用 Debian 的系统架构和工具,采用 OpenSolaris 核心构建而成的 Nexenta OS 系统。在这些 Debian 系统中,以采用 Linux 核心的 Debian GNU/Linux 最为著名。
众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。
#### 使用 Debian 官方镜像
读者可以使用 docker search 搜索 Docker Hub查找 Debian 镜像:
```sh
$ docker search debian
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
debian Debian is... 1565 [OK]
neurodebian NeuroDebian... 26 [OK]
armbuild/debian port of debian 8 [OK]
...
```
官方提供了大家熟知的 debian 镜像以及面向科研领域的 neurodebian 镜像。
可以使用 docker run 直接运行 Debian 镜像。
```sh
$ docker run -it debian bash
root@668e178d8d69:/# cat /etc/issue
Debian GNU/Linux 8
```
Debian 镜像很适合作为基础镜像,构建自定义镜像。
### Ubuntu 系统简介
![Ubuntu 操作系统](_images/ubuntu-logo.jpg)
Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词官方译名“友帮拓”另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名。Ubuntu 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu 基于 Debian 发行版和 GNOME/Unity 桌面环境,与 Debian 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持Long Term SupportLTS版本一般支持 3 年时间。
#### 使用 Ubuntu 官方镜像
Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。
```sh
$ docker search -s 10 ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Official Ubuntu base image 840 [OK]
dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 30 [OK]
crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 20 [OK]
sylvainlasnier/memcached This is a Memcached 1.4.14 docker images b... 16 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 16 [OK]
mbentley/ubuntu-django-uwsgi-nginx 16 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 15 [OK]
clue/ttrss The Tiny Tiny RSS feed reader allows you t... 14 [OK]
dockerfile/ubuntu-desktop Trusted automated Ubuntu Desktop (LXDE) (h... 14 [OK]
tutum/ubuntu Ubuntu image with SSH access. For the root... 12 [OK]
```
*注意Docker 1.12 版本中已经不支持 --stars 参数,则可以使用 -f stars=N 参数。*
根据搜索出来的结果,读者可以自行选择下载镜像并使用。
下面以 ubuntu 14.04 为例,演示如何使用该镜像安装一些常用软件。
首先使用 `-ti` 参数启动容器,登录 bash查看 ubuntu 的发行版本号。
```sh
$ docker run -ti ubuntu:14.04 /bin/bash
root@7d93de07bf76:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
```
当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`
```sh
root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package curl
```
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。
```sh
root@7d93de07bf76:/# apt-get update
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Ign http://archive.ubuntu.com trusty-proposed InRelease
Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
...
```
首先,安装 curl 工具。
```sh
root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
ca-certificates krb5-locales libasn1-8-heimdal libcurl3 libgssapi-krb5-2
libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal
libheimntlm0-heimdal libhx509-5-heimdal libidn11 libk5crypto3 libkeyutils1
libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2
libroken18-heimdal librtmp0 libsasl2-2 libsasl2-modules libsasl2-modules-db
libwind0-heimdal openssl
...
root@7d93de07bf76:/# curl
curl: try 'curl --help' or 'curl --manual' for more information
```
接下来,再安装 apache 服务。
```sh
root@7d93de07bf76:/# apt-get install -y apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
apache2-bin apache2-data libapr1 libaprutil1 libaprutil1-dbd-sqlite3
libaprutil1-ldap libxml2 sgml-base ssl-cert xml-core
...
```
启动这个 apache 服务,然后使用 curl 来测试本地访问。
```
root@7d93de07bf76:/# service apache2 start
* Starting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
*
root@7d93de07bf76:/# curl 127.0.0.1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
Modified from the Debian original for Ubuntu
Last updated: 2014-03-19
See: https://launchpad.net/bugs/1288690
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache2 Ubuntu Default Page: It works</title>
<style type="text/css" media="screen">
...
```
配合使用 `-p` 参数对外映射服务端口,可以允许容器外来访问该服务。
### 相关资源
* `Debian` 官网:`https://www.debian.org/`
* `Neuro Debian` 官网:`http://neuro.debian.net/`
* `Debian` 官方仓库:`https://github.com/Debian`
* `Debian` 官方镜像:`https://hub.docker.com/_/debian/`
* `Debian` 官方镜像仓库:`https://github.com/tianon/docker-brew-debian/`
* `Ubuntu` 官网:`http://www.ubuntu.org.cn/global`
* `Ubuntu` 官方仓库:`https://github.com/ubuntu`
* `Ubuntu` 官方镜像:`https://hub.docker.com/_/ubuntu/`
* `Ubuntu` 官方镜像仓库:`https://github.com/tianon/docker-brew-ubuntu-core`

3
cases/os/devops_cases.md Normal file
View File

@@ -0,0 +1,3 @@
docker_book
===========
Internal usage.

12
cases/os/summary.md Normal file
View File

@@ -0,0 +1,12 @@
# 本章小结
本章讲解了典型操作系统镜像的下载和使用。
除了官方的镜像外,在 DockerHub 上还有许多第三方组织或个人上传的 Docker 镜像。
读者可以根据具体情况来选择。一般来说:
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行定制化。
* 个别第三方(如 tutum已被 Docker 收购)镜像质量也非常高。这些镜像通常针对某个具体应用进行配置,比如:包含 LAMP 组件的 Ubuntu 镜像。
* 处于安全考虑,几乎所有官方制作的镜像都没有安装 SSH 服务,无法使用用户名和密码直接登录。
后续章节中,笔者将介绍如何创建一个带 SSH 服务的 Docker 镜像。

View File

@@ -1,66 +0,0 @@
## 使用 Supervisor 来管理进程
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。
本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用 ssh 和 apache 服务。
### 配置
首先创建一个 Dockerfile内容和各部分的解释如下。
```
FROM ubuntu:13.04
MAINTAINER examples@docker.com
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get upgrade -y
```
### 安装 ssh、apache 和 supervisor
```
RUN apt-get install -y --force-yes perl-base=5.14.2-6ubuntu2
RUN apt-get install -y apache2.2-common
RUN apt-get install -y openssh-server apache2 supervisor
RUN mkdir -p /var/run/sshd
RUN mkdir -p /var/log/supervisor
```
这里安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运行所需要的目录。
```
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
```
添加 supervisord 的配置文件,并复制配置文件到对应目录下面。
```
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
```
这里我们映射了 22 和 80 端口,使用 supervisord 的可执行路径启动服务。
### supervisor配置文件内容
```
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
```
配置文件包含目录和进程,第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。
### 使用方法
创建镜像。
```
$ sudo docker build -t test/supervisord .
```
启动 supervisor 容器。
```
$ sudo docker run -p 22 -p 80 -t -i test/supervisord
2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file)
2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
2013-11-25 18:53:22,342 INFO supervisord started with pid 1
2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
```
使用 `docker run` 来启动我们创建的容器。使用多个 `-p` 来映射多个端口,这样我们就能同时访问 ssh 和 apache 服务了。
可以使用这个方法创建一个只有 ssh 服务的基础镜像,之后创建镜像可以使用这个镜像为基础来创建

View File

@@ -1,85 +0,0 @@
## 创建 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 项
```
[supervisord]
nodaemon=true
[program:tomcat]
command=/opt/apache-tomcat/bin/startup.sh
[program:sshd]
command=/usr/sbin/sshd -D
```
```
docker commit ac6474aeb31d tomcat
```
新建 tomcat 文件夹,新建 Dockerfile。
```
FROM mk_tomcat
EXPOSE 22 8080
CMD ["/usr/bin/supervisord"]
```
根据 Dockerfile 创建镜像。
```
docker build tomcat tomcat
```
### 安装 weblogic 镜像
步骤和 tomcat 基本一致,这里贴一下配置文件
```
supervisor.conf
[supervisord]
nodaemon=true
[program:weblogic]
command=/opt/Middleware/user_projects/domains/base_domain/bin/startWebLogic.sh
[program:sshd]
command=/usr/sbin/sshd -D
dockerfile
FROM weblogic
EXPOSE 22 7001
CMD ["/usr/bin/supervisord"]
```
### tomcat/weblogic 镜像的使用
#### 存储的使用
在启动的时候,使用 `-v` 参数
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
将本地磁盘映射到容器内部,它在主机和容器之间是实时变化的,所以我们更新程序、上传代码只需要更新物理主机的目录就可以了
#### 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 的集群,同步等概念
* 部署一个集群应用程序,只需要安装一次应用到集群上即可
缺点是:
* 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 来做负载均衡就可以完成配置了

5
cloud/README.md Normal file
View File

@@ -0,0 +1,5 @@
# 容器与云计算
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
除了 AWS、Google、Azure、Docker 官方云服务等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和容器服务,甚至还专门推出了容器云业务。

BIN
cloud/_images/ECS.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
cloud/_images/aws-logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

10
cloud/alicloud.md Normal file
View File

@@ -0,0 +1,10 @@
## 阿里云
![阿里云](_images/aliyun-logo.png)
阿里云创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
阿里云的客户群体中,活跃着微博、知乎、魅族、锤子科技、小咖秀等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
阿里云容器服务提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。

13
cloud/aws.md Normal file
View File

@@ -0,0 +1,13 @@
## 亚马逊云
![AWS](_images/aws-logo.jpg)
AWS即 Amazon Web Services是亚马逊Amazon公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务使用户几乎能够在云中运行一切应用程序从企业应用程序和大数据项目到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT 投入成本和维护成本。
自 2006 年初起,亚马逊 AWS 开始在云中为各种规模的公司提供技术服务平台。利用亚马逊 AWS软件开发人员可以轻松购买计算、存储、数据库和其他基于 Internet 的服务来支持其应用程序。开发人员能够灵活选择任何开发平台或编程环境,以便于其尝试解决问题。由于开发人员只需按使用量付费,无需前期资本支出,亚马逊 AWS 是向最终用户交付计算资源、保存的数据和其他应用程序的一种经济划算的方式。
2015 年 AWS 正式发布了 EC2 容器服务(ECS)。ECS 的目的是让 Docker 容器变的更加简单它提供了一个集群和编排的层用来控制主机上的容器部署以及部署之后的集群内的容器的生命周期管理。ECS 是诸如 Docker Swarm、Kubernetes、Mesos 等工具的替代,它们工作在同一个层,除了作为一个服务来提供。这些工具和 ECS 不同的地方在于,前者需要用户自己来部署和管理,而 ECS 是“作为服务”来提供的。
![AWS 容器服务](_images/ECS.jpg)

7
cloud/intro.md Normal file
View File

@@ -0,0 +1,7 @@
## 简介
目前与容器相关的云计算主要分为两种类型。
一种是传统的 IaaS 服务商提供对容器相关的服务,包括镜像下载、容器托管等。
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a ServiceCaaS

12
cloud/qcloud.md Normal file
View File

@@ -0,0 +1,12 @@
## 腾讯云
![腾讯云](_images/qcloud-logo.jpg)
腾讯云在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
具体包括云服务器、云存储、云数据库和弹性 web 引擎等基础云服务腾讯云分析MTA、腾讯云推送信鸽等腾讯整体大数据能力以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
腾讯云容器服务是高度可扩展的高性能容器管理服务用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务将无需安装、运维、扩展用户的集群管理基础设施只需进行简单的API调用便可启动和停止Docker应用程序查询集群的完整状态以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放满足业务或应用程序的特定要求。
*腾讯云已有用户或新用户都可以 [通过这里](http://partners.qcloud.com/invitation/25297829205816a19c316c6),在不做任何迁移的前提下,获得腾讯云服务的额外支持和大客户专享价格。*

12
cloud/summary.md Normal file
View File

@@ -0,0 +1,12 @@
## 本章小结
本章介绍了公有云服务对 Docker 的积极支持,以及新出现的容器云平台。
事实上Docker 技术的出现自身就极大推动了云计算行业的发展。
通过整合公有云的虚拟机和 Docker 方式,可能获得更多的好处,包括
* 更快速的持续交付和部署能力;
* 利用内核级虚拟化,对公有云中服务器资源进行更加高效地利用;
* 利用公有云和 Docker 的特性更加方便的迁移和扩展应用。
同时,容器将作为与虚拟机类似的业务直接提供给用户使用,极大的丰富了应用开发和部署的场景。

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,142 +1,234 @@
## Compose 命令说明
大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,命令则应用在项目所有的服务上。
### 命令对象与格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
执行 `docker-compose [COMMAND] --help` 查看具体某个命令的使用说明
执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式
基本的使用格式是
```bash
docker-compose [options] [COMMAND] [ARGS...]
Compose 命令的基本的使用格式是
```sh
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
```
## 选项
### 命令选项
* `-f, --file FILE` 指定使用的 Compose 模板文件,默认为 `docker-compose.yml`,可以多次指定。
* `-p, --project-name NAME` 指定项目名称,默认将使用所在目录名称作为项目名。
* `--x-networking` 使用 Docker 的可拔插网络后端特性(需要 Docker 1.9 及以后版本)。
* `--x-network-driver DRIVER` 指定网络后端的驱动,默认为 `bridge`(需要 Docker 1.9 及以后版本)。
* `--verbose` 输出更多调试信息。
* `--version` 打印版本并退出。
* `-f, --file FILE` 使用特定的 compose 模板文件,默认为 `docker-compose.yml`
* `-p, --project-name NAME` 指定项目名称,默认使用目录名称。
* `-v, --version` 打印版本并退出。
## 命令
### 命令使用说明
### `build`
#### `build`
格式为 `docker-compose build [options] [SERVICE...]`
构建重新构建服务
构建重新构建)项目中的服务容器
服务一旦构建后,将会带上一个标记名,例如 web_db。
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。
可以随时在项目目录下运行 `docker-compose build` 来重新构建服务。
### `help`
选项包括:
* `--force-rm` 删除构建过程中的临时容器。
* `--no-cache` 构建镜像过程中不使用 cache这将加长构建过程
* `--pull` 始终尝试通过 pull 来获取更新版本的镜像。
#### `help`
获得一个命令的帮助。
### `kill`
#### `kill`
格式为 `docker-compose kill [options] [SERVICE...]`
通过发送 `SIGKILL` 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如
```bash
通过发送 `SIGKILL` 信号来强制停止服务容器。
支持通过 `-s` 参数来指定发送的信号,例如通过如下指令发送 `SIGINT` 信号。
```sh
$ docker-compose kill -s SIGINT
```
### `logs`
#### `logs`
格式为 `docker-compose logs [options] [SERVICE...]`
查看服务的输出。
查看服务容器的输出。默认情况下docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
### `port`
该命令在调试问题的时候十分有用。
打印绑定的公共端口。
#### `pause`
格式为 `docker-compose pause [SERVICE...]`
### `ps`
暂停一个服务容器。
列出所有容器。
#### `port`
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`
### `pull`
打印某个容器端口所映射的公共端口。
拉取服务镜像。
选项:
### `rm`
* `--protocol=proto` 指定端口协议tcp默认值或者 udp。
* `--index=index` 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1
删除停止的服务容器。
#### `ps`
格式为 `docker-compose ps [options] [SERVICE...]`
### `run`
列出项目中目前的所有容器。
在一个服务上执行一个命令。
选项:
* `-q` 只打印容器的 ID 信息。
#### `pull`
格式为 `docker-compose pull [options] [SERVICE...]`
拉取服务依赖的镜像。
选项:
* `--ignore-pull-failures` 忽略拉取镜像过程中的错误。
#### `restart`
格式为 `docker-compose restart [options] [SERVICE...]`
重启项目中的服务。
选项:
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时(默认为 10 秒)。
#### `rm`
格式为 `docker-compose rm [options] [SERVICE...]`
删除所有(停止状态的)服务容器。推荐先执行 `docker-compose stop` 命令来停止容器。
选项:
* `-f, --force` 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
* `-v` 删除容器所挂载的数据卷。
#### `run`
格式为 `docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`
在指定服务上执行一个命令。
例如:
```
```sh
$ docker-compose run ubuntu ping docker.com
```
将会启动一个 ubuntu 服务执行 `ping docker.com` 命令。
将会启动一个 ubuntu 服务容器,并执行 `ping docker.com` 命令。
默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。
默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照配置自动创建。
两个不同点:
* 给定命令将会覆盖原有的自动运行命令;
* 不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 `--no-deps` 选项,例如
```
```sh
$ docker-compose run --no-deps web python manage.py shell
```
将不会启动 web 容器所关联的其它容器。
### `scale`
选项:
设置同一个服务运行容器个数
* `-d` 后台运行容器。
* `--name NAME` 为容器指定一个名字。
* `--entrypoint CMD` 覆盖默认的容器启动指令。
* `-e KEY=VAL` 设置环境变量值,可多次使用选项来设置多个环境变量。
* `-u, --user=""` 指定运行容器的用户名或者 uid。
* `--no-deps` 不自动启动关联的服务容器。
* `--rm` 运行命令后自动删除容器,`d` 模式下将忽略。
* `-p, --publish=[]` 映射容器端口到本地主机。
* `--service-ports` 配置服务端口并映射到本地主机。
* `-T` 不分配伪 tty意味着依赖 tty 的指令将无法运行。
#### `scale`
格式为 `docker-compose scale [options] [SERVICE=NUM...]`
设置指定服务运行的容器个数。
通过 `service=num` 的参数来设置数量。例如:
```
$ docker-compose scale web=2 worker=3
```sh
$ docker-compose scale web=3 db=2
```
### `start`
将启动 3 个容器运行 web 服务2 个容器运行 db 服务。
启动一个已经存在的服务容器。
一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器;反之,将停止容器。
### `stop`
选项:
停止一个已经运行的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)
### `up`
#### `start`
格式为 `docker-compose start [SERVICE...]`
构建,(重新)创建,启动,链接一个服务相关的容器。
启动已经存在的服务容器。
链接的服务都将会启动,除非他们已经运行。
#### `stop`
格式为 `docker-compose stop [options] [SERVICE...]`
默认情况, `docker-compose up` 将会整合所有容器的输出,并且退出时,所有容器将会停止
停止已经处于运行状态的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器
如果使用 `docker-compose up -d` ,将会在后台启动并运行所有的容器。
选项:
默认情况,如果该服务的容器已经存在, `docker-compose up` 将会停止并尝试重新创建他们(保持使用 `volumes-from` 挂载的卷),以保证 `docker-compose.yml` 的修改生效。如果你不想容器被停止并重新创建,可以使用 `docker-compose up --no-recreate`。如果需要的话,这样将会启动已经停止容器。
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)
## 环境变量
#### `unpause`
格式为 `docker-compose unpause [SERVICE...]`
环境变量可以用来配置 Compose 的行为
恢复处于暂停状态中的服务
`DOCKER_`开头的变量和用来配置 Docker 命令行客户端的使用一样。如果使用 boot2docker , `$(boot2docker shellinit)` 将会设置它们为正确的值。
#### `up`
格式为 `docker-compose up [options] [SERVICE...]`
### `COMPOSE_PROJECT_NAME`
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
设置通过 Compose 启动的每一个容器前添加的项目名称,默认是当前工作目录的名字
链接的服务都将会被自动启动,除非已经处于运行状态
### `COMPOSE_FILE`
可以说,大部分时候都可以直接通过该命令来启动一个项目。
设置要使用的 `docker-compose.yml` 的路径。默认路径是当前工作目录
默认情况,`docker-compose up` 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试
### `DOCKER_HOST`
当通过 `Ctrl-C` 停止命令时,所有容器将会停止。
设置 Docker daemon 的地址。默认使用 `unix:///var/run/docker.sock`,与 Docker 客户端采用的默认值一致
如果使用 `docker-compose up -d`,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项
### `DOCKER_TLS_VERIFY`
默认情况,如果服务容器已经存在,`docker-compose up` 将会尝试停止容器,然后重新创建(保持使用 `volumes-from` 挂载的卷),以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 `docker-compose up --no-recreate`。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 `docker-compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
如果设置不为空,则与 Docker daemon 交互通过 TLS 进行。
选项:
### `DOCKER_CERT_PATH`
* `-d` 在后台运行服务容器。
* `--no-color` 不使用颜色来区分不同的服务的控制台输出。
* `--no-deps` 不启动服务所链接的容器。
* `--force-recreate` 强制重新创建容器,不能与 `--no-recreate` 同时使用。
* `--no-recreate` 如果容器已经存在了,则不重新创建,不能与 `--force-recreate` 同时使用。
* `--no-build` 不自动构建缺失的服务镜像。
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
配置 TLS 通信所需要的验证(`ca.pem``cert.pem``key.pem`)文件的路径,默认是 `~/.docker`
#### `migrate-to-labels`
格式为 `docker-compose migrate-to-labels`
重新创建容器,并添加 label。
主要用于升级 1.2 及更早版本中创建的容器,添加缺失的容器标签。
实际上,最彻底的办法当然是删除项目,然后重新创建。
#### `version`
格式为 `docker-compose version`
打印版本信息。

View File

@@ -44,17 +44,17 @@ web:
现在我们就可以使用 `docker-compose run` 命令启动一个 Django 应用了。
```
$ docker-compose run web django-admin.py startproject docker-composeexample .
$ docker-compose run web django-admin.py startproject django_example .
```
Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject docker-composeexample . ` 指令。
Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject django_example . ` 指令。
这将在当前目录生成一个 Django 应用。
```
$ ls
Dockerfile docker-compose.yml docker-composeexample manage.py requirements.txt
Dockerfile docker-compose.yml django_example manage.py requirements.txt
```
首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `docker-composeexample/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。
首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。
```
DATABASES = {
@@ -82,7 +82,7 @@ myapp_web_1 | Validating models...
myapp_web_1 |
myapp_web_1 | 0 errors found
myapp_web_1 | January 27, 2014 - 12:12:40
myapp_web_1 | Django version 1.6.1, using settings 'docker-composeexample.settings'
myapp_web_1 | Django version 1.6.1, using settings 'django_example.settings'
myapp_web_1 | Starting development server at http://0.0.0.0:8000/
myapp_web_1 | Quit the server with CONTROL-C.
```

View File

@@ -1,63 +1,164 @@
## 安装
## 安装与卸载
安装 Compose 之前,要先安装 Docker在此不再赘述
Compose 目前支持 Linux 和 Mac OS 平台,两者的安装过程大同小异
安装 Compose 之前,要先安装 Docker需要 Docker Engine 1.7.1+),请参考第一部分中章节,在此不再赘述。
Compose 可以通过 Python 的 pip 工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
### PIP 安装
这种方式最为推荐
这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装
执行命令
```bash
执行安装命令
```sh
$ sudo pip install -U docker-compose
```
可以看到类似如下输出,说明安装成功。
```sh
Collecting docker-compose
Downloading docker-compose-1.8.0.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
```
安装成功后,可以查看 `docker-compose` 命令的用法。
```bash
```sh
$ docker-compose -h
Fast, isolated development environments using Docker.
Define and run multi-container applications with Docker.
Usage:
docker-compose [options] [COMMAND] [ARGS...]
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
--verbose Show more output
--version Print version and exit
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--x-networking (EXPERIMENTAL) Use new Docker networking functionality.
Requires Docker 1.9 or later.
--x-network-driver DRIVER (EXPERIMENTAL) Specify a network driver (default: "bridge").
Requires Docker 1.9 or later.
--verbose Show more output
-v, --version Print version and exit
Commands:
build Build or rebuild services
help Get help on a command
kill Kill containers
logs View output from containers
port Print the public port for a port binding
ps List containers
pull Pulls service images
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
restart Restart services
up Create and start containers
build Build or rebuild services
help Get help on a command
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pulls service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
unpause Unpause services
up Create and start containers
migrate-to-labels Recreate containers to add labels
version Show the Docker-Compose version information
```
之后,可以添加 bash 补全命令。
```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/1.2.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```sh
$ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```
### 二进制包
发布的二进制包可以在 [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 找到。
官方定义编译好二进制包,供大家使用。这些发布的二进制包可以在 [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 页面找到。
下载后直接放到执行路径即可。
这些二进制文件,下载后直接放到执行路径下,并添加执行权限即可。
例如,在常见的 Linux 平台上。
例如,在 Linux 平台上。
```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose
```
可以使用 `docker-compose version` 命令来查看版本信息,以测试是否安装成功。
```sh
$ docker-compose version
docker-compose version 1.8.0, build 94f7016
docker-py version: 1.9.0
CPython version: 2.7.6
OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014
```
### 容器中执行
Compose 既然是一个 Python 应用,自然也可以直接用容器来执行它。
```sh
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```
实际上,查看下载的 `run.sh` 脚本内容,如下
```sh
set -e
VERSION="1.8.0"
IMAGE="docker/compose:$VERSION"
# Setup options for connecting to docker host
if [ -z "$DOCKER_HOST" ]; then
DOCKER_HOST="/var/run/docker.sock"
fi
if [ -S "$DOCKER_HOST" ]; then
DOCKER_ADDR="-v $DOCKER_HOST:$DOCKER_HOST -e DOCKER_HOST"
else
DOCKER_ADDR="-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH"
fi
# Setup volume mounts for compose config and context
if [ "$(pwd)" != '/' ]; then
VOLUMES="-v $(pwd):$(pwd)"
fi
if [ -n "$COMPOSE_FILE" ]; then
compose_dir=$(dirname $COMPOSE_FILE)
fi
# TODO: also check --file argument
if [ -n "$compose_dir" ]; then
VOLUMES="$VOLUMES -v $compose_dir:$compose_dir"
fi
if [ -n "$HOME" ]; then
VOLUMES="$VOLUMES -v $HOME:$HOME -v $HOME:/root" # mount $HOME in /root to share docker.config
fi
# Only allocate tty if we detect one
if [ -t 1 ]; then
DOCKER_RUN_OPTIONS="-t"
fi
if [ -t 0 ]; then
DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -i"
fi
exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"
```
可以看到,它其实是下载了 `docker/compose` 镜像并运行。
### 卸载
如果是二进制包方式安装的,删除二进制文件即可。
```sh
$ sudo rm /usr/local/bin/docker-compose
```
如果是通过 python pip 工具安装的,则可以执行如下命令删除。
```sh
$ sudo pip uninstall docker-compose
```

View File

@@ -1,10 +1,22 @@
## 简介
Compose 项目目前在 [Github](https://github.com/docker/compose) 上进行维护,目前最新版本是 1.2.0。
## Compose 简介
Compose 定位是“defining and running complex applications with Docker”前身是 Fig兼容 Fig 的模板文件。
![Docker Compose 项目](_images/docker_compose.jpg)
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板YAML 格式)中定义一组相关联的应用容器(被称为一个 `project`,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似
![](../_images/docker_compose.jpg)
其代码目前在 [https://github.com/docker/compose](https://github.com/docker/compose) 上开源。
该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现
Compose 定位是 “定义和运行多个 Docker 容器的应用Defining and running multi-container Docker applications其前身是开源项目 Fig目前仍然兼容 Fig 格式的模板文件
通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件YAML 格式来定义一组相关联的应用容器为一个项目project
Compose 中有两个重要的概念:
* 服务service一个应用的容器实际上可以包括若干运行相同镜像的容器实例。
* 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API就可以在其上利用 Compose 来进行编排管理。

View File

@@ -13,7 +13,7 @@
创建一个 `compose-haproxy-web` 目录,作为项目工作目录,并在其中分别创建两个子目录:`haproxy``web`
### Web 子目录
### web 子目录
这里用 Python 程序来提供一个简单的 HTTP 服务,打印出访问者的 IP 和 实际的本地 IP。
@@ -62,7 +62,7 @@ class HandlerClass(SimpleHTTPRequestHandler):
del request[addr_pair]
request[addr_pair]=[num,ts]
file=open("index.html", "w")
file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\" face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></center>");
file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\" face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></center>")
for pair in request:
if pair[0] == host:
guest = "LOCAL: "+pair[0]
@@ -72,7 +72,7 @@ class HandlerClass(SimpleHTTPRequestHandler):
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"red\">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color=\"blue\">"+guest+"</font>&gt to WebServer &lt<font color=\"blue\">"+pair[1]+"</font>&gt</p>")
else:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color=\"navy\">"+guest+"</font>&gt to WebServer &lt<font color=\"navy\">"+pair[1]+"</font>&gt</p>")
file.write("</body> </html>");
file.write("</body> </html>")
file.close()
pickle.dump(request,open("pickle_data.txt","w"))

View File

@@ -1,144 +1,143 @@
## YAML 模板文件
## Compose 模板文件
默认的模板文件是 `docker-compose.yml`,其中定义的每个服务都必须通过 `image` 指令指定镜像或 `build` 指令(需要 Dockerfile来自动构建
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的
其它大部分指令都跟 `docker run` 中的类似
默认的模板文件名称为 `docker-compose.yml`,格式为 YAML 格式
在旧版本(版本 1其中每个顶级元素为服务名称次级元素为服务容器的配置信息例如
```yaml
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
```
版本 2 扩展了 Compose 的语法,同时尽量保持跟版本 1 的兼容,除了可以声明网络和存储信息外,最大的不同一是添加了版本信息,另一个是需要将所有的服务放到 `services` 根下面。
例如,上面例子改写为版本 2内容为
```yaml
version: "2"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
```
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令(需要 Dockerfile等来自动构建生成镜像。
如果使用 `build` 指令,在 `Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV` 等) 将会自动被获取,无需在 `docker-compose.yml` 中再次设置。
### `image`
指定为镜像名称或镜像 ID。如果镜像在本地不存在`Compose` 将会尝试拉去这个镜像。
例如:
```bash
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
```
下面分别介绍各个指令的用法。
### `build`
指定 `Dockerfile` 所在文件夹的路径。 `Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。
指定 `Dockerfile` 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)`Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。
```
build: /path/to/build/dir
```
### `cap_add, cap_drop`
指定容器的内核能力capacity分配。
例如,让容器拥有所有能力可以指定为:
```yml
cap_add:
- ALL
```
去掉 NET_ADMIN 能力可以指定为:
```yml
cap_drop:
- NET_ADMIN
```
### `command`
覆盖容器启动后默认执行的命令。
```bash
command: bundle exec thin -p 3000
```sh
command: echo "hello world"
```
### `links`
### `cgroup_parent`
指定父 cgroup 组,意味着将继承该组的资源限制。
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `SERVICE:ALIAS` 格式都可以
例如,创建了一个 cgroup 组名称为 `cgroups_1`
```bash
links:
- db
- db:database
- redis
```yml
cgroup_parent: cgroups_1
```
使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如:
### `container_name`
指定容器名称。默认将会使用 `项目名称_服务名称_序号` 这样的格式。
```bash
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
例如:
```yml
container_name: docker-web-container
```
相应的环境变量也将被创建
需要注意指定容器名称后该服务将无法进行扩展scale因为 Docker 不允许多个容器具有相同的名称
### `external_links`
链接到 docker-compose.yml 外部的容器,甚至 并非 `Compose` 管理的容器。参数格式跟 `links` 类似
### `devices`
指定设备映射关系
```
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
例如:
```yml
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
```
### `dns`
### `ports`
自定义 DNS 服务器。可以是一个值,也可以是一个列表。
暴露端口信息。
使用宿主:容器 `HOST:CONTAINER`格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
```
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
```sh
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
```
*注:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 `YAML` 将会解析 `xx:yy` 这种数字格式为 60 进制。所以建议采用字符串格式。*
### `dns_search`
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
### `expose`
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数
```bash
expose:
- "3000"
- "8000"
```sh
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
```
### `volumes`
### `dockerfile`
如果需要指定额外的编译镜像的 Dockefile 文件,可以通过该指令来指定。
卷挂载路径设置。可以设置宿主机路径 `HOST:CONTAINER` 或加上访问模式 `HOST:CONTAINER:ro`)。
```bash
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
例如
```yml
dockerfile: Dockerfile-alternate
```
### `volumes_from`
从另一个服务或容器挂载它的所有卷。
```bash
volumes_from:
- service_name
- container_name
```
### `environment`
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
```
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
```
注意,该指令不能跟 `image` 同时使用,否则 Compose 将不知道根据哪个指令来生成最终的服务镜像。
### `env_file`
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 `docker-compose -f FILE` 指定了模板文件,则 `env_file` 中路径会基于模板文件路径。
如果通过 `docker-compose -f FILE` 方式来指定 Compose 模板文件,则 `env_file`变量的路径会基于模板文件路径。
如果有变量名称与 `environment` 指令冲突,则以后者为准。
如果有变量名称与 `environment` 指令冲突,则按照惯例,以后者为准。
```bash
```sh
env_file: .env
env_file:
@@ -149,14 +148,59 @@ env_file:
环境变量文件中每一行必须符合格式,支持 `#` 开头的注释行。
```bash
# common.env: Set Rails/Rack environment
RACK_ENV=development
```sh
# common.env: Set development environment
PROG_ENV=development
```
### `environment`
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
例如
```yml
environment:
RACK_ENV: development
SESSION_SECRET:
```
或者
```yml
environment:
- RACK_ENV=development
- SESSION_SECRET
```
注意,如果变量名称或者值中用到 `true|falseyes|no` 等表达布尔含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。
`http://yaml.org/type/bool.html` 中给出了这些特定词汇,包括
```sh
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
```
### `expose`
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数
```sh
expose:
- "3000"
- "8000"
```
### `extends`
基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 `common.yml`
```bash
基于其它模板文件进行扩展
例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 `common.yml`
```sh
# common.yml
webapp:
build: ./webapp
@@ -165,8 +209,8 @@ webapp:
- SEND_EMAILS=false
```
编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。
```bash
编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。
```sh
# development.yml
web:
extends:
@@ -181,14 +225,108 @@ web:
db:
image: postgres
```
后者会自动继承 common.yml 中的 webapp 服务及相关环节变量
后者会自动继承 common.yml 中的 webapp 服务及环境变量定义
使用 extends 需要注意:
* 要避免出现循环依赖,例如 `A 依赖 BB 依赖 CC 反过来依赖 A` 的情况。
* extends 不会继承 links 和 volumes_from 中定义的容器和数据卷资源。
一般的,推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息。
### `external_links`
链接到 docker-compose.yml 外部的容器,甚至 并非 `Compose` 管理的外部容器。参数格式跟 `links` 类似。
```
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
```
### `extra_hosts`
类似 Docker 中的 `--add-host` 参数,指定额外的 host 名称映射信息。
例如:
```yml
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
```
会在启动后的服务容器中 `/etc/hosts` 文件中添加如下两条条目。
```sh
8.8.8.8 googledns
52.1.157.61 dockerhub
```
### `image`
指定为镜像名称或镜像 ID。如果镜像在本地不存在`Compose` 将会尝试拉去这个镜像。
例如:
```sh
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
```
### `labels`
为容器添加 Docker 元数据metadata信息。例如可以为容器添加辅助说明信息。
```yml
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
```
### `links`
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `SERVICE:ALIAS` 格式都可以。
```sh
links:
- db
- db:database
- redis
```
使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如:
```sh
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
```
被链接容器中相应的环境变量也将被创建。
### `log_driver`
类似 Docker 中的 `--log-driver` 参数,指定日志驱动类型。
目前支持三种日志驱动类型。
```yml
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
```
### `log_opt`
日志驱动的相关参数。
例如
```yml
log_driver: "syslog"
log_opt:
syslog-address: "tcp://192.168.0.42:123"
```
### `net`
设置网络模式。使用和 `docker client``--net` 参数一样的值。
```bash
```sh
net: "bridge"
net: "none"
net: "container:[name or id]"
@@ -196,64 +334,163 @@ net: "host"
```
### `pid`
跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
```bash
```sh
pid: "host"
```
### `dns`
配置 DNS 服务器。可以是一个值,也可以是一个列表。
### `ports`
```bash
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
```
暴露端口信息。
### `cap_add, cap_drop`
添加或放弃容器的 Linux 能力Capabiliity
```bash
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
```
### `dns_search`
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
```bash
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
```
### `working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares`
这些都是和 `docker run` 支持的选项类似。
使用宿主:容器 `HOST:CONTAINER`格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
```
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
```
*注意:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 `YAML` 会自动解析 `xx:yy` 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。*
### `security_opt`
指定容器模板标签label机制的默认属性用户、角色、类型、级别等
例如配置标签的用户名和角色名。
```yml
security_opt:
- label:user:USER
- label:role:ROLE
```
### `ulimits`
指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535指定文件句柄数为 20000软限制应用可以随时修改不能超过硬限制 和 40000系统硬限制只能 root 用户提高)。
```yml
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
```
### `volumes`
数据卷所挂载路径设置。可以设置宿主机路径 `HOST:CONTAINER` 或加上访问模式 `HOST:CONTAINER:ro`)。
该指令中路径支持相对路径。例如
```yml
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
```
### `volumes_driver`
较新版本的 Docker 支持数据卷的插件驱动。
用户可以先使用第三方驱动创建一个数据卷,然后使用名称来访问它。
此时,可以通过 `volumes_driver` 来指定驱动。
```yml
volume_driver: mydriver
```
### `volumes_from`
从另一个服务或容器挂载它的数据卷。
```sh
volumes_from:
- service_name
- container_name
```
### 其它指令
此外,还有包括 `cpu_shares, cpuset, domainname, entrypoint, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, stdin_open, tty, user, working_dir` 等指令,基本跟 docker-run 中对应参数的功能一致。
例如,指定使用 cpu 核 0 和 核 1只用 50% 的 CPU 资源:
```yml
cpu_shares: 73
cpuset: 0,1
```
working_dir: /code
指定服务容器启动后执行的命令。
```yml
entrypoint: /code/entrypoint.sh
user: postgresql
```
hostname: foo
domainname: foo.com
指定容器中运行应用的用户名。
```yml
user: nginx
```
mem_limit: 1000000000
指定容器中工作目录。
```yml
working_dir: /code
```
指定容器中搜索域名、主机名、mac 地址等。
```yml
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
```
指定容器中
```yml
ipc: host
```
指定容器中内存和内存交换区限制都为 1G。
```yml
mem_limit: 1g
memswap_limit: 1g
```
允许容器中运行一些特权命令。
```yml
privileged: true
```
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 `always` 或者 `unless-stopped`
```yml
restart: always
```
以只读模式挂载容器的 root 文件系统,意味着不能对容器内容进行修改。
```yml
read_only: true
```
打开标准输入,可以接受外部输入。
```yml
stdin_open: true
```
模拟一个假的远程控制台。
```yml
tty: true
```
### 读取环境变量
从 1.5.0 版本开始Compose 模板文件支持动态读取主机的系统环境变量。
例如,下面的 Compose 文件将从运行它的环境中读取变量 ${MONGO_VERSION} 的值,并写入执行的指令中。
```yml
db:
image: "mongo:${MONGO_VERSION}"
```
如果执行 `MONGO_VERSION=3.0 docker-compose up` 则会启动一个 `mongo:3.2` 镜像的容器;如果执行 `MONGO_VERSION=2.8 docker-compose up` 则会启动一个 `mongo:2.8` 镜像的容器。

View File

@@ -1,4 +1,4 @@
# Docker 容器
# 操作 Docker 容器
容器是 Docker 又一核心概念。
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

View File

@@ -41,6 +41,11 @@ PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
```
$ nsenter --target $PID --mount --uts --ipc --net --pid
```
如果无法通过以上命令连接到这个容器有可能是因为宿主的默认shell在容器中并不存在比如zsh可以使用如下命令显式地使用bash。
```
$ nsenter --target $pid --mount --uts --ipc --net --pid -- /usr/bin/env \
--ignore-environment HOME=/root /bin/bash --login
```
下面给出一个完整的例子。
```
$ sudo docker run -idt ubuntu

View File

@@ -1,9 +1,9 @@
##启动容器
## 启动容器
启动容器有两种方式一种是基于镜像新建一个容器并启动另外一个是将在终止状态stopped的容器重新启动。
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
###新建并启动
### 新建并启动
所需要的命令主要为 `docker run`
例如,下面的命令输出一个 “Hello World”之后终止容器。
@@ -38,7 +38,7 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
* 执行用户指定的应用程序
* 执行完毕后容器被终止
###启动已终止容器
### 启动已终止容器
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps``top` 来查看进程信息。

30
contribute.md Normal file
View File

@@ -0,0 +1,30 @@
## 如何贡献项目
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```sh
$ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice
$ git config user.name "yourname"
$ git config user.email "your email"
```
* 修改代码后提交,并推送到自己的仓库。
```sh
$ #do some change on the content
$ git commit -am "Fix issue #1: change helo to hello"
$ git push
```
* 在 GitHub 网站上提交 pull request。
* 定期使用项目仓库内容更新自己仓库内容。
```sh
$ 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
```

View File

@@ -56,6 +56,21 @@ $ docker inspect web
}
...
```
从Docker 1.8.0起,数据卷配置在"Mounts"Key下面可以看到所有的数据卷都是创建在主机的`/mnt/sda1/var/lib/docker/volumes/....`下面了。
```
"Mounts": [
{
"Name": "b53ebd40054dae599faf7c9666acfe205c3e922fc3e8bc3f2fd178ed788f1c29",
"Source": "/mnt/sda1/var/lib/docker/volumes/b53ebd40054dae599faf7c9666acfe205c3e922fc3e8bc3f2fd178ed788f1c29/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
...
```
### 挂载一个本地主机文件作为数据卷
`-v` 标记也可以从主机挂载单个文件到容器中

11
docker-compose.yml Normal file
View File

@@ -0,0 +1,11 @@
version: "3"
services:
docker_practice:
build: ./.travis
image: ccr.ccs.tencentyun.com/docker_practice/docker_practice:latest
ports:
- 4000:4000
volumes:
- ./:/srv/gitbook-src
command: server

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1,6 +1,6 @@
## 什么是 etcd
![](../_images/etcd_logo.png)
![](_images/etcd_logo.png)
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目它的目标是构建一个高可用的分布式键值key-value数据库基于 Go 语言实现。我们知道在分布式系统中各种服务的配置信息的管理分享服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
# Docker 镜像
# 使用 Docker 镜像
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -27,8 +27,8 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 `nginx` 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 `FROM` 就是指定**基础镜像**,因此一个 `Dockerfile``FROM` 是必备的指令,并且必须是第一条指令。
在 Docker Hub (<https://hub.docker.com/explore/>) 上有非常多的高质量的官方镜像,
有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://hub.docker.com/_/nginx/)、[`redis`](https://hub.docker.com/_/redis/)、[`mongo`](https://hub.docker.com/_/mongo/)、[`mysql`](https://hub.docker.com/_/mongo/)、[`httpd`](https://hub.docker.com/_/httpd/)、[`php`](https://hub.docker.com/_/php/)、[`tomcat`](https://hub.docker.com/_/tomcat/) 等;
[Docker Hub](https://hub.docker.com/explore/)[^1] 上有非常多的高质量的官方镜像,
有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://hub.docker.com/_/nginx/)、[`redis`](https://hub.docker.com/_/redis/)、[`mongo`](https://hub.docker.com/_/mongo/)、[`mysql`](https://hub.docker.com/_/mysql/)、[`httpd`](https://hub.docker.com/_/httpd/)、[`php`](https://hub.docker.com/_/php/)、[`tomcat`](https://hub.docker.com/_/tomcat/) 等;
也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://hub.docker.com/_/node/)、[`openjdk`](https://hub.docker.com/_/openjdk/)、[`python`](https://hub.docker.com/_/python/)、[`ruby`](https://hub.docker.com/_/ruby/)、[`golang`](https://hub.docker.com/_/golang/) 等。
可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://hub.docker.com/_/ubuntu/)、[`debian`](https://hub.docker.com/_/debian/)、[`centos`](https://hub.docker.com/_/centos/)、[`fedora`](https://hub.docker.com/_/fedora/)、[`alpine`](https://hub.docker.com/_/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
@@ -164,7 +164,7 @@ Sending build context to Docker daemon 2.048 kB
理解构建上下文对于镜像构建是很重要的,避免犯一些不应该的错误。比如有些初学者在发现 `COPY /opt/xxxx /app` 不工作后,于是干脆将 `Dockerfile` 放到了硬盘根目录去构建,结果发现 `docker build` 执行后,在发送一个几十 GB 的东西,极为缓慢而且很容易构建失败。那是因为这种做法是在让 `docker build` 打包整个硬盘,这显然是使用错误。
一般来说,应该会将 `Dockerfile` 于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 `.gitignore` 一样的语法写一个 `.dockerignore`,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
一般来说,应该会将 `Dockerfile` 于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 `.gitignore` 一样的语法写一个 `.dockerignore`,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
那么为什么会有人误以为 `.` 是指定 `Dockerfile` 所在目录呢?这是因为在默认情况下,如果不额外指定 `Dockerfile` 的话,会将上下文目录下的名为 `Dockerfile` 的文件作为 Dockerfile。
@@ -220,3 +220,5 @@ $ docker build - < context.tar.gz
```
如果发现标准输入的文件格式是 `gzip``bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。
[^1]: [Docker Store](https://store.docker.com/)是发现公共Docker内容镜像发布和发行软件的新地方

View File

@@ -16,7 +16,7 @@ docker run --name webserver -d -p 80:80 nginx
直接用浏览器访问的话,我们会看到默认的 Nginx 欢迎页面。
<img src="../_images/install-mac-example-nginx.png" width="80%" >
<img src="_images/images-mac-example-nginx.png" width="80%" >
现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用 `docker exec` 命令进入容器,修改其内容。
@@ -33,7 +33,7 @@ exit
现在我们再刷新浏览器的话,会发现内容被改变了。
<img src="../_images/images-create-nginx-docker.png" width="80%" >
<img src="_images/images-create-nginx-docker.png" width="80%" >
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 `docker diff` 命令看到具体的改动。

View File

@@ -2,7 +2,7 @@
格式:`ARG <参数名>[=<默认值>]`
构建参数和 `ENV` 的效果一样,都是设置环境变量。所不同的是,`ARG` 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就`ARG` 保存密码之类的信息,因为 `docker history` 还是可以看到所有值的。
构建参数和 `ENV` 的效果一样,都是设置环境变量。所不同的是,`ARG` 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使`ARG` 保存密码之类的信息,因为 `docker history` 还是可以看到所有值的。
`Dockerfile` 中的 `ARG` 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 `docker build` 中用 `--build-arg <参数名>=<值>` 来覆盖。

View File

@@ -45,5 +45,5 @@ CMD service nginx start
正确的做法是直接执行 `nginx` 可执行文件,并且要求以前台形式运行。比如:
```Dockerfile
CMD ["nginx" "-g" "daemon off;"]
CMD ["nginx", "-g", "daemon off;"]
```

View File

@@ -38,7 +38,7 @@ $ docker run myip -i
docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"-i\\\": executable file not found in $PATH\"\n".
```
我们可以看到可执行文件找不到的报错,`executable file not found`。之前我们说过,跟在镜像名后面的是 `command`,运行时会替换 `CMD` 的默认值。因此这里的 `-i` 替换了远了`CMD`,而不是添加在原来的 `curl -s http://ip.cn` 后面。而 `-i` 根本不是命令,所以自然找不到。
我们可以看到可执行文件找不到的报错,`executable file not found`。之前我们说过,跟在镜像名后面的是 `command`,运行时会替换 `CMD` 的默认值。因此这里的 `-i` 替换了原来`CMD`,而不是添加在原来的 `curl -s http://ip.cn` 后面。而 `-i` 根本不是命令,所以自然找不到。
那么如果我们希望加入 `-i` 这参数,我们就必须重新完整的输入这个命令:

View File

@@ -5,7 +5,7 @@
* `ENV <key> <value>`
* `ENV <key1>=<value1> <key2>=<value2>...`
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 `RUN`,还是运行时的应用,都可以直接使用使用这里定义的环境变量。
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 `RUN`,还是运行时的应用,都可以直接使用这里定义的环境变量。
```Dockerfie
ENV VERSION=1.0 DEBUG=on \

View File

@@ -10,7 +10,7 @@
```Dockerfile
FROM node:slim
RUN "mkdir /app"
RUN mkdir /app
WORKDIR /app
COPY ./package.json /app
RUN [ "npm", "install" ]
@@ -26,7 +26,7 @@ CMD [ "npm", "start" ]
```Dockerfile
FROM node:slim
RUN "mkdir /app"
RUN mkdir /app
WORKDIR /app
CMD [ "npm", "start" ]
```
@@ -48,7 +48,7 @@ COPY . /app/
```Dockerfile
FROM node:slim
RUN "mkdir /app"
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]

View File

@@ -2,7 +2,7 @@
格式为 `WORKDIR <工作目录路径>`
使用 `WORKDIR` 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,该目录需要已经存在,`WORKDIR` 并不会帮你建立目录。
使用 `WORKDIR` 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,该目录存在,`WORKDIR` 会帮你建立目录。
之前提到一些初学者常犯的错误是把 `Dockerfile` 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:

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