commit
d3226aa818
|
@ -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)
|
||||
|
|
|
@ -3,7 +3,7 @@ Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容
|
|||
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
||||
|
||||
在容器中使用 mount 命令可以看到挂载信息:
|
||||
```
|
||||
```bash
|
||||
$ mount
|
||||
...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
### 使用方法
|
||||
默认会启动一个最小化的 CentOS 环境。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker run --name some-centos -i -t centos bash
|
||||
bash-4.2#
|
||||
```
|
||||
|
|
|
@ -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"'
|
||||
```
|
||||
|
||||
|
|
|
@ -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"'
|
||||
```
|
||||
|
||||
|
|
|
@ -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;`。
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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"'
|
||||
```
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
### 使用方法
|
||||
默认会启动一个最小化的 Ubuntu 环境。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-ubuntu -i -t ubuntu
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
### 使用方法
|
||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
||||
```
|
||||
启动 WordPress 容器时可以指定的一些环境参数包括:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/`
|
||||
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
|
|
@ -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 端口了。
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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' \
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
节点并非Kubernetes创建,而是由云平台创建,或者就是物理机器、虚拟机。在Kubernetes中,节点仅仅是一条记录,节点创建之后,Kubernetes会检查其是否可用。在Kubernetes中,节点用如下结构保存:
|
||||
|
||||
```
|
||||
```json
|
||||
{
|
||||
"id": "10.1.2.3",
|
||||
"kind": "Minion",
|
||||
|
|
|
@ -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:"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue