Compare commits
84 Commits
3af007b176
...
docker-leg
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2535813859 | ||
|
|
c8260780d9 | ||
|
|
d8b2a7a303 | ||
|
|
41779a5661 | ||
|
|
fc86abea99 | ||
|
|
62f9976b0d | ||
|
|
70d77b489d | ||
|
|
060dee21d5 | ||
|
|
f59dd5bdc0 | ||
|
|
6612b45387 | ||
|
|
f7e6d648f5 | ||
|
|
1a5c72ee10 | ||
|
|
de972a0404 | ||
|
|
5217746e64 | ||
|
|
91e53f489a | ||
|
|
f1a9e3372c | ||
|
|
647828bf85 | ||
|
|
9e2cdc0779 | ||
|
|
62c03c1c53 | ||
|
|
b0d1050cfb | ||
|
|
0fd286a5d1 | ||
|
|
f07c51e2e7 | ||
|
|
705fb2efc3 | ||
|
|
f23e8f8ce7 | ||
|
|
5f481b90dc | ||
|
|
a7ac3b4273 | ||
|
|
e33150db73 | ||
|
|
095244b371 | ||
|
|
4f7a1ef89c | ||
|
|
6e3c7fd2a5 | ||
|
|
5786333a3b | ||
|
|
2568854736 | ||
|
|
79f0fc403f | ||
|
|
4ca37a0de7 | ||
|
|
34b0969ef7 | ||
|
|
1bfd80b970 | ||
|
|
8f7b408091 | ||
|
|
e87ff1bb1e | ||
|
|
7ef6616b1c | ||
|
|
fcabe5bc3b | ||
|
|
60ebacfda4 | ||
|
|
df6d092c11 | ||
|
|
2a39cf4ce8 | ||
|
|
22fa7ea709 | ||
|
|
17add1cda4 | ||
|
|
a56376fc7c | ||
|
|
9c93015ed3 | ||
|
|
c703cae1cf | ||
|
|
86523b981e | ||
|
|
4f3ecaa0df | ||
|
|
f22277afbf | ||
|
|
d9648a2544 | ||
|
|
12ddbfda1e | ||
|
|
0d2cc4a8d3 | ||
|
|
e003739d1a | ||
|
|
59e80243dc | ||
|
|
8a8edc3767 | ||
|
|
94e6ed39cc | ||
|
|
3344b31dcc | ||
|
|
caf3cdf801 | ||
|
|
53aca57515 | ||
|
|
7726d62b7a | ||
|
|
b003629be5 | ||
|
|
8291e13c27 | ||
|
|
05120d9e5e | ||
|
|
d4c1f98702 | ||
|
|
a3bec5ffba | ||
|
|
78e5d45125 | ||
|
|
37b4149605 | ||
|
|
ec70b04ff0 | ||
|
|
c247ef2aef | ||
|
|
60388ba6e9 | ||
|
|
bcb673ad00 | ||
|
|
9e60e762f5 | ||
|
|
db5da49511 | ||
|
|
dd33dea8e4 | ||
|
|
0b99f62220 | ||
|
|
8daf9c4f15 | ||
|
|
57b6e46ad2 | ||
|
|
0f91a0ed7d | ||
|
|
b2508c8bac | ||
|
|
2226d748e3 | ||
|
|
52934e24c9 | ||
|
|
e8389a46b3 |
26
.travis/Dockerfile
Normal 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
@@ -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 © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
5
.travis/docker-compose.test.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
sut:
|
||||
build: .
|
||||
volumes:
|
||||
- ../:/srv/gitbook-src
|
||||
command: build
|
||||
19
.travis/docker-entrypoint.sh
Executable 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
@@ -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
@@ -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 技术入门与实战](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~
|
||||
|
||||

|
||||
|
||||
59
SUMMARY.md
@@ -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)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 214 KiB After Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
BIN
_images/docker_primer2.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
_images/donate.jpeg
Normal file
|
After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 137 KiB |
@@ -7,6 +7,6 @@
|
||||
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||

|
||||

|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
@@ -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"]
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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"]
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
@@ -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"]
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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;"]
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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。
|
||||
|
||||
@@ -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" ]
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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"]
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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"]
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
@@ -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`。
|
||||
|
||||
|
||||
10
book.json
@@ -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 © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
#实战案例
|
||||
介绍一些典型的应用场景和案例。
|
||||
@@ -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 中的其他物理机器互联。
|
||||

|
||||
|
||||
### 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
|
||||
```
|
||||
这样就直接把容器暴露到物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。
|
||||
@@ -1,14 +0,0 @@
|
||||
## 标准化开发测试和生产环境
|
||||
对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点。
|
||||
|
||||
可以用 Docker 来标准化开发、测试、生产环境。
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
Docker 占用资源小,在一台 E5 128 G 内存的服务器上部署 100 个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署 samba,利用 samba 的 home 分享方案将每个用户的 home 目录映射到开发中心和测试部门的 Windows 机器上。
|
||||
|
||||
针对某个项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过 `docker run -v` 将用户的 home 目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用 `-v` 加载测试部门的 home 目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发部门提交的代码,测试部门部署不了的问题。
|
||||
|
||||
测试部门发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中了。这种方式的部署横向性能的扩展性也极好。
|
||||
9
cases/os/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 操作系统
|
||||
|
||||
目前常用的 Linux 发行版主要包括 Debian/Ubuntu 系列和 CentOS/Fedora 系列。
|
||||
|
||||
前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时,社区还推出了完全基于 Docker 的 Linux 发行版 CoreOS。
|
||||
|
||||
使用 Docker,读者只需要一个命令就能快速获取一个 linux 发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整 linux 系统的大部分功能。
|
||||
|
||||
本章将介绍如何使用 Docker 安装和使用 Busybox、Alphine、Debian/Ubuntu、CentOS/Fedora、CoreOS 等操作系统。
|
||||
BIN
cases/os/_images/alpinelinux-logo.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
cases/os/_images/busybox-logo.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
cases/os/_images/centos-logo.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
cases/os/_images/coreos-login.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
cases/os/_images/coreos-logo.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
cases/os/_images/coreos_crt.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
cases/os/_images/coreos_list.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
cases/os/_images/coreos_run_ip.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
cases/os/_images/debian-logo.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
cases/os/_images/docker_version.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
cases/os/_images/fedora-logo.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
cases/os/_images/php_pulling.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
cases/os/_images/ubuntu-logo.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
cases/os/_images/vmware_coreos.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
73
cases/os/alpine.md
Normal file
@@ -0,0 +1,73 @@
|
||||
## Alpine
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
`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
@@ -0,0 +1,114 @@
|
||||
## Busybox
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
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
@@ -0,0 +1,76 @@
|
||||
## CentOS/Fedora
|
||||
|
||||
### CentOS 系统简介
|
||||
|
||||
CentOS 和 Fedora 都是基于 Redhat 的常见 Linux 分支。CentOS 是目前企业级服务器的常用操作系统;Fedora 则主要面向个人桌面用户。
|
||||
|
||||

|
||||
|
||||
CentOS(Community 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 由 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
@@ -0,0 +1,116 @@
|
||||
## CoreOS
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
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` 文件:
|
||||
!
|
||||
|
||||
双击`vmx` 文件后,即可启动 CoreOS 虚拟机,如下图所示:
|
||||
|
||||

|
||||
|
||||
*注意:使用免费版 VMware Player 运行 CoreOS 官方镜像时,可能出现无法通过 DHCP 自动获取 IP 地址的问题,读者可配置静态地址或使用 VMware Workstation 来运行 `vmx` 文件。*
|
||||
|
||||
#### 获取地址信息
|
||||
|
||||
此时CoreOS 系统已经在 VMware Station 中启动,显示登录提示:
|
||||
|
||||

|
||||
|
||||
直接按回车键,获取当前系统的 IP 地址,如下图所示:
|
||||
|
||||

|
||||
|
||||
如上图所示,查看此时 CoreOS 的 IP地址是:`192.168.66.128`。
|
||||
|
||||
#### 使用 SSH 客户端访问镜像
|
||||
|
||||
笔者以 Windows 环境为例,使用 SecureCRT 工具进行连接。此处读者需要确定:
|
||||
|
||||
* CoreOS 虚拟机的 IP地址
|
||||
* CoreOS 虚拟机的文件目录下含有 `insecure_ssh_key` 公钥文件
|
||||
|
||||
打开 SecureCRT,建立新的 SSH 连接,如下图示:
|
||||
|
||||

|
||||
|
||||
点击 ` 属性` 按钮添加 `insecure_ssh_key` 公钥文件后,即可点击 `连接`。
|
||||
|
||||
如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息:
|
||||
|
||||
```sh
|
||||
$ docker version
|
||||
```
|
||||
|
||||
结果如下图示:
|
||||
|
||||

|
||||
|
||||
此时,CoreOS 虚拟机已经成功运行,并且读者可以使用 SSH 客户端方便的操作 CoreOS 虚拟机。 Docker 已经内置于 CoreOS 中,读者可以进行各种 Docker 操作,如下图示:
|
||||
|
||||

|
||||
|
||||
如果读者的本机环境是 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
@@ -0,0 +1,170 @@
|
||||
## Debian/Ubuntu
|
||||
Debian 和 Ubuntu 都是目前较为流行的 Debian 系的服务器操作系统,十分适合研发场景。Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
|
||||
### Debian 系统简介
|
||||
|
||||

|
||||
|
||||
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 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。Ubuntu 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu 基于 Debian 发行版和 GNOME/Unity 桌面环境,与 Debian 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持(Long Term Support,LTS)版本,一般支持 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
@@ -0,0 +1,3 @@
|
||||
docker_book
|
||||
===========
|
||||
Internal usage.
|
||||
12
cases/os/summary.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 本章小结
|
||||
本章讲解了典型操作系统镜像的下载和使用。
|
||||
|
||||
除了官方的镜像外,在 DockerHub 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
|
||||
读者可以根据具体情况来选择。一般来说:
|
||||
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行定制化。
|
||||
* 个别第三方(如 tutum,已被 Docker 收购)镜像质量也非常高。这些镜像通常针对某个具体应用进行配置,比如:包含 LAMP 组件的 Ubuntu 镜像。
|
||||
* 处于安全考虑,几乎所有官方制作的镜像都没有安装 SSH 服务,无法使用用户名和密码直接登录。
|
||||
|
||||
后续章节中,笔者将介绍如何创建一个带 SSH 服务的 Docker 镜像。
|
||||
@@ -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 服务的基础镜像,之后创建镜像可以使用这个镜像为基础来创建
|
||||
@@ -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
@@ -0,0 +1,5 @@
|
||||
# 容器与云计算
|
||||
|
||||
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
|
||||
|
||||
除了 AWS、Google、Azure、Docker 官方云服务等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和容器服务,甚至还专门推出了容器云业务。
|
||||
BIN
cloud/_images/ECS.jpg
Normal file
|
After Width: | Height: | Size: 445 KiB |
BIN
cloud/_images/aliyun-logo.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
cloud/_images/aws-logo.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
cloud/_images/qcloud-logo.jpg
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
10
cloud/alicloud.md
Normal file
@@ -0,0 +1,10 @@
|
||||
## 阿里云
|
||||
|
||||

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

|
||||
|
||||
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 是“作为服务”来提供的。
|
||||
|
||||
|
||||

|
||||
|
||||
7
cloud/intro.md
Normal file
@@ -0,0 +1,7 @@
|
||||
## 简介
|
||||
|
||||
目前与容器相关的云计算主要分为两种类型。
|
||||
|
||||
一种是传统的 IaaS 服务商提供对容器相关的服务,包括镜像下载、容器托管等。
|
||||
|
||||
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。
|
||||
12
cloud/qcloud.md
Normal file
@@ -0,0 +1,12 @@
|
||||
## 腾讯云
|
||||
|
||||

|
||||
|
||||
腾讯云在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
|
||||
|
||||
具体包括云服务器、云存储、云数据库和弹性 web 引擎等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能力;以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
|
||||
|
||||
腾讯云容器服务是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的API调用,便可启动和停止Docker应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
|
||||
*腾讯云已有用户或新用户都可以 [通过这里](http://partners.qcloud.com/invitation/25297829205816a19c316c6),在不做任何迁移的前提下,获得腾讯云服务的额外支持和大客户专享价格。*
|
||||
|
||||
12
cloud/summary.md
Normal file
@@ -0,0 +1,12 @@
|
||||
## 本章小结
|
||||
本章介绍了公有云服务对 Docker 的积极支持,以及新出现的容器云平台。
|
||||
|
||||
事实上,Docker 技术的出现自身就极大推动了云计算行业的发展。
|
||||
|
||||
通过整合公有云的虚拟机和 Docker 方式,可能获得更多的好处,包括
|
||||
|
||||
* 更快速的持续交付和部署能力;
|
||||
* 利用内核级虚拟化,对公有云中服务器资源进行更加高效地利用;
|
||||
* 利用公有云和 Docker 的特性更加方便的迁移和扩展应用。
|
||||
|
||||
同时,容器将作为与虚拟机类似的业务直接提供给用户使用,极大的丰富了应用开发和部署的场景。
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@@ -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`。
|
||||
|
||||
打印版本信息。
|
||||
@@ -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.
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
@@ -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 的模板文件。
|
||||

|
||||
|
||||
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 `project`,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
|
||||
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
|
||||
|
||||

|
||||
其代码目前在 [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 来进行编排管理。
|
||||
|
||||
@@ -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 <<font color=\"blue\">"+guest+"</font>> to WebServer <<font color=\"blue\">"+pair[1]+"</font>></p>")
|
||||
else:
|
||||
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from <<font color=\"navy\">"+guest+"</font>> to WebServer <<font color=\"navy\">"+pair[1]+"</font>></p>")
|
||||
file.write("</body> </html>");
|
||||
file.write("</body> </html>")
|
||||
file.close()
|
||||
pickle.dump(request,open("pickle_data.txt","w"))
|
||||
|
||||
|
||||
@@ -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|false,yes|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 依赖 B,B 依赖 C,C 反过来依赖 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` 镜像的容器。
|
||||
@@ -1,4 +1,4 @@
|
||||
# Docker 容器
|
||||
# 操作 Docker 容器
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
@@ -1,6 +1,6 @@
|
||||
## 什么是 etcd
|
||||
|
||||

|
||||

|
||||
|
||||
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。我们知道,在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。
|
||||
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
#Fig
|
||||
在你的应用里面添加一个 `fig.yml` 文件,并指定一些简单的内容,执行 `fig up` 它就能帮你快速建立起一个容器。目前已经正式更名为 [Compose](../compose/README.md)。
|
||||
141
fig/cli_ref.md
@@ -1,141 +0,0 @@
|
||||
##Fig客户端参考
|
||||
|
||||
大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,这个命令则可以应用在所有的服务上。
|
||||
|
||||
执行 `fig [COMMAND] --help` 查看所有的使用说明。
|
||||
|
||||
###选项
|
||||
|
||||
`--verbose`
|
||||
|
||||
显示更多信息。
|
||||
|
||||
`--version`
|
||||
|
||||
打印版本并退出。
|
||||
|
||||
`-f, --file FILE`
|
||||
|
||||
使用特定的Fig文件,默认使用fig.yml。
|
||||
|
||||
`-p, --project-name NAME`
|
||||
|
||||
使用特定的项目名称,默认使用文件夹名称。
|
||||
|
||||
###命令
|
||||
|
||||
`build`
|
||||
|
||||
构建或重新构建服务。
|
||||
|
||||
服务一旦构建后,将会标记为project_service,例如figtest_db。
|
||||
如果修改服务的 `Dockerfile` 或构建目录信息,你可以运行 `fig build` 来重新构建。
|
||||
|
||||
`help`
|
||||
|
||||
获得一个命令的帮助。
|
||||
|
||||
`kill`
|
||||
|
||||
强制停止服务容器。
|
||||
|
||||
`logs`
|
||||
|
||||
查看服务的输出。
|
||||
|
||||
`port`
|
||||
|
||||
打印端口绑定的公共端口。
|
||||
|
||||
`ps`
|
||||
|
||||
列出所有容器。
|
||||
|
||||
`pull`
|
||||
|
||||
拉取服务镜像。
|
||||
|
||||
`rm`
|
||||
|
||||
删除停止的服务容器。
|
||||
|
||||
`run`
|
||||
|
||||
在一个服务上执行一个命令。
|
||||
|
||||
例如:
|
||||
|
||||
```
|
||||
$ fig run web python manage.py shell
|
||||
```
|
||||
|
||||
默认情况下,链接的服务将会启动,除非这些服务已经在运行中。
|
||||
|
||||
一次性命令会在使用与服务的普通容器相同的配置的新容器中开始运行,然后卷、链接等等都将会按照期望创建。
|
||||
与普通容器唯一的不同就是,这个命令将会覆盖原有的命令,如果端口有冲突则不会创建。
|
||||
|
||||
链接还可以在一次性命令和那个服务的其他容器间创建,然后你可以像下面一样进行一些操作:
|
||||
|
||||
```
|
||||
$ fig run db psql -h db -U docker
|
||||
```
|
||||
|
||||
如果你不希望在执行一次性命令时启动链接的容器,可以指定--no-deps选项:
|
||||
|
||||
```
|
||||
$ fig run --no-deps web python manage.py shell
|
||||
```
|
||||
|
||||
`scale`
|
||||
|
||||
设置一个服务需要运行的容器个数。
|
||||
|
||||
通过service=num的参数来设置数量。例如:
|
||||
|
||||
```
|
||||
$ fig scale web=2 worker=3
|
||||
```
|
||||
|
||||
`start`
|
||||
|
||||
启动一个服务已经存在的容器.
|
||||
|
||||
`stop`
|
||||
|
||||
停止一个已经运行的容器,但不删除它。通过 `fig start` 可以再次启动这些容器。
|
||||
|
||||
`up`
|
||||
|
||||
构建,(重新)创建,启动,链接一个服务的容器。
|
||||
|
||||
链接的服务都将会启动,除非他们已经运行。
|
||||
|
||||
默认情况, `fig up` 将会聚合每个容器的输出,而且如果容器已经存在,所有容器将会停止。如果你运行 `fig up -d` ,将会在后台启动并运行所有的容器。
|
||||
|
||||
默认情况,如果这个服务的容器已经存在, `fig up` 将会停止并重新创建他们(保持使用volumes-from挂载的卷),以保证 `fig.yml` 的修改生效。如果你不想容器被停止并重新创建,可以使用 `fig up --no-recreate` 。如果需要的话,这样将会启动已经停止的容器。
|
||||
|
||||
###环境变量
|
||||
|
||||
环境变量可以用来配置Fig的行为。
|
||||
|
||||
变量以DOCKER_开头,它们和用来配置Docker命令行客户端的使用一样。如果你在使用 boot2docker , `$(boot2docker shellinit)` 将会设置它们为正确的值。
|
||||
|
||||
`FIG_PROJECT_NAME`
|
||||
|
||||
设置通过Fig启动的每一个容器前添加的项目名称.默认是当前工作目录的名字。
|
||||
|
||||
`FIG_FILE`
|
||||
|
||||
设置要使用的 `fig.yml` 的路径。默认路径是当前工作目录。
|
||||
|
||||
`DOCKER_HOST`
|
||||
|
||||
设置docker进程的URL。默认docker client使用 `unix:///var/run/docker.sock` 。
|
||||
|
||||
`DOCKER_TLS_VERIFY`
|
||||
|
||||
如果设置不为空的字符,允许和进程进行 TLS 通信。
|
||||
|
||||
`DOCKER_CERT_PATH`
|
||||
|
||||
配置 `ca.pem` 的路径, `cert.pem` 和 `key.pem` 文件用来进行TLS验证.默认路径是 `~/.docker` 。
|
||||
@@ -1,31 +0,0 @@
|
||||
##环境变量参考
|
||||
|
||||
*注意: 现在已经不推荐使用环境变量链接服务。替代方案是使用链接名称(默认就是被连接的服务名字)作为主机名来链接。详情查看 [fig.yml章节](./yml_ref.md)。
|
||||
|
||||
Fig 使用 Docker 链接来暴露一个服务的容器给其它容器。每一个链接的容器会注入一组以容器名称的大写字母开头得环境变量。
|
||||
|
||||
查看一个服务有那些有效的环境变量可以执行 `fig run SERVICE env`。
|
||||
|
||||
`name_PORT`
|
||||
|
||||
完整URL,例如: `DB_PORT=tcp://172.17.0.5:5432`
|
||||
|
||||
`name_PORT_num_protocol`
|
||||
|
||||
完整URL,例如: `DB_PORT_5432_TCP=tcp://172.17.0.5:5432`
|
||||
|
||||
`name_PORT_num_protocol_ADDR`
|
||||
|
||||
容器的IP地址,例如: `DB_PORT_5432_TCP_ADDR=172.17.0.5`
|
||||
|
||||
`name_PORT_num_protocol_PORT`
|
||||
|
||||
暴露端口号,例如: `DB_PORT_5432_TCP_PORT=5432`
|
||||
|
||||
`name_PORT_num_protocol_PROTO`
|
||||
|
||||
协议(tcp 或 udp),例如: `DB_PORT_5432_TCP_PROTO=tcp`
|
||||
|
||||
`name_NAME`
|
||||
|
||||
完整合格的容器名称,例如: `DB_1_NAME=/myapp_web_1/myapp_db_1`
|
||||
@@ -1,28 +0,0 @@
|
||||
##安装 Fig
|
||||
|
||||
首先,安装 1.3 或者更新的 Docker 版本。
|
||||
|
||||
如果你的工作环境是 OS X ,可以通过查看 [Mac 安装指南(英文)](https://docs.docker.com/installation/mac/) ,完成安装 Docker 和 boot2docker 。一旦 boot2docker 运行后,执行以下指令设置一个环境变量,接着 Fig 就可以和它交互了。
|
||||
|
||||
```
|
||||
$(boot2docker shellinit)
|
||||
```
|
||||
**如果想避免重启后重新设置,可以把上面的命令加到你的 ` ~/.bashrc` 文件里。*
|
||||
|
||||
关于 `Ubuntu` 还有 `其它的平台` 的安装,可以参照 [Ubuntu 安装指南(中文)](../install/ubuntu.md) 以及 [官方安装手册(英文)](https://docs.docker.com/installation/)。
|
||||
|
||||
|
||||
下一步,安装 Fig :
|
||||
|
||||
```
|
||||
curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig
|
||||
```
|
||||
**如果你的 Docker 是管理员身份安装,以上命令可能也需要相同的身份。*
|
||||
|
||||
目前 Fig 的发行版本只支持 OSX 和 64 位的 Linux 系统。但因为它是用 Python 语言写的,所以对于其它平台上的用户,可以通过 Python 安装包来完成安装(支持的系统同样适用)。
|
||||
|
||||
```
|
||||
$ sudo pip install -U fig
|
||||
```
|
||||
到这里就已经完成了。 执行 `fig --version` ,确认能够正常运行。
|
||||
|
||||
141
fig/intro.md
@@ -1,141 +0,0 @@
|
||||
##快速搭建基于 Docker 的隔离开发环境
|
||||
|
||||
使用 `Dockerfile` 文件指定你的应用环境,让它能在任意地方复制使用:
|
||||
|
||||
```
|
||||
FROM python:2.7
|
||||
ADD . /code
|
||||
WORKDIR /code
|
||||
RUN pip install -r requirements.txt
|
||||
```
|
||||
|
||||
在 `fig.yml` 文件中指定应用使用的不同服务,让它们能够在一个独立的环境中一起运行:
|
||||
|
||||
```
|
||||
web:
|
||||
build: .
|
||||
command: python app.py
|
||||
links:
|
||||
- db
|
||||
ports:
|
||||
- "8000:8000"
|
||||
db:
|
||||
image: postgres
|
||||
```
|
||||
**注意不需要再额外安装 Postgres 了!*
|
||||
|
||||
接着执行命令 `fig up` ,然后 Fig 就会启动并运行你的应用了。
|
||||
|
||||

|
||||
|
||||
Fig 可用的命令有:
|
||||
|
||||
* 启动、停止,和重建服务
|
||||
* 查看服务的运行状态
|
||||
* 查看运行中的服务的输入日志
|
||||
* 对服务发送命令
|
||||
|
||||
##快速上手
|
||||
我们试着让一个基本的 Python web 应用运行在 Fig 上。这个实验假设你已经知道一些 Python 知识,如果你不熟悉,但清楚概念上的东西也是没有问题的。
|
||||
|
||||
首先,[安装 Docker 和 Fig](install.md)
|
||||
|
||||
为你的项目创建一个目录
|
||||
|
||||
```
|
||||
$ mkdir figtest
|
||||
$ cd figtest
|
||||
```
|
||||
进入目录,创建 `app.py`,这是一个能够让 Redis 上的一个值自增的简单 web 应用,基于 Flask 框架。
|
||||
|
||||
```
|
||||
from flask import Flask
|
||||
from redis import Redis
|
||||
import os
|
||||
app = Flask(__name__)
|
||||
redis = Redis(host='redis', port=6379)
|
||||
|
||||
@app.route('/')
|
||||
def hello():
|
||||
redis.incr('hits')
|
||||
return 'Hello World! I have been seen %s times.' % redis.get('hits')
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", debug=True)
|
||||
```
|
||||
在 `requirements.txt` 文件中指定应用的 Python 依赖包。
|
||||
|
||||
```
|
||||
flask
|
||||
redis
|
||||
```
|
||||
下一步我们要创建一个包含应用所有依赖的 Docker 镜像,这里将阐述怎么通过 `Dockerfile` 文件来创建。
|
||||
|
||||
```
|
||||
FROM python:2.7
|
||||
ADD . /code
|
||||
WORKDIR /code
|
||||
RUN pip install -r requirements.txt
|
||||
```
|
||||
以上的内容首先告诉 Docker 在容器里面安装 Python ,代码的路径还有Python 依赖包。关于 Dockerfile 的更多信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)
|
||||
|
||||
接着我们通过 `fig.yml` 文件指定一系列的服务:
|
||||
|
||||
```
|
||||
web:
|
||||
build: .
|
||||
command: python app.py
|
||||
ports:
|
||||
- "5000:5000"
|
||||
volumes:
|
||||
- .:/code
|
||||
links:
|
||||
- redis
|
||||
redis:
|
||||
image: redis
|
||||
```
|
||||
这里指定了两个服务:
|
||||
|
||||
* web 服务,通过当前目录的 `Dockerfile` 创建。并且说明了在容器里面执行`python app.py ` 命令 ,转发在容器里开放的 5000 端口到本地主机的 5000 端口,连接 Redis 服务,并且挂载当前目录到容器里面,这样我们就可以不用重建镜像也能直接使用代码。
|
||||
* redis 服务,我们使用公用镜像 [redis](https://registry.hub.docker.com/_/redis/)。
|
||||
*
|
||||
现在如果执行 `fig up` 命令 ,它就会拉取 redis 镜像,启动所有的服务。
|
||||
|
||||
```
|
||||
$ fig up
|
||||
Pulling image redis...
|
||||
Building web...
|
||||
Starting figtest_redis_1...
|
||||
Starting figtest_web_1...
|
||||
redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
|
||||
web_1 | * Running on http://0.0.0.0:5000/
|
||||
```
|
||||
这个 web 应用已经开始在你的 docker 守护进程里面监听着 5000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。
|
||||
|
||||
如果你想要在后台运行你的服务,可以在执行 `fig up` 命令的时候添加 `-d` 参数,然后使用 `fig ps` 查看有什么进程在运行。
|
||||
|
||||
```
|
||||
$ fig up -d
|
||||
Starting figtest_redis_1...
|
||||
Starting figtest_web_1...
|
||||
$ fig ps
|
||||
Name Command State Ports
|
||||
-------------------------------------------------------------------
|
||||
figtest_redis_1 /usr/local/bin/run Up
|
||||
figtest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp
|
||||
```
|
||||
|
||||
`fig run` 指令可以帮你向服务发送命令。例如:查看 web 服务可以获取到的环境变量:
|
||||
|
||||
```
|
||||
$ fig run web env
|
||||
```
|
||||
执行帮助命令 `fig --help` 查看其它可用的参数。
|
||||
|
||||
假设你使用了 `fig up -d` 启动 Fig,可以通过以下命令停止你的服务:
|
||||
|
||||
```
|
||||
$ fig stop
|
||||
```
|
||||
以上内容或多或少的讲述了如何使用Fig 。通过查看下面的引用章节可以了解到关于命令、配置和环境变量的更多细节。如果你有任何想法或建议,[可以在 GitHub 上提出](https://github.com/docker/fig)。
|
||||
|
||||
151
fig/yml_ref.md
@@ -1,151 +0,0 @@
|
||||
##fig.yml 参考
|
||||
|
||||
每个在 `fig.yml` 定义的服务都需要指定一个镜像或镜像的构建内容。像 `docker run` 的命令行一样,其它内容是可选的。
|
||||
|
||||
`docker run` 在 `Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV`) 作为已经提供的默认设置 - 你不需要在 `fig.yml` 中重新设置。
|
||||
|
||||
`image`
|
||||
|
||||
这里可以设置为标签或镜像ID的一部分。它可以是本地的,也可以是远程的 - 如果镜像在本地不存在,`Fig` 将会尝试拉去这个镜像。
|
||||
|
||||
```
|
||||
image: ubuntu
|
||||
image: orchardup/postgresql
|
||||
image: a4bc65fd
|
||||
```
|
||||
|
||||
`build`
|
||||
|
||||
指定 `Dockerfile` 所在文件夹的路径。 `Fig` 将会构建这个镜像并给它生成一个名字,然后使用这个镜像。
|
||||
|
||||
```
|
||||
build: /path/to/build/dir
|
||||
```
|
||||
|
||||
`command`
|
||||
|
||||
覆盖默认的命令。
|
||||
|
||||
```
|
||||
command: bundle exec thin -p 3000
|
||||
```
|
||||
|
||||
`links`
|
||||
|
||||
在其它的服务中连接容器。使用服务名称(经常也作为别名)或服务名称加服务别名 `(SERVICE:ALIAS)` 都可以。
|
||||
|
||||
```
|
||||
links:
|
||||
- db
|
||||
- db:database
|
||||
- redis
|
||||
```
|
||||
|
||||
可以在服务的容器中的 `/etc/hosts` 里创建别名。例如:
|
||||
|
||||
```
|
||||
172.17.2.186 db
|
||||
172.17.2.186 database
|
||||
172.17.2.187 redis
|
||||
```
|
||||
|
||||
环境变量也将被创建 - 细节查看环境变量参考章节。
|
||||
|
||||
`ports`
|
||||
|
||||
暴露端口。使用宿主和容器 `(HOST:CONTAINER)` 或者仅仅容器的端口(宿主将会随机选择端口)都可以。
|
||||
|
||||
注:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为 `YAML` 将会解析 `xx:yy` 这种数字格式为60进制。所以我们建议用字符指定你得端口映射。
|
||||
|
||||
```
|
||||
ports:
|
||||
- "3000"
|
||||
- "8000:8000"
|
||||
- "49100:22"
|
||||
- "127.0.0.1:8001:8001"
|
||||
```
|
||||
|
||||
`expose`
|
||||
|
||||
暴露不发布到宿主机的端口 - 它们只被连接的服务访问。仅仅内部的端口可以被指定。
|
||||
|
||||
```
|
||||
expose:
|
||||
- "3000"
|
||||
- "8000"
|
||||
```
|
||||
|
||||
`volumes`
|
||||
|
||||
卷挂载路径设置。可以设置宿主机路径 `(HOST:CONTAINER)` 或访问模式 `(HOST:CONTAINER:ro)` 。
|
||||
|
||||
```
|
||||
volumes:
|
||||
- /var/lib/mysql
|
||||
- cache/:/tmp/cache
|
||||
- ~/configs:/etc/configs/:ro
|
||||
```
|
||||
|
||||
`volumes_from`
|
||||
|
||||
从另一个服务或容器挂载所有卷。
|
||||
|
||||
```
|
||||
volumes_from:
|
||||
- service_name
|
||||
- container_name
|
||||
```
|
||||
|
||||
`environment`
|
||||
|
||||
设置环境变量。你可以使用数组或字典两种格式。
|
||||
|
||||
环境变量在运行 `Fig` 的机器上被解析成一个key。它有助于安全和指定的宿主值。
|
||||
|
||||
```
|
||||
environment:
|
||||
RACK_ENV: development
|
||||
SESSION_SECRET:
|
||||
|
||||
environment:
|
||||
- RACK_ENV=development
|
||||
- SESSION_SECRET
|
||||
```
|
||||
|
||||
`net`
|
||||
|
||||
设置网络模式。使用和 `docker client` 的 `--net` 参数一样的值。
|
||||
|
||||
```
|
||||
net: "bridge"
|
||||
net: "none"
|
||||
net: "container:[name or id]"
|
||||
net: "host"
|
||||
```
|
||||
|
||||
`dns`
|
||||
|
||||
配置DNS服务器。它可以是一个值,也可以是一个列表。
|
||||
|
||||
```
|
||||
dns: 8.8.8.8
|
||||
dns:
|
||||
- 8.8.8.8
|
||||
- 9.9.9.9
|
||||
```
|
||||
|
||||
`working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged`
|
||||
|
||||
这些都是和 `docker run` 对应的一个值。
|
||||
|
||||
```
|
||||
working_dir: /code
|
||||
entrypoint: /code/entrypoint.sh
|
||||
user: postgresql
|
||||
|
||||
hostname: foo
|
||||
domainname: foo.com
|
||||
|
||||
mem_limit: 1000000000
|
||||
privileged: true
|
||||
```
|
||||
@@ -1,4 +1,4 @@
|
||||
# Docker 镜像
|
||||
# 使用 Docker 镜像
|
||||
|
||||
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
@@ -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内容,镜像发布和发行软件的新地方
|
||||
|
||||
@@ -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` 命令看到具体的改动。
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
格式:`ARG <参数名>[=<默认值>]`
|
||||
|
||||
构建参数和 `ENV` 的效果一样,都是设置环境变量。所不同的是,`ARG` 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就是用 `ARG` 保存密码之类的信息,因为 `docker history` 还是可以看到所有值的。
|
||||
构建参数和 `ENV` 的效果一样,都是设置环境变量。所不同的是,`ARG` 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 `ARG` 保存密码之类的信息,因为 `docker history` 还是可以看到所有值的。
|
||||
|
||||
`Dockerfile` 中的 `ARG` 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 `docker build` 中用 `--build-arg <参数名>=<值>` 来覆盖。
|
||||
|
||||
|
||||
@@ -45,5 +45,5 @@ CMD service nginx start
|
||||
正确的做法是直接执行 `nginx` 可执行文件,并且要求以前台形式运行。比如:
|
||||
|
||||
```Dockerfile
|
||||
CMD ["nginx" "-g" "daemon off;"]
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```
|
||||
|
||||
@@ -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` 这参数,我们就必须重新完整的输入这个命令:
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* `ENV <key> <value>`
|
||||
* `ENV <key1>=<value1> <key2>=<value2>...`
|
||||
|
||||
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 `RUN`,还是运行时的应用,都可以直接使用使用这里定义的环境变量。
|
||||
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 `RUN`,还是运行时的应用,都可以直接使用这里定义的环境变量。
|
||||
|
||||
```Dockerfie
|
||||
ENV VERSION=1.0 DEBUG=on \
|
||||
|
||||
@@ -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" ]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
格式为 `WORKDIR <工作目录路径>`。
|
||||
|
||||
使用 `WORKDIR` 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,该目录需要已经存在,`WORKDIR` 并不会帮你建立目录。
|
||||
使用 `WORKDIR` 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,`WORKDIR` 会帮你建立目录。
|
||||
|
||||
之前提到一些初学者常犯的错误是把 `Dockerfile` 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:
|
||||
|
||||
|
||||