diff --git a/SUMMARY.md b/SUMMARY.md index 6f334cd..bc393d6 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -87,7 +87,7 @@ * [YAML 模板文件](compose/yaml_file.md) * [实战 Django](compose/django.md) * [实战 Rails](compose/rails.md) - * [实战 wordpress](compose/wordpress.md) + * [实战 WordPress](compose/wordpress.md) * [Docker 三剑客之 Machine 项目](machine/README.md) * [安装](machine/install.md) * [使用](machine/usage.md) diff --git a/compose/README.md b/compose/README.md index 0892ff7..cac62b6 100644 --- a/compose/README.md +++ b/compose/README.md @@ -1,4 +1,5 @@ # Docker Compose 项目 + Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。 本章将介绍 Compose 项目情况以及安装和使用。 diff --git a/compose/commands.md b/compose/commands.md index e42de91..e386d80 100644 --- a/compose/commands.md +++ b/compose/commands.md @@ -7,17 +7,22 @@ Compose 命令的基本的使用格式是 -```sh +```bash docker-compose [-f=...] [options] [COMMAND] [ARGS...] ``` ### 命令选项 * `-f, --file FILE` 指定使用的 Compose 模板文件,默认为 `docker-compose.yml`,可以多次指定。 + * `-p, --project-name NAME` 指定项目名称,默认将使用所在目录名称作为项目名。 -* `--x-networking` 使用 Docker 的可拔插网络后端特性(需要 Docker 1.9 及以后版本)。 -* `--x-network-driver DRIVER` 指定网络后端的驱动,默认为 `bridge`(需要 Docker 1.9 及以后版本)。 + +* `--x-networking` 使用 Docker 的可拔插网络后端特性 + +* `--x-network-driver DRIVER` 指定网络后端的驱动,默认为 `bridge` + * `--verbose` 输出更多调试信息。 + * `-v, --version` 打印版本并退出。 ### 命令使用说明 @@ -34,7 +39,9 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] 选项包括: * `--force-rm` 删除构建过程中的临时容器。 + * `--no-cache` 构建镜像过程中不使用 cache(这将加长构建过程)。 + * `--pull` 始终尝试通过 pull 来获取更新版本的镜像。 #### `help` @@ -48,7 +55,7 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] 支持通过 `-s` 参数来指定发送的信号,例如通过如下指令发送 `SIGINT` 信号。 -```sh +```bash $ docker-compose kill -s SIGINT ``` @@ -72,6 +79,7 @@ $ docker-compose kill -s SIGINT 选项: * `--protocol=proto` 指定端口协议,tcp(默认值)或者 udp。 + * `--index=index` 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。 #### `ps` @@ -81,7 +89,7 @@ $ docker-compose kill -s SIGINT 选项: -* `-q` 只打印容器的 ID 信息。 +* `-q` 只打印容器的 ID 信息。 #### `pull` 格式为 `docker-compose pull [options] [SERVICE...]`。 @@ -109,6 +117,7 @@ $ docker-compose kill -s SIGINT 选项: * `-f, --force` 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。 + * `-v` 删除容器所挂载的数据卷。 #### `run` @@ -118,7 +127,7 @@ $ docker-compose kill -s SIGINT 例如: -```sh +```bash $ docker-compose run ubuntu ping docker.com ``` @@ -131,11 +140,12 @@ $ docker-compose run ubuntu ping docker.com 两个不同点: * 给定命令将会覆盖原有的自动运行命令; + * 不会自动创建端口,以避免冲突。 如果不希望自动启动关联的容器,可以使用 `--no-deps` 选项,例如 -```sh +```bash $ docker-compose run --no-deps web python manage.py shell ``` @@ -144,14 +154,23 @@ $ docker-compose run --no-deps web python manage.py shell 选项: * `-d` 后台运行容器。 + * `--name NAME` 为容器指定一个名字。 + * `--entrypoint CMD` 覆盖默认的容器启动指令。 + * `-e KEY=VAL` 设置环境变量值,可多次使用选项来设置多个环境变量。 + * `-u, --user=""` 指定运行容器的用户名或者 uid。 + * `--no-deps` 不自动启动关联的服务容器。 + * `--rm` 运行命令后自动删除容器,`d` 模式下将忽略。 + * `-p, --publish=[]` 映射容器端口到本地主机。 + * `--service-ports` 配置服务端口并映射到本地主机。 + * `-T` 不分配伪 tty,意味着依赖 tty 的指令将无法运行。 #### `scale` @@ -161,7 +180,7 @@ $ docker-compose run --no-deps web python manage.py shell 通过 `service=num` 的参数来设置数量。例如: -```sh +```bash $ docker-compose scale web=3 db=2 ``` @@ -212,11 +231,17 @@ $ docker-compose scale web=3 db=2 选项: * `-d` 在后台运行服务容器。 + * `--no-color` 不使用颜色来区分不同的服务的控制台输出。 + * `--no-deps` 不启动服务所链接的容器。 + * `--force-recreate` 强制重新创建容器,不能与 `--no-recreate` 同时使用。 + * `--no-recreate` 如果容器已经存在了,则不重新创建,不能与 `--force-recreate` 同时使用。 + * `--no-build` 不自动构建缺失的服务镜像。 + * `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。 #### `migrate-to-labels` @@ -231,4 +256,4 @@ $ docker-compose scale web=3 db=2 #### `version` 格式为 `docker-compose version`。 -打印版本信息。 \ No newline at end of file +打印版本信息。 diff --git a/compose/demo/compose-haproxy-web/docker-compose.yml b/compose/demo/compose-haproxy-web/docker-compose.yml new file mode 100644 index 0000000..46c0841 --- /dev/null +++ b/compose/demo/compose-haproxy-web/docker-compose.yml @@ -0,0 +1,29 @@ +version: "3" +services: + + weba: + build: ./web + expose: + - 80 + + webb: + build: ./web + expose: + - 80 + + webc: + build: ./web + expose: + - 80 + + haproxy: + image: haproxy:latest + volumes: + - ./haproxy:/haproxy-override + - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro + ports: + - "80:80" + - "70:70" + expose: + - "80" + - "70" diff --git a/compose/demo/compose-haproxy-web/haproxy/haproxy.cfg b/compose/demo/compose-haproxy-web/haproxy/haproxy.cfg new file mode 100644 index 0000000..99251ed --- /dev/null +++ b/compose/demo/compose-haproxy-web/haproxy/haproxy.cfg @@ -0,0 +1,32 @@ +global + log 127.0.0.1 local0 + log 127.0.0.1 local1 notice + +defaults + log global + mode http + option httplog + option dontlognull + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + +listen stats + bind 0.0.0.0:70 + stats enable + stats uri / + +frontend balancer + bind 0.0.0.0:80 + mode http + default_backend web_backends + +backend web_backends + mode http + option forwardfor + balance roundrobin + server weba weba:80 check + server webb webb:80 check + server webc webc:80 check + option httpchk GET / + http-check expect status 200 diff --git a/compose/demo/compose-haproxy-web/web/Dockerfile b/compose/demo/compose-haproxy-web/web/Dockerfile new file mode 100644 index 0000000..d0e74cd --- /dev/null +++ b/compose/demo/compose-haproxy-web/web/Dockerfile @@ -0,0 +1,5 @@ +FROM python:2.7 +WORKDIR /code +ADD . /code +EXPOSE 80 +CMD python index.py diff --git a/compose/demo/compose-haproxy-web/web/index.py b/compose/demo/compose-haproxy-web/web/index.py new file mode 100644 index 0000000..d274ec9 --- /dev/null +++ b/compose/demo/compose-haproxy-web/web/index.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +#authors: yeasy.github.com +#date: 2013-07-05 + +import sys +import BaseHTTPServer +from SimpleHTTPServer import SimpleHTTPRequestHandler +import socket +import fcntl +import struct +import pickle +from datetime import datetime +from collections import OrderedDict + +class HandlerClass(SimpleHTTPRequestHandler): + def get_ip_address(self,ifname): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + return socket.inet_ntoa(fcntl.ioctl( + s.fileno(), + 0x8915, # SIOCGIFADDR + struct.pack('256s', ifname[:15]) + )[20:24]) + def log_message(self, format, *args): + if len(args) < 3 or "200" not in args[1]: + return + try: + request = pickle.load(open("pickle_data.txt","r")) + except: + request=OrderedDict() + time_now = datetime.now() + ts = time_now.strftime('%Y-%m-%d %H:%M:%S') + server = self.get_ip_address('eth0') + host=self.address_string() + addr_pair = (host,server) + if addr_pair not in request: + request[addr_pair]=[1,ts] + else: + num = request[addr_pair][0]+1 + del request[addr_pair] + request[addr_pair]=[num,ts] + file=open("index.html", "w") + file.write("

HA Webpage Visit Results

") + for pair in request: + if pair[0] == host: + guest = "LOCAL: "+pair[0] + else: + guest = pair[0] + if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d %H:%M:%S')).seconds < 3: + file.write("

#"+ str(request[pair][1]) +": "+str(request[pair][0])+ " requests " + "from <"+guest+"> to WebServer <"+pair[1]+">

") + else: + file.write("

#"+ str(request[pair][1]) +": "+str(request[pair][0])+ " requests " + "from <"+guest+"> to WebServer <"+pair[1]+">

") + file.write(" ") + file.close() + pickle.dump(request,open("pickle_data.txt","w")) + +if __name__ == '__main__': + try: + ServerClass = BaseHTTPServer.HTTPServer + Protocol = "HTTP/1.0" + addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1] + port = len(sys.argv) < 3 and 80 or int(sys.argv[2]) + HandlerClass.protocol_version = Protocol + httpd = ServerClass((addr, port), HandlerClass) + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + except: + exit() diff --git a/compose/demo/django/.gitignore b/compose/demo/django/.gitignore new file mode 100644 index 0000000..b96b637 --- /dev/null +++ b/compose/demo/django/.gitignore @@ -0,0 +1 @@ +django_example diff --git a/compose/demo/django/Dockerfile b/compose/demo/django/Dockerfile new file mode 100644 index 0000000..b45a393 --- /dev/null +++ b/compose/demo/django/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3 +ENV PYTHONUNBUFFERED 1 +RUN mkdir /code +WORKDIR /code +ADD requirements.txt /code/ +RUN pip install -r requirements.txt +ADD . /code/ diff --git a/compose/demo/django/docker-compose.yml b/compose/demo/django/docker-compose.yml new file mode 100644 index 0000000..2648aff --- /dev/null +++ b/compose/demo/django/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3" +services: + + db: + image: postgres + + web: + build: . + command: python3 manage.py runserver 0.0.0.0:8000 + volumes: + - .:/code + ports: + - "8000:8000" + links: + - db diff --git a/compose/demo/django/manage.py b/compose/demo/django/manage.py new file mode 100755 index 0000000..cb19182 --- /dev/null +++ b/compose/demo/django/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_example.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) diff --git a/compose/demo/django/requirements.txt b/compose/demo/django/requirements.txt new file mode 100644 index 0000000..71d0fbc --- /dev/null +++ b/compose/demo/django/requirements.txt @@ -0,0 +1,2 @@ +Django>=1.8,<2.0 +psycopg2 diff --git a/compose/demo/wordpress/docker-compose.yml b/compose/demo/wordpress/docker-compose.yml new file mode 100644 index 0000000..264aa67 --- /dev/null +++ b/compose/demo/wordpress/docker-compose.yml @@ -0,0 +1,27 @@ +version: "3" +services: + + db: + image: mysql:5.7 + volumes: + - db_data:/var/lib/mysql + restart: always + environment: + MYSQL_ROOT_PASSWORD: somewordpress + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + + wordpress: + depends_on: + - db + image: wordpress:latest + ports: + - "8000:80" + restart: always + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: wordpress + WORDPRESS_DB_PASSWORD: wordpress +volumes: + db_data: diff --git a/compose/django.md b/compose/django.md index 9b93c82..8d962f2 100644 --- a/compose/django.md +++ b/compose/django.md @@ -1,12 +1,15 @@ ## 使用 Django -我们现在将使用 Docker Compose 配置并运行一个 `Django/PostgreSQL` 应用。 +本小节内容适合 Python 开发人员阅读。 + +我们现在将使用 `Docker Compose` 配置并运行一个 `Django/PostgreSQL` 应用。 + +在一切工作开始前,需要先编辑好三个必要的文件。 -在一切工作开始前,需要先设置好三个必要的文件。 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: ```docker -FROM python:2.7 +FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code @@ -14,16 +17,16 @@ ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/ ``` -以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。 -第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名 。 +以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像。更多关于如何编写 `Dockerfile` 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [ Dockerfile 使用](../dockerfile/README.md)。 + +第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名。 ```bash -Django +Django>=1.8,<2.0 psycopg2 ``` -就是这么简单。 第三步,`docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。 ```yaml @@ -32,9 +35,10 @@ services: db: image: postgres + web: build: . - command: python manage.py runserver 0.0.0.0:8000 + command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: @@ -42,14 +46,16 @@ services: links: - db ``` + 查看 [`docker-compose.yml` 章节](yml_ref.md) 了解更多详细的工作机制。 -现在我们就可以使用 `docker-compose run` 命令启动一个 Django 应用了。 +现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了。 ```bash $ docker-compose run web django-admin.py startproject django_example . ``` -Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject django_example . ` 指令。 + +Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject composeexample` 指令。 这将在当前目录生成一个 Django 应用。 @@ -57,12 +63,19 @@ Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使 $ ls Dockerfile docker-compose.yml django_example manage.py requirements.txt ``` -首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。 + +如果你的系统是 Linux,记得更改文件权限。 ```bash +sudo chown -R $USER:$USER . +``` + +首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。 + +```python DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', @@ -70,28 +83,36 @@ DATABASES = { } } ``` -这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。 -然后,运行 `docker-compose up` : + +这些信息是在 [postgres](https://store.docker.com/images/postgres/) 镜像固定设置好的。然后,运行 `docker-compose up` : ```bash -Recreating myapp_db_1... -Recreating myapp_web_1... -Attaching to myapp_db_1, myapp_web_1 -myapp_db_1 | -myapp_db_1 | PostgreSQL stand-alone backend 9.1.11 -myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: database system is ready to accept connections -myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: autovacuum launcher started -myapp_web_1 | Validating models... -myapp_web_1 | -myapp_web_1 | 0 errors found -myapp_web_1 | January 27, 2014 - 12:12:40 -myapp_web_1 | Django version 1.6.1, using settings 'django_example.settings' -myapp_web_1 | Starting development server at http://0.0.0.0:8000/ -myapp_web_1 | Quit the server with CONTROL-C. -``` -这个 web 应用已经开始在你的 docker 守护进程里监听着 5000 端口了。 +$ docker-compose up -你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可: +django_db_1 is up-to-date +Creating django_web_1 ... +Creating django_web_1 ... done +Attaching to django_db_1, django_web_1 +db_1 | The files belonging to this database system will be owned by user "postgres". +db_1 | This user must also own the server process. +db_1 | +db_1 | The database cluster will be initialized with locale "en_US.utf8". +db_1 | The default database encoding has accordingly been set to "UTF8". +db_1 | The default text search configuration will be set to "english". + +web_1 | Performing system checks... +web_1 | +web_1 | System check identified no issues (0 silenced). +web_1 | +web_1 | November 23, 2017 - 06:21:19 +web_1 | Django version 1.11.7, using settings 'django_example.settings' +web_1 | Starting development server at http://0.0.0.0:8000/ +web_1 | Quit the server with CONTROL-C. +``` + +这个 `Django` 应用已经开始在你的 Docker 守护进程里监听着 `8000` 端口了。打开 `127.0.0.1:8000` 即可看到 Django 欢迎页面。 + +你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端进入文件夹运行以下命令即可: ```bash $ docker-compose run web python manage.py syncdb diff --git a/compose/install.md b/compose/install.md index 77c4d00..5612837 100644 --- a/compose/install.md +++ b/compose/install.md @@ -6,7 +6,31 @@ Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直 前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。 +Docker for macOS 、Docker for Windows 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。 + +```bash +$ docker-compose --version + +docker-compose version 1.17.1, build 6d101fb +``` + +Linux 系统请使用以下介绍的方法安装。 + +### 二进制包 + +官方定义编译好二进制包,供大家使用。这些发布的二进制包可以在 [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 页面下载。 + +这些二进制文件,下载后直接放到执行路径下,并添加执行权限即可。 + +```bash +$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose +$ sudo chmod a+x /usr/local/bin/docker-compose +``` + ### PIP 安装 + +*注:* `x86_64` 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您的架构是 `ARM` (例如,树莓派),再使用 pip 安装。 + 这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。 执行安装命令: @@ -16,81 +40,20 @@ $ sudo pip install -U docker-compose ``` 可以看到类似如下输出,说明安装成功。 + ```bash Collecting docker-compose - Downloading docker-compose-1.8.0.tar.gz (149kB): 149kB downloaded + Downloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded ... Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress ``` -安装成功后,可以查看 `docker-compose` 命令的用法。 -```bash -$ docker-compose -h -Define and run multi-container applications with Docker. - -Usage: - docker-compose [-f=...] [options] [COMMAND] [ARGS...] - docker-compose -h|--help - -Options: - -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) - -p, --project-name NAME Specify an alternate project name (default: directory name) - --x-networking (EXPERIMENTAL) Use new Docker networking functionality. - Requires Docker 1.9 or later. - --x-network-driver DRIVER (EXPERIMENTAL) Specify a network driver (default: "bridge"). - Requires Docker 1.9 or later. - --verbose Show more output - -v, --version Print version and exit - -Commands: - build Build or rebuild services - help Get help on a command - kill Kill containers - logs View output from containers - pause Pause services - port Print the public port for a port binding - ps List containers - pull Pulls service images - restart Restart services - rm Remove stopped containers - run Run a one-off command - scale Set number of containers for a service - start Start services - stop Stop services - unpause Unpause services - up Create and start containers - migrate-to-labels Recreate containers to add labels - version Show the Docker-Compose version information -``` - -之后,可以添加 bash 补全命令。 +### bash 补全命令 ```bash $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose ``` -### 二进制包 -官方定义编译好二进制包,供大家使用。这些发布的二进制包可以在 [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) 页面找到。 - -这些二进制文件,下载后直接放到执行路径下,并添加执行权限即可。 - -例如,在 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` 命令来查看版本信息,以测试是否安装成功。 - -```bash -$ docker-compose version -docker-compose version 1.8.0, build 94f7016 -docker-py version: 1.9.0 -CPython version: 2.7.6 -OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014 -``` - ### 容器中执行 Compose 既然是一个 Python 应用,自然也可以直接用容器来执行它。 @@ -149,13 +112,14 @@ exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES 可以看到,它其实是下载了 `docker/compose` 镜像并运行。 ### 卸载 + 如果是二进制包方式安装的,删除二进制文件即可。 ```bash $ sudo rm /usr/local/bin/docker-compose ``` -如果是通过 python pip 工具安装的,则可以执行如下命令删除。 +如果是通过 python pip 安装的,则执行如下命令即可删除。 ```bash $ sudo pip uninstall docker-compose diff --git a/compose/introduction.md b/compose/introduction.md index 2b4254c..1cd3260 100644 --- a/compose/introduction.md +++ b/compose/introduction.md @@ -6,15 +6,16 @@ Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器 其代码目前在 [https://github.com/docker/compose](https://github.com/docker/compose) 上开源。 -Compose 定位是 “定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)”,其前身是开源项目 Fig,目前仍然兼容 Fig 格式的模板文件。 +Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。 -通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 +通过第一部分中的介绍,我们知道使用一个 `Dockerfile` 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 Compose 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Compose 中有两个重要的概念: * 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 + * 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 diff --git a/compose/rails.md b/compose/rails.md index adfe200..226a61c 100644 --- a/compose/rails.md +++ b/compose/rails.md @@ -1,7 +1,8 @@ ## 使用 Rail -我们现在将使用 Compose 配置并运行一个 Rails/PostgreSQL 应用。 +本小节内容适合 Ruby 开发人员阅读。 +我们现在将使用 Compose 配置并运行一个 Rails/PostgreSQL 应用。 在一切工作开始前,需要先设置好三个必要的文件。 首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: @@ -32,6 +33,7 @@ services: image: postgres ports: - "5432" + web: build: . command: bundle exec rackup -p 3000 diff --git a/compose/usage.md b/compose/usage.md index 6e26fdf..ef1e069 100644 --- a/compose/usage.md +++ b/compose/usage.md @@ -4,6 +4,7 @@ 首先介绍几个术语。 * 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。 + * 项目 (project):由一组关联的应用容器组成的一个完整业务单元。 可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。 @@ -144,11 +145,12 @@ backend web_backends http-check expect status 200 ``` ### docker-compose.yml -编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。 +编写 `docker-compose.yml` 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。 ```yaml version: "3" services: + weba: build: ./web expose: @@ -169,10 +171,6 @@ services: volumes: - ./haproxy:/haproxy-override - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro - links: - - weba - - webb - - webc ports: - "80:80" - "70:70" @@ -182,7 +180,7 @@ services: ``` ### 运行 compose 项目 -现在 compose-haproxy-web 目录结构如下: +现在 `compose-haproxy-web` 目录结构如下: ```bash compose-haproxy-web ├── docker-compose.yml @@ -206,5 +204,3 @@ Attaching to composehaproxyweb_webb_1, composehaproxyweb_webc_1, composehaproxyw 此时访问本地的 80 端口,会经过 haproxy 自动转发到后端的某个 web 容器上,刷新页面,可以观察到访问的容器地址的变化。 访问本地 70 端口,可以查看到 haproxy 的统计信息。 - -当然,还可以使用 consul、etcd 等实现服务发现,这样就可以避免手动指定后端的 web 容器了,更为灵活。 diff --git a/compose/wordpress.md b/compose/wordpress.md index 227377a..fbfdaf0 100644 --- a/compose/wordpress.md +++ b/compose/wordpress.md @@ -1,90 +1,47 @@ -## 使用 Wordpress +## 使用 WordPress + +本小节内容适合 PHP 开发人员阅读。 Compose 可以很便捷的让 Wordpress 运行在一个独立的环境中。 -首先下载 Wordpress 到当前目录: +### 创建空文件夹 -```bash -wordpress.org/latest.tar.gz | tar -xvzf - -``` -这将会创建一个叫 wordpress 目录,你也可以重命名成你想要的名字。在目录里面,创建一个 `Dockerfile` 文件,定义应用的运行环境: +假设新建一个名为 `wordpress` 的文件夹,然后进入这个文件夹。 -```docker -FROM orchardup/php5 -ADD . /code -``` -以上内容告诉 Docker 创建一个包含 PHP 和 Wordpress 的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。 +### 创建 `docker-compose.yml` 文件 - -下一步,`docker-compose.yml` 文件将开启一个 web 服务和一个独立的 MySQL 实例: +`docker-compose.yml` 文件将开启一个 `wordpress` 服务和一个独立的 `MySQL` 实例: ```yaml version: "3" services: - web: - build: . - command: php -S 0.0.0.0:8000 -t /code - ports: - - "8000:8000" - links: - - db - volumes: - - .:/code - db: - image: orchardup/mysql - environment: - MYSQL_DATABASE: wordpress -``` -要让这个应用跑起来还需要两个文件。 -第一个,`wp-condocker-compose.php` ,它是一个标准的 Wordpress 配置文件,有一点需要修改的是把数据库的配置指向 `db` 容器。 + db: + image: mysql:5.7 + volumes: + - db_data:/var/lib/mysql + restart: always + environment: + MYSQL_ROOT_PASSWORD: somewordpress + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress -```php -