diff --git a/advanced_network/access_control.md b/advanced_network/access_control.md index acc2047..9e79077 100644 --- a/advanced_network/access_control.md +++ b/advanced_network/access_control.md @@ -4,12 +4,12 @@ ### 容器访问外部网络 容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 -``` +```bash $sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 ``` 如果为 0,说明没有开启转发,则需要手动打开。 -``` +```bash $sysctl -w net.ipv4.ip_forward=1 ``` 如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。 @@ -30,7 +30,7 @@ $sysctl -w net.ipv4.ip_forward=1 例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。 此时,系统中的 `iptables` 规则可能是类似 -``` +```bash $ sudo iptables -nL ... Chain FORWARD (policy ACCEPT) @@ -42,7 +42,7 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0 之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。 当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。 -``` +```bash $ sudo iptables -nL ... Chain FORWARD (policy ACCEPT) diff --git a/advanced_network/dns.md b/advanced_network/dns.md index 9d32700..208a47d 100644 --- a/advanced_network/dns.md +++ b/advanced_network/dns.md @@ -3,7 +3,7 @@ Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。 在容器中使用 mount 命令可以看到挂载信息: -``` +```bash $ mount ... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... diff --git a/advanced_network/docker0.md b/advanced_network/docker0.md index 9e56d3e..129f297 100644 --- a/advanced_network/docker0.md +++ b/advanced_network/docker0.md @@ -7,7 +7,7 @@ Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机 也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。 由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。 -``` +```bash $ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 @@ -17,7 +17,7 @@ docker0 8000.3a1d7362b4ee no veth65f9 每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。 -``` +```bash $ sudo docker run -i -t --rm base /bin/bash $ ip addr show eth0 24: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 diff --git a/advanced_network/port_mapping.md b/advanced_network/port_mapping.md index c683456..b29162b 100644 --- a/advanced_network/port_mapping.md +++ b/advanced_network/port_mapping.md @@ -5,7 +5,7 @@ 容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。 查看主机的 NAT 规则。 -``` +```bash $ sudo iptables -t nat -nL ... Chain POSTROUTING (policy ACCEPT) @@ -22,7 +22,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。 使用 `-P` 时: -``` +```bash $ iptables -t nat -nL ... Chain DOCKER (2 references) @@ -31,7 +31,7 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:1 ``` 使用 `-p 80:80` 时: -``` +```bash $ iptables -t nat -nL Chain DOCKER (2 references) target prot opt source destination diff --git a/appendix/repo/centos.md b/appendix/repo/centos.md index aa65fe8..cb151cb 100644 --- a/appendix/repo/centos.md +++ b/appendix/repo/centos.md @@ -8,7 +8,7 @@ ### 使用方法 默认会启动一个最小化的 CentOS 环境。 -```sh +```bash $ docker run --name some-centos -i -t centos bash bash-4.2# ``` diff --git a/appendix/repo/mongodb.md b/appendix/repo/mongodb.md index e2a0ee1..6616233 100644 --- a/appendix/repo/mongodb.md +++ b/appendix/repo/mongodb.md @@ -8,19 +8,19 @@ ### 使用方法 默认会在 `27017` 端口启动数据库。 -```sh +```bash $ docker run --name some-mongo -d mongo ``` 使用其他应用连接到容器,可以用 -```sh +```bash $ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo ``` 或者通过 `mongo` -```sh +```bash $ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' ``` diff --git a/appendix/repo/mysql.md b/appendix/repo/mysql.md index 3d296c4..82714be 100644 --- a/appendix/repo/mysql.md +++ b/appendix/repo/mysql.md @@ -8,17 +8,17 @@ ### 使用方法 默认会在 `3306` 端口启动数据库。 -``` +```bash $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql ``` 之后就可以使用其它应用来连接到该容器。 -``` +```bash $ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql ``` 或者通过 `mysql`。 -``` +```bash $ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' ``` diff --git a/appendix/repo/nginx.md b/appendix/repo/nginx.md index 257e600..07dfb73 100644 --- a/appendix/repo/nginx.md +++ b/appendix/repo/nginx.md @@ -8,30 +8,30 @@ ### 使用方法 下面的命令将作为一个静态页面服务器启动。 -``` +```bash $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx ``` 用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为 -``` +```bash FROM nginx COPY static-html-directory /usr/share/nginx/html ``` 之后生成新的镜像,并启动一个容器。 -``` +```bash $ docker build -t some-content-nginx . $ docker run --name some-nginx -d some-content-nginx ``` 开放端口,并映射到本地的 `8080` 端口。 -``` +```bash docker run --name some-nginx -d -p 8080:80 some-content-nginx ``` Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如 -``` +```bash docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx ``` 使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`。 diff --git a/appendix/repo/nodejs.md b/appendix/repo/nodejs.md index 58d1d10..7344dfd 100644 --- a/appendix/repo/nodejs.md +++ b/appendix/repo/nodejs.md @@ -8,21 +8,21 @@ ### 使用方法 在项目中创建一个 Dockerfile。 -``` +```bash FROM node:0.10-onbuild # replace this with your application's default port EXPOSE 8888 ``` 然后创建镜像,并启动容器。 -``` +```bash $ docker build -t my-nodejs-app $ docker run -it --rm --name my-running-app my-nodejs-app ``` 也可以直接运行一个简单容器。 -``` +```bash $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js ``` diff --git a/appendix/repo/redis.md b/appendix/repo/redis.md index 675c48b..fa0f2ac 100644 --- a/appendix/repo/redis.md +++ b/appendix/repo/redis.md @@ -8,12 +8,12 @@ ### 使用方法 默认会在 `6379` 端口启动数据库。 -``` +```bash $ docker run --name some-redis -d redis ``` 另外还可以启用 [持久存储](http://redis.io/topics/persistence)。 -``` +```bash $ docker run --name some-redis -d redis redis-server --appendonly yes ``` @@ -21,12 +21,12 @@ $ docker run --name some-redis -d redis redis-server --appendonly yes 使用其他应用连接到容器,可以用 -``` +```bash $ docker run --name some-app --link some-redis:redis -d application-that-uses-redis ``` 或者通过 `redis-cli` -``` +```bash $ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"' ``` diff --git a/appendix/repo/ubuntu.md b/appendix/repo/ubuntu.md index a5ce241..7272111 100644 --- a/appendix/repo/ubuntu.md +++ b/appendix/repo/ubuntu.md @@ -8,7 +8,7 @@ ### 使用方法 默认会启动一个最小化的 Ubuntu 环境。 -``` +```bash $ docker run --name some-ubuntu -i -t ubuntu root@523c70904d54:/# ``` diff --git a/appendix/repo/wordpress.md b/appendix/repo/wordpress.md index 5984f44..d353e0b 100644 --- a/appendix/repo/wordpress.md +++ b/appendix/repo/wordpress.md @@ -8,7 +8,7 @@ ### 使用方法 启动容器需要 MySQL 的支持,默认端口为 `80`。 -``` +```bash $ docker run --name some-wordpress --link some-mysql:mysql -d wordpress ``` 启动 WordPress 容器时可以指定的一些环境参数包括: diff --git a/cases/os/centos.md b/cases/os/centos.md index c8c1199..8d6905b 100644 --- a/cases/os/centos.md +++ b/cases/os/centos.md @@ -12,7 +12,7 @@ CentOS(Community Enterprise Operating System,中文意思是:社区企业 首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。 -```sh +```bash $ docker search -f stars=25 centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official... 2543 [OK] @@ -21,7 +21,7 @@ jdeathe/centos-ssh 27 [OK] 使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。 -```sh +```bash $ docker run -it centos bash Unable to find image 'centos:latest' locally latest: Pulling from library/centos @@ -42,7 +42,7 @@ Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版 首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。 -```sh +```bash $ docker search -f stars=2 fedora NAME DESCRIPTION STARS OFFICIAL AUTOMATED fedora Official Docker builds of Fedora 433 [OK] @@ -53,7 +53,7 @@ startx/fedora Simple container used for all startx based... 2 使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。 -```sh +```bash $ docker run -it fedora bash Unable to find image 'fedora:latest' locally latest: Pulling from library/fedora diff --git a/cases/os/coreos.md b/cases/os/coreos.md index d88bc31..e706e25 100644 --- a/cases/os/coreos.md +++ b/cases/os/coreos.md @@ -67,7 +67,7 @@ CoreOS 团队还推出了很多有益的工具,包括 etcd, fleet, flannel 等 如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息: -```sh +```bash $ docker version ``` @@ -83,7 +83,7 @@ $ docker version 如下所示: -```sh +```bash $ ssh -i ~/insecure_ssh_key core@192.168.6.153 CoreOS (alpha) core@localhost ~ $ ls @@ -113,4 +113,3 @@ core@localhost ~ $ * `CoreOS` 官网:`https://coreos.com/` * `CoreOS` 官方仓库:`https://github.com/coreos/` - diff --git a/cases/os/debian.md b/cases/os/debian.md index 41e986c..b741f04 100644 --- a/cases/os/debian.md +++ b/cases/os/debian.md @@ -11,11 +11,11 @@ Debian 作为一个大的系统组织框架,其下有多种不同操作系统 众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。 -#### 使用 Debian 官方镜像 +#### 使用 Debian 官方镜像 读者可以使用 docker search 搜索 Docker Hub,查找 Debian 镜像: -```sh +```bash $ docker search debian NAME DESCRIPTION STARS OFFICIAL AUTOMATED debian Debian is... 1565 [OK] @@ -28,7 +28,7 @@ armbuild/debian port of debian 8 [OK] 可以使用 docker run 直接运行 Debian 镜像。 -```sh +```bash $ docker run -it debian bash root@668e178d8d69:/# cat /etc/issue Debian GNU/Linux 8 @@ -46,7 +46,7 @@ Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自 Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。 -```sh +```bash $ docker search -s 10 ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED @@ -69,7 +69,7 @@ tutum/ubuntu Ubuntu image with SSH access. For the root. 首先使用 `-ti` 参数启动容器,登录 bash,查看 ubuntu 的发行版本号。 -```sh +```bash $ docker run -ti ubuntu:14.04 /bin/bash root@7d93de07bf76:/# lsb_release -a No LSB modules are available. @@ -81,7 +81,7 @@ Codename: trusty 当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`。 -```sh +```bash root@7d93de07bf76:/# apt-get install curl Reading package lists... Done Building dependency tree @@ -91,7 +91,7 @@ E: Unable to locate package curl 这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。 -```sh +```bash root@7d93de07bf76:/# apt-get update Ign http://archive.ubuntu.com trusty InRelease Ign http://archive.ubuntu.com trusty-updates InRelease @@ -103,7 +103,7 @@ Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B] 首先,安装 curl 工具。 -```sh +```bash root@7d93de07bf76:/# apt-get install curl Reading package lists... Done Building dependency tree @@ -122,7 +122,7 @@ curl: try 'curl --help' or 'curl --manual' for more information 接下来,再安装 apache 服务。 -```sh +```bash root@7d93de07bf76:/# apt-get install -y apache2 Reading package lists... Done Building dependency tree @@ -135,7 +135,7 @@ The following extra packages will be installed: 启动这个 apache 服务,然后使用 curl 来测试本地访问。 -``` +```bash 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 * @@ -159,7 +159,7 @@ root@7d93de07bf76:/# curl 127.0.0.1 ### 相关资源 -* `Debian` 官网:`https://www.debian.org/` +* `Debian` 官网:`https://www.debian.org/` * `Neuro Debian` 官网:`http://neuro.debian.net/` * `Debian` 官方仓库:`https://github.com/Debian` * `Debian` 官方镜像:`https://hub.docker.com/_/debian/` diff --git a/compose/django.md b/compose/django.md index b5101be..9b93c82 100644 --- a/compose/django.md +++ b/compose/django.md @@ -5,7 +5,7 @@ 在一切工作开始前,需要先设置好三个必要的文件。 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: -``` +```docker FROM python:2.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code @@ -18,7 +18,7 @@ ADD . /code/ 第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名 。 -``` +```bash Django psycopg2 ``` @@ -46,20 +46,20 @@ services: 现在我们就可以使用 `docker-compose run` 命令启动一个 Django 应用了。 -``` +```bash $ docker-compose run web django-admin.py startproject django_example . ``` Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject django_example . ` 指令。 这将在当前目录生成一个 Django 应用。 -``` +```bash $ ls Dockerfile docker-compose.yml django_example manage.py requirements.txt ``` 首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。 -``` +```bash DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', @@ -73,7 +73,7 @@ DATABASES = { 这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。 然后,运行 `docker-compose up` : -``` +```bash Recreating myapp_db_1... Recreating myapp_web_1... Attaching to myapp_db_1, myapp_web_1 @@ -93,6 +93,6 @@ myapp_web_1 | Quit the server with CONTROL-C. 你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可: -``` +```bash $ docker-compose run web python manage.py syncdb ``` diff --git a/compose/install.md b/compose/install.md index 0d2f29a..77c4d00 100644 --- a/compose/install.md +++ b/compose/install.md @@ -11,12 +11,12 @@ Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直 执行安装命令: -```sh +```bash $ sudo pip install -U docker-compose ``` 可以看到类似如下输出,说明安装成功。 -```sh +```bash Collecting docker-compose Downloading docker-compose-1.8.0.tar.gz (149kB): 149kB downloaded ... @@ -24,7 +24,7 @@ Successfully installed docker-compose cached-property requests texttable websock ``` 安装成功后,可以查看 `docker-compose` 命令的用法。 -```sh +```bash $ docker-compose -h Define and run multi-container applications with Docker. @@ -65,7 +65,7 @@ Commands: 之后,可以添加 bash 补全命令。 -```sh +```bash $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose ``` @@ -76,14 +76,14 @@ $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/complet 例如,在 Linux 和 macOS 平台上。 -``` +```bash $ 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 +```bash $ docker-compose version docker-compose version 1.8.0, build 94f7016 docker-py version: 1.9.0 @@ -95,14 +95,14 @@ OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014 Compose 既然是一个 Python 应用,自然也可以直接用容器来执行它。 -```sh +```bash $ 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 +```bash set -e VERSION="1.8.0" @@ -151,12 +151,12 @@ exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES ### 卸载 如果是二进制包方式安装的,删除二进制文件即可。 -```sh +```bash $ sudo rm /usr/local/bin/docker-compose ``` 如果是通过 python pip 工具安装的,则可以执行如下命令删除。 -```sh +```bash $ sudo pip uninstall docker-compose ``` diff --git a/compose/rails.md b/compose/rails.md index 3fdc9a3..adfe200 100644 --- a/compose/rails.md +++ b/compose/rails.md @@ -6,7 +6,7 @@ 在一切工作开始前,需要先设置好三个必要的文件。 首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: -``` +```docker FROM ruby RUN apt-get update -qq && apt-get install -y build-essential libpq-dev RUN mkdir /myapp @@ -18,7 +18,7 @@ ADD . /myapp 以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。 下一步,我们需要一个引导加载 Rails 的文件 `Gemfile` 。 等一会儿它还会被 `rails new` 命令覆盖重写。 -``` +```bash source 'https://rubygems.org' gem 'rails', '4.0.2' ``` @@ -44,12 +44,12 @@ services: ``` 所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。 -``` +```bash $ docker-compose run web rails new . --force --database=postgresql --skip-bundle ``` Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。 -``` +```bash $ ls Dockerfile app docker-compose.yml tmp Gemfile bin lib vendor @@ -59,18 +59,18 @@ Rakefile db test ``` 在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释,这样我们便可以使用 Javascript 运行环境: -``` +```bash gem 'therubyracer', platforms: :ruby ``` 现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,仅仅需要重建一次)。 -``` +```bash $ docker-compose build ``` 应用现在就可以启动了,但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。 打开最新生成的 `database.yml` 文件。用以下内容替换: -``` +```bash development: &default adapter: postgresql encoding: unicode @@ -86,19 +86,19 @@ test: ``` 现在就可以启动应用了。 -``` +```bash $ docker-compose up ``` 如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息: -``` +```bash myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1 myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu] myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000 ``` 最后, 我们需要做的是创建数据库,打开另一个终端,运行: -``` +```bash $ docker-compose run web rake db:create ``` 这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。 diff --git a/compose/yaml_file.md b/compose/yaml_file.md index 0e5bee2..7987520 100644 --- a/compose/yaml_file.md +++ b/compose/yaml_file.md @@ -66,7 +66,7 @@ cap_drop: 覆盖容器启动后默认执行的命令。 -```sh +```bash command: echo "hello world" ``` @@ -102,7 +102,7 @@ devices: 自定义 DNS 服务器。可以是一个值,也可以是一个列表。 -```sh +```bash dns: 8.8.8.8 dns: - 8.8.8.8 @@ -113,7 +113,7 @@ dns: 配置 DNS 搜索域。可以是一个值,也可以是一个列表。 -```sh +```bash dns_search: example.com dns_search: - domain1.example.com @@ -137,7 +137,7 @@ dockerfile: Dockerfile-alternate 如果有变量名称与 `environment` 指令冲突,则按照惯例,以后者为准。 -```sh +```bash env_file: .env env_file: @@ -148,7 +148,7 @@ env_file: 环境变量文件中每一行必须符合格式,支持 `#` 开头的注释行。 -```sh +```bash # common.env: Set development environment PROG_ENV=development ``` @@ -178,7 +178,7 @@ environment: `http://yaml.org/type/bool.html` 中给出了这些特定词汇,包括 -```sh +```bash y|Y|yes|Yes|YES|n|N|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF @@ -190,7 +190,7 @@ environment: 仅可以指定内部端口为参数 -```sh +```bash expose: - "3000" - "8000" @@ -200,7 +200,7 @@ expose: 基于其它模板文件进行扩展。 例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 `common.yml`。 -```sh +```bash # common.yml webapp: build: ./webapp @@ -210,7 +210,7 @@ webapp: ``` 再编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。 -```sh +```bash # development.yml web: extends: @@ -255,7 +255,7 @@ extra_hosts: ``` 会在启动后的服务容器中 `/etc/hosts` 文件中添加如下两条条目。 -```sh +```bash 8.8.8.8 googledns 52.1.157.61 dockerhub ``` @@ -265,7 +265,7 @@ extra_hosts: 指定为镜像名称或镜像 ID。如果镜像在本地不存在,`Compose` 将会尝试拉去这个镜像。 例如: -```sh +```bash image: ubuntu image: orchardup/postgresql image: a4bc65fd @@ -284,7 +284,7 @@ labels: 链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `(SERVICE:ALIAS)` 格式都可以。 -```sh +```bash links: - db - db:database @@ -293,7 +293,7 @@ links: 使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如: -```sh +```bash 172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis @@ -326,7 +326,7 @@ log_opt: 设置网络模式。使用和 `docker client` 的 `--net` 参数一样的值。 -```sh +```bash net: "bridge" net: "none" net: "container:[name or id]" @@ -336,7 +336,7 @@ net: "host" ### `pid` 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。 -```sh +```bash pid: "host" ``` @@ -409,7 +409,7 @@ volume_driver: mydriver 从另一个服务或容器挂载它的数据卷。 -```sh +```bash volumes_from: - service_name - container_name @@ -493,4 +493,4 @@ 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` 镜像的容器。 \ No newline at end of file +如果执行 `MONGO_VERSION=3.0 docker-compose up` 则会启动一个 `mongo:3.2` 镜像的容器;如果执行 `MONGO_VERSION=2.8 docker-compose up` 则会启动一个 `mongo:2.8` 镜像的容器。 diff --git a/container/run.md b/container/run.md index 5e6abcc..85c1d95 100644 --- a/container/run.md +++ b/container/run.md @@ -7,21 +7,21 @@ 所需要的命令主要为 `docker run`。 例如,下面的命令输出一个 “Hello World”,之后终止容器。 -``` +```bash $ docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world ``` 这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。 下面的命令则启动一个 bash 终端,允许用户进行交互。 -``` +```bash $ docker run -t -i ubuntu:14.04 /bin/bash root@af8bae53bdd3:/# ``` 其中,`-t` 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, `-i` 则让容器的标准输入保持打开。 在交互模式下,用户可以通过所创建的终端来输入命令,例如 -``` +```bash root@af8bae53bdd3:/# pwd / root@af8bae53bdd3:/# ls @@ -42,7 +42,7 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr 可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。 容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps` 或 `top` 来查看进程信息。 -``` +```bash root@ba267838cc1b:/# ps PID TTY TIME CMD 1 ? 00:00:00 bash diff --git a/coreos/intro_tools.md b/coreos/intro_tools.md index 6d21f65..6b95d50 100644 --- a/coreos/intro_tools.md +++ b/coreos/intro_tools.md @@ -10,7 +10,7 @@ CoreOS的第一个重要组件就是使用etcd来实现的服务发现。 例如: -``` +```yml #cloud-config hostname: coreos0 @@ -51,7 +51,7 @@ Fleet通过接受systemd单元文件来工作,同时在你集群的机器上 首先,让我们构建一个简单的可以运行docker容器的systemd单元。把这个文件保存在home目录并命名为hello.service: -``` +```yml hello.service [Unit] @@ -69,7 +69,7 @@ ExecStop=/usr/bin/docker stop hello 然后,读取并启动这个单元: -``` +```yml $ fleetctl load hello.service => Unit hello.service loaded on 8145ebb7.../172.17.8.105 $ fleetctl start hello.service @@ -80,7 +80,7 @@ $ fleetctl start hello.service 下面我们查看下它的状态: -``` +```yml $ fleetctl status hello.service ● hello.service - My Service Loaded: loaded (/run/fleet/units/hello.service; linked-runtime) @@ -97,7 +97,7 @@ Jun 04 19:05:06 core-01 bash[27503]: Hello World 我们可以停止容器: -``` +```yml fleetctl destroy hello.service ``` diff --git a/coreos/quickstart.md b/coreos/quickstart.md index 55d37fa..c811dfe 100644 --- a/coreos/quickstart.md +++ b/coreos/quickstart.md @@ -20,21 +20,21 @@ 首先,获取模板配置文件 -``` -git clone https://github.com/coreos/coreos-vagrant -cd coreos-vagrant -cp user-data.sample user-data +```bash +$ git clone https://github.com/coreos/coreos-vagrant +$ cd coreos-vagrant +$ cp user-data.sample user-data ``` 获取新的token -``` -curl https://discovery.etcd.io/new +```bash +$ curl https://discovery.etcd.io/new ``` 把获取的token放到user-data文件中,示例如下: -``` +```yml #cloud-config coreos: @@ -50,7 +50,7 @@ coreos: 复制文件 -``` +```bash cp config.rb.sample config.rb ``` @@ -58,7 +58,7 @@ cp config.rb.sample config.rb 启动集群 -``` +```bash vagrant up => Bringing machine 'core-01' up with 'virtualbox' provider... @@ -74,13 +74,13 @@ Bringing machine 'core-03' up with 'virtualbox' provider... 添加ssh的公匙 -``` +```bash ssh-add ~/.vagrant.d/insecure_private_key ``` 连接集群中的第一台机器 -``` +```bash vagrant ssh core-01 -- -A ``` @@ -88,7 +88,7 @@ vagrant ssh core-01 -- -A 使用fleet来查看机器运行状况 -``` +```bash fleetctl list-machines => MACHINE IP METADATA @@ -99,4 +99,4 @@ cb35b356... 172.17.8.103 - 如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。 -那么之后你就可以基于CoreOS的三大工具做任务分发,分布式存储等很多功能了。 \ No newline at end of file +那么之后你就可以基于CoreOS的三大工具做任务分发,分布式存储等很多功能了。 diff --git a/etcd/etcdctl.md b/etcd/etcdctl.md index 5fe7832..b4b880a 100644 --- a/etcd/etcdctl.md +++ b/etcd/etcdctl.md @@ -6,7 +6,7 @@ etcd 项目二进制发行包中已经包含了 etcdctl 工具,没有的话, etcdctl 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。 -``` +```bash $ etcdctl -h NAME: etcdctl - A simple command line client for etcd. @@ -55,12 +55,12 @@ etcd 在键的组织上采用了层次化的空间结构(类似于文件系统 #### set 指定某个键的值。例如 -``` +```bash $ etcdctl set /testdir/testkey "Hello world" Hello world ``` 支持的选项包括: -``` +```bash --ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时 --swap-with-value value 若该键现在的值是 value,则进行设置操作 --swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作 @@ -68,7 +68,7 @@ Hello world #### get 获取指定键的值。例如 -``` +```bash $ etcdctl set testkey hello hello $ etcdctl update testkey world @@ -76,20 +76,20 @@ world ``` 当键不存在时,则会报错。例如 -``` +```bash $ etcdctl get testkey2 Error: 100: Key not found (/testkey2) [1] ``` 支持的选项为 -``` +```bash --sort 对结果进行排序 --consistent 将请求发给主节点,保证获取内容的一致性 ``` #### update 当键存在时,更新值内容。例如 -``` +```bash $ etcdctl set testkey hello hello $ etcdctl update testkey world @@ -97,46 +97,44 @@ world ``` 当键不存在时,则会报错。例如 -``` +```bash $ etcdctl update testkey2 world Error: 100: Key not found (/testkey2) [1] ``` 支持的选项为 -``` +```bash --ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时 ``` #### rm 删除某个键值。例如 -``` +```bash $ etcdctl rm testkey - ``` 当键不存在时,则会报错。例如 -``` +```bash $ etcdctl rm testkey2 Error: 100: Key not found (/testkey2) [8] ``` 支持的选项为 -``` +```bash --dir 如果键是个空目录或者键值对则删除 --recursive 删除目录和所有子键 --with-value 检查现有的值是否匹配 --with-index '0' 检查现有的 index 是否匹配 - ``` #### mk 如果给定的键不存在,则创建一个新的键值。例如 -``` +```bash $ etcdctl mk /testdir/testkey "Hello world" Hello world ``` 当键存在的时候,执行该命令会报错,例如 -``` +```bash $ etcdctl set testkey "Hello world" Hello world $ ./etcdctl mk testkey "Hello world" @@ -144,24 +142,23 @@ Error: 105: Key already exists (/testkey) [2] ``` 支持的选项为 -``` +```bash --ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时 ``` - #### mkdir 如果给定的键目录不存在,则创建一个新的键目录。例如 -``` +```bash $ etcdctl mkdir testdir ``` 当键目录存在的时候,执行该命令会报错,例如 -``` +```bash $ etcdctl mkdir testdir $ etcdctl mkdir testdir Error: 105: Key already exists (/testdir) [7] ``` 支持的选项为 -``` +```bash --ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时 ``` @@ -170,14 +167,14 @@ Error: 105: Key already exists (/testdir) [7] 创建一个键目录,无论存在与否。 支持的选项为 -``` +```bash --ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时 ``` #### updatedir 更新一个已经存在的目录。 支持的选项为 -``` +```bash --ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时 ``` @@ -185,7 +182,7 @@ Error: 105: Key already exists (/testdir) [7] 删除一个空目录,或者键值对。 若目录不空,会报错 -``` +```bash $ etcdctl set /dir/testkey hi hi $ etcdctl rmdir /dir @@ -196,7 +193,7 @@ Error: 108: Directory not empty (/dir) [13] 列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中内容。 例如 -``` +```bash $ ./etcdctl set testkey 'hi' hi $ ./etcdctl set dir/test 'hello' @@ -209,7 +206,7 @@ $ ./etcdctl ls dir ``` 支持的选项包括 -``` +```bash --sort 将输出结果排序 --recursive 如果目录下有子目录,则递归输出其中的内容 -p 对于输出为目录,在最后添加 `/` 进行区分 @@ -221,7 +218,7 @@ $ ./etcdctl ls dir 备份 etcd 的数据。 支持的选项包括 -``` +```bash --data-dir etcd 的数据目录 --backup-dir 备份到指定路径 ``` @@ -229,13 +226,13 @@ $ ./etcdctl ls dir 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。 例如,用户更新 testkey 键值为 Hello world。 -``` +```bash $ etcdctl watch testkey Hello world ``` 支持的选项包括 -``` +```bash --forever 一直监测,直到用户按 `CTRL+C` 退出 --after-index '0' 在指定 index 之前一直监测 --recursive 返回所有的键值和子键值 @@ -244,7 +241,7 @@ Hello world 监测一个键值的变化,一旦键值发生更新,就执行给定命令。 例如,用户更新 testkey 键值。 -``` +```bash $etcdctl exec-watch testkey -- sh -c 'ls' default.etcd Documentation @@ -256,7 +253,7 @@ README.md ``` 支持的选项包括 -``` +```bash --after-index '0' 在指定 index 之前一直监测 --recursive 返回所有的键值和子键值 ``` @@ -265,7 +262,7 @@ README.md 通过 list、add、remove 命令列出、添加、删除 etcd 实例到 etcd 集群中。 例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。 -``` +```bash $ etcdctl member list ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001 diff --git a/image/build.md b/image/build.md index a81da46..af402a3 100644 --- a/image/build.md +++ b/image/build.md @@ -16,7 +16,7 @@ $ touch Dockerfile 其内容为: -```Dockerfile +```dockerfile FROM nginx RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html ``` @@ -35,7 +35,7 @@ RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html 除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。 -```Dockerfile +```dockerfile FROM scratch ... ``` @@ -58,7 +58,7 @@ RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html 既然 `RUN` 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样: -```Dockerfile +```dockerfile FROM debian:jessie RUN apt-get update @@ -79,7 +79,7 @@ RUN make -C /usr/src/redis install 上面的 `Dockerfile` 正确的写法应该是这样: -```Dockerfile +```dockerfile FROM debian:jessie RUN buildDeps='gcc libc6-dev make' \ diff --git a/kubernetes/concepts.md b/kubernetes/concepts.md index ad00937..ba70e89 100644 --- a/kubernetes/concepts.md +++ b/kubernetes/concepts.md @@ -37,7 +37,7 @@ 节点并非Kubernetes创建,而是由云平台创建,或者就是物理机器、虚拟机。在Kubernetes中,节点仅仅是一条记录,节点创建之后,Kubernetes会检查其是否可用。在Kubernetes中,节点用如下结构保存: -``` +```json { "id": "10.1.2.3", "kind": "Minion", diff --git a/repository/config.md b/repository/config.md index 7c0b04c..be1c95e 100644 --- a/repository/config.md +++ b/repository/config.md @@ -18,14 +18,14 @@ Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor) 用户也可以添加自定义的模版段。 默认情况下使用的模板是 `dev`,要使用某个模板作为默认值,可以添加 `SETTINGS_FLAVOR` 到环境变量中,例如 -``` +```bash export SETTINGS_FLAVOR=dev ``` 另外,配置文件中支持从环境变量中加载值,语法格式为 `_env:VARIABLENAME[:DEFAULT]`。 ### 示例配置 -``` +```yml common: loglevel: info search_backend: "_env:SEARCH_BACKEND:" diff --git a/repository/local_repo.md b/repository/local_repo.md index 569b0ac..f0367f1 100644 --- a/repository/local_repo.md +++ b/repository/local_repo.md @@ -8,12 +8,12 @@ ### 安装运行 docker-registry #### 容器运行 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。 -``` +```bash $ docker run -d -p 5000:5000 registry ``` 这将使用官方的 registry 镜像来启动本地的私有仓库。 用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。 -``` +```bash $ docker run \ -e SETTINGS_FLAVOR=s3 \ -e AWS_BUCKET=acme-docker \ @@ -25,7 +25,7 @@ $ docker run \ registry ```` 此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。 -``` +```bash $ docker run -d \ -p 5000:5000 \ -v /home/user/registry-conf:/registry-conf \ @@ -34,7 +34,7 @@ $ docker run -d \ ``` 默认情况下,仓库会被创建在容器的 `/var/lib/registry `(v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。 例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。 -``` +```bash $ docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ @@ -45,7 +45,7 @@ $ docker run -d \ 创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000`。 先在本机查看已有的镜像。 -``` +```bash $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB @@ -53,7 +53,7 @@ ubuntu 14.04 ba5877dc9bec 6 week ``` 使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。 -``` +```bash $ docker tag ba58 192.168.7.26:5000/test root ~ # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE @@ -62,7 +62,7 @@ ubuntu latest ba5877dc9bec 6 week 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB ``` 使用 `docker push` 上传标记的镜像。 -``` +```bash $ docker push 192.168.7.26:5000/test The push refers to a repository [192.168.7.26:5000/test] (len: 1) Sending image list @@ -76,14 +76,14 @@ Image ba5877dc9bec already pushed, skipping Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest} ``` 用 curl 查看仓库中的镜像。 -``` +```bash $ curl http://192.168.7.26:5000/v1/search {"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]} ``` 这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上传了。 现在可以到另外一台机器去下载这个镜像。 -``` +```bash $ docker pull 192.168.7.26:5000/test Pulling repository 192.168.7.26:5000/test ba5877dc9bec: Download complete @@ -104,7 +104,7 @@ REPOSITORY TAG IMAGE ID CREAT ```yaml version: "3.4" services: - + ubuntu: image: 127.0.0.1:5000/ubuntu:latest centos: diff --git a/swarm/scheduling.md b/swarm/scheduling.md index 83be863..072803e 100644 --- a/swarm/scheduling.md +++ b/swarm/scheduling.md @@ -14,14 +14,14 @@ 在 `192.168.0.2` 节点启动管理服务,管理 token://946d65606f7c2f49766e4dddac5b4365 的集群。 -```sh +```bash $ docker run -d -p 12375:2375 swarm manage --strategy "spread" token://946d65606f7c2f49766e4dddac5b4365 c6f25e6e6abbe45c8bcf75ac674f2b64d5f31a5c6070d64ba954a0309b197930 ``` 列出集群中节点。 -```sh +```bash $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 192.168.0.3:2375 192.168.0.2:2375 @@ -31,7 +31,7 @@ $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 启动一个 ubuntu 容器。 -```sh +```bash $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 bac3dfda5306181140fc959969d738549d607bc598390f57bdd432d86f16f069 ``` @@ -40,14 +40,14 @@ bac3dfda5306181140fc959969d738549d607bc598390f57bdd432d86f16f069 再次启动一个 ubuntu 容器。 -```sh +```bash $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 8247067ba3a31e0cb692a8373405f95920a10389ce3c2a07091408281695281c ``` 查看它的位置,发现被调度到了另外一个节点:`192.168.0.2` 节点。 -```sh +```bash $ docker -H 192.168.0.2:12375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8247067ba3a3 ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes Host-2/sick_galileo @@ -61,7 +61,7 @@ bac3dfda5306 ubuntu:14.04 "ping 127.0.0.1" 2 minutes ago 直接启动若干 ubuntu 容器,并查看它们的位置。 -```sh +```bash $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES @@ -70,4 +70,4 @@ CONTAINER ID IMAGE COMMAND CREATED 99c5a092530a ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/naughty_engelbart 4ab392c26eb2 ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/thirsty_mclean ``` -可以看到,所有的容器都是分布在同一个节点(`192.168.0.3`)上运行的。 \ No newline at end of file +可以看到,所有的容器都是分布在同一个节点(`192.168.0.3`)上运行的。 diff --git a/swarm/servicebackend.md b/swarm/servicebackend.md index f9042c0..5e009ec 100644 --- a/swarm/servicebackend.md +++ b/swarm/servicebackend.md @@ -17,7 +17,7 @@ Swarm 目前可以支持多种服务发现后端,这些后端功能上都是 首先,在 Swarm 管理节点(`192.168.0.2`)上新建一个文件,把要加入集群的机器的 Docker daemon 信息写入文件: -```sh +```bash $ tee /tmp/cluster_info <<-'EOF' 192.168.0.2:2375 192.168.0.3:2375 @@ -26,13 +26,13 @@ EOF 然后,本地执行 `swarm manage` 命令,并指定服务发现机制为本地文件,注意因为是容器方式运行 manager,需要将本地文件挂载到容器内。 -```sh +```bash $ docker run -d -p 12375:2375 -v /tmp/cluster_info:/tmp/cluster_info swarm manage file:///tmp/cluster_info ``` 接下来就可以通过使用 Swarm 服务来进行管理了,例如使用 info 查看所有节点的信息。 -```sh +```bash $ docker -H 192.168.0.2:12375 info Containers: 18 Images: 36 @@ -62,30 +62,30 @@ Name: e71eb5f1d48b 快速部署一个 consul 服务的命令为: -```sh +```bash $ docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap ``` 之后创建 Swarm 的管理服务,指定使用 consul 服务,管理端口监听在本地的 4000 端口。 -```sh +```bash $ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise :4000 consul://:8500 ``` Swarm 节点注册时候命令格式类似于: -```sh +```bash $ swarm join --advertise= consul:/// ``` 对于 etcd 服务后端来说,节点注册时候命令格式类似于: -```sh +```bash $ swarm join --addr= etcd://,/ ``` 启动管理服务时候,格式类似于: -```sh +```bash $ swarm manage -H tcp://:4000 etcd://,/ ``` @@ -94,4 +94,4 @@ $ swarm manage -H tcp://:4000 etcd://,/2375/tcp jovial_rosalind @@ -72,14 +72,14 @@ CONTAINER ID IMAGE COMMAND CREATED 集群启动成功以后,用户可以在任何一台节点上使用 `swarm list` 命令查看集群中的节点列表。例如 -```sh +```bash $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 192.168.0.2:2375 ``` 显示正是之前用 `swarm join` 命令加入集群的节点的地址。 我们在另外一台节点 `192.168.0.3` 上同样使用 `swarm join` 命令新加入一个节点: -```sh +```bash $docker run --rm swarm join --addr=192.168.0.3:2375 token://946d65606f7c2f49766e4dddac5b4365 time="2015-12-10T02:05:34Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.3:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365" ... @@ -87,7 +87,7 @@ time="2015-12-10T02:05:34Z" level=info msg="Registering on the discovery service 再次使用 `swarm list` 命令查看集群中的节点列表信息,可以看到新加入的节点: -```sh +```bash $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 192.168.0.3:2375 192.168.0.2:2375 @@ -102,14 +102,14 @@ $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 在任意节点上使用 `docker run` 来启动若干容器,例如 -```sh +```bash $docker -H 192.168.0.2:12375:12375 run -d ubuntu ping 127.0.0.1 4c9bccbf86fb6e2243da58c1b15e9378fac362783a663426bbe7058eea84de46 ``` 使用 `ps` 命令查看集群中正在运行的容器。 -```sh +```bash $ docker -H 192.168.0.2:12375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c9bccbf86fb ubuntu "ping 127.0.0.1" About a minute ago Up About a minute clever_wright @@ -121,7 +121,7 @@ CONTAINER ID IMAGE COMMAND CREATED 使用 info 查看所有节点的信息。 -```sh +```bash $ docker -H 192.168.0.2:12375 info Containers: 18 Images: 36 @@ -158,7 +158,7 @@ Swarm 为了支持跨主机的网络,默认采用了 `overlay` 网络类型, 以 consul 服务为例,可能类似: -```sh +```bash --cluster-store=consul://:8500 --cluster-advertise=192.168.0.3:2375 ``` @@ -166,13 +166,13 @@ Swarm 为了支持跨主机的网络,默认采用了 `overlay` 网络类型, 首先,创建一个网络。 -```sh +```bash $ docker -H 192.168.0.2:12375 network create swarm_network ``` 查看网络,将看到一个 overlay 类型的网络。 -```sh +```bash $ docker -H 192.168.0.2:12375 network ls NETWORK ID NAME DRIVER 6edf2d16ec97 swarm_network overlay