pull/224/head
khs1994 2017-11-22 11:13:23 +08:00
parent c3c3cf98cb
commit 7cbdf27d93
30 changed files with 189 additions and 193 deletions

View File

@ -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)

View File

@ -3,7 +3,7 @@ Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
在容器中使用 mount 命令可以看到挂载信息:
```
```bash
$ mount
...
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...

View File

@ -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: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

View File

@ -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

View File

@ -8,7 +8,7 @@
### 使用方法
默认会启动一个最小化的 CentOS 环境。
```sh
```bash
$ docker run --name some-centos -i -t centos bash
bash-4.2#
```

View File

@ -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"'
```

View File

@ -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"'
```

View File

@ -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;`

View File

@ -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
```

View File

@ -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"'
```

View File

@ -8,7 +8,7 @@
### 使用方法
默认会启动一个最小化的 Ubuntu 环境。
```
```bash
$ docker run --name some-ubuntu -i -t ubuntu
root@523c70904d54:/#
```

View File

@ -8,7 +8,7 @@
### 使用方法
启动容器需要 MySQL 的支持,默认端口为 `80`
```
```bash
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
启动 WordPress 容器时可以指定的一些环境参数包括:

View File

@ -12,7 +12,7 @@ CentOSCommunity 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

View File

@ -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/`

View File

@ -15,7 +15,7 @@ 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
*

View File

@ -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
```

View File

@ -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
```

View File

@ -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 端口了。

View File

@ -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

View File

@ -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

View File

@ -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
```

View File

@ -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

View File

@ -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

View File

@ -16,7 +16,7 @@ $ touch Dockerfile
其内容为:
```Dockerfile
```dockerfile
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
@ -35,7 +35,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
```Dockerfile
```dockerfile
FROM scratch
...
```
@ -58,7 +58,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /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' \

View File

@ -37,7 +37,7 @@
节点并非Kubernetes创建而是由云平台创建或者就是物理机器、虚拟机。在Kubernetes中节点仅仅是一条记录节点创建之后Kubernetes会检查其是否可用。在Kubernetes中节点用如下结构保存
```
```json
{
"id": "10.1.2.3",
"kind": "Minion",

View File

@ -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:"

View File

@ -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

View File

@ -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

View File

@ -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 <manager_ip>:4000 consul://<consul_ip>:8500
```
Swarm 节点注册时候命令格式类似于:
```sh
```bash
$ swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
```
对于 etcd 服务后端来说,节点注册时候命令格式类似于:
```sh
```bash
$ swarm join --addr=<node_addr:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
```
启动管理服务时候,格式类似于:
```sh
```bash
$ swarm manage -H tcp://<manager_ip>:4000 etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
```

View File

@ -18,7 +18,7 @@
Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token用来标识要管理的集群。
```sh
```bash
$ docker run --rm swarm create
946d65606f7c2f49766e4dddac5b4365
```
@ -31,7 +31,7 @@ $ docker run --rm swarm create
例如某台机器 IP 地址为 `192.168.0.2`,将其加入我们刚创建的 `946d65606f7c2f49766e4dddac5b4365` 集群,则可以通过:
```sh
```bash
$ docker run --rm swarm join --addr=192.168.0.2:2375 token://946d65606f7c2f49766e4dddac5b4365
time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.2:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365"
...
@ -53,14 +53,14 @@ time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service
仍然在节点 `192.168.0.2` 进行操作。由于我们是采用 Docker 容器形式启动 manager 服务,本地的 `2375` 端口已经被 Docker Daemon 占用。我们将 manager 服务监听端口映射到本地一个空闲的 `12375` 端口。
```sh
```bash
$ docker run -d -p 12375:2375 swarm manage token://946d65606f7c2f49766e4dddac5b4365
1e1ca8c4117b6b7271efc693f9685b4e907d8dc95324350392b21e94b3cffd18
```
可以通过 `docker ps` 命令来查看启动的 swarm manager 服务容器。
```sh
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e1ca8c4117b swarm "/swarm manage token:" 11 seconds ago Up 10 seconds 0.0.0.0:12375->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://<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