码迷,mamicode.com
首页 > 其他好文 > 详细

docker-compose

时间:2016-08-19 22:23:21      阅读:661      评论:0      收藏:0      [点我收藏+]

标签:docker-compose 项目

Docker compose

 

Docker compose项目

技术分享 

Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker Compose 并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。

Docker Compose 是一个用来创建和运行多容器应用的工具。使用 Compose 首先需要编写Compose 文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有的容器。

Dockerfile 可以定义一个容器,而一个 Compose 的模板文件(YAML 格式)可以定义一个包含多个相互关联容器的应用。Compose 项目使用 python 编写

下面,我们创建一个经典的 Web 项目:一个 Haproxy,挂载三个 Web 容器。

创建一个 compose目录,作为项目工作目录,并在其中分别创建子目录haproxy web

tree .

.

├── docker-compose.yml

├── haproxy

   └── haproxy.cfg

├── web1

   ├── Dockerfile

   ├── dvd.repo

   └── index.html

├── web2

   ├── Dockerfile

   ├── dvd.repo

   └── index.html

└── web3

    ├── Dockerfile

    ├── dvd.repo

    └── index.html

 

1.下载docker-compose

可在官网上下载docker-compose-Linux-x86_64

将该文件放在/usr/local/bin

(1) 做连接

 ln -s docker-compose-Linux-x86_64 docker-compose

(2) 加执行权限

 chmod +x docker-compose

(3) 查看版本信息

 docker-compose -v

 docker -v

技术分享 

 

2.HA

(1) 安装软件

yum install -y haproxy

(2) 将配置文件移动到/mnt/test/compose/haproxy并修改文件

vim haproxy.cfg

--->

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

  stats uri /status

 

frontend balancer

    bind *:80

    mode http

    default_backend web_backends

 

backend web_backends

    mode http

    option forwardfor

    balance roundrobin

    server a web1:80 check

    server b web2:80 check

    server c web3:80 check

    option httpchk GET /

    http-check expect status 200

 

3. apache的测试页

做三个web1 web2 web3 ,做测试用

(1) vim Dockerfile

--->

FROM rhel7

MAINTAINER wj

ENV HOSTNAME web1

EXPOSE 80

COPY dvd.repo /etc/yum.repos.d/dvd.repo

RUN yum install -y httpd && yum clean all

ADD index.html /var/www/html

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

(2) vim dvd.repo

--->

[dvd]

name=rhel7.0

baseurl=http://172.17.23.1/rhel7.0

gpgcheck=0

enabled=1

(3) vim index.html

--->

web1.westos.org

 

三个测试页只有主机名和测试页的信息不同,其余完全一致

 

4. 编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件 。指定3web容器,以及 1 haproxy 容器  

vim docker-compose.yml

--->

web1:

        build: ./web1

        expose:

                - 80

 

web2:

        build: ./web2

        expose:

                - 80

 

web3:

        build: ./web3

        expose:

                - 80

 

haproxy:

        image: haproxy:latest

        volumes:

- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro

        links:

                - web1

                - web2

                - web3

  ports:

       - "8080:80"

  expose:

       - 80

 

 

注意:书写时一定要注意格式

 

5.运行

docker-compose up -d后台运行

技术分享 

 

6.测试

技术分享 

 

web2断掉时

    技术分享

 

 

技术分享 

 

技术分享 

 

 

附录:一些基本指令意思

Image:

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。

Build:

指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

eg:build: /path/to/build/dir

Command:

覆盖容器启动后默认执行的命令。

eg:command: bundle exec thin -p 3000

Links:

链接到其它服务中的容器使用服务名称 (同时作为别名)或服务名称:服务别名(SERVICE:ALIAS) 格式都可以。

eg:links:

- db

- db:database

- redis

使用的别名将会自动在服务容器中的 /etc/hosts 里创建。相应的环境变量也将被创建。

172.25.0.2 db

172.25.0.2 database

172.25.0.3 redis

external_links:

链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的容器。参数格式跟links 类似。

eg:external_links:

- redis_1

- project_db_1:mysql

- project_db_1:postgresql

Ports:

暴露端口信息。

使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

eg:ports:

- "3000"

- "8000:8000"

- "49100:22"

- "127.0.0.1:8001:8001"

:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

Expose:

暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数

eg:expose:

- "3000"

- "8000"

Volumes:

卷挂载路径设置可以设置宿主机路径( HOST:CONTAINER ) 或 加上访问模式(HOST:CONTAINER:ro)

eg:volumes:

- /var/lib/mysql

- cache/:/tmp/cache

- ~/configs:/etc/configs/:roVolumes_from:

从另一个服务或容器挂载它的所有卷。

volumes_from:

- service_name

- container_name

Environment:

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

eg:environment:

RACK_ENV: development

SESSION_SECRET:

environment:

- RACK_ENV=development

- SESSION_SECRET

env_file:

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 指定了模板文件,env_file 中路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。

eg:env_file: .env

env_file:

- ./common.env

- ./apps/web.env

- /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

 

eg:# common.env: Set Rails/Rack environment

RACK_ENV=development

Extends:

基于已有的服务进行扩展。例如我们已经有了一个webapp 服务 , 模板文件为common.yml

# common.yml

webapp:

build: ./webapp

environment:

- DEBUG=false

- SEND_EMAILS=false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

# development.yml

web:

extends:

file: common.yml

service: webapp

ports:

- "8000:8000"

links:

- db

environment:

- DEBUG=true

db:

image: postgres

后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。

Net:

设置网络模式。使用和 docker client 的 –net 参数一样的值。

net: "bridge"

net: "none"

net: "container:[name or id]"

net: "host"

Pid:

跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。

pid: "host"

Dns:

配置 DNS 服务器。可以是一个值,也可以是一个列表。

dns: 8.8.8.8

dns:

- 8.8.8.8

- 9.9.9.9

cap_add, cap_drop:

添加或放弃容器的 Linux 能力(Capabiliity)

eg:cap_add:

- ALL

cap_drop:

- NET_ADMIN

- SYS_ADMIN

dns_search:配置 DNS 搜索域。可以是一个值,也可以是一个列表。

dns_search: example.com

dns_search:

- domain1.example.com

- domain2.example.com

working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open,tty, cpu_shares这些都是和 docker run 支持的选项类似。

cpu_shares: 73

working_dir: /code

entrypoint: /code/entrypoint.sh

user: postgresql

hostname: foo

domainname: foo.com

mem_limit: 1000000000

privileged: true

restart: always

stdin_open: true

tty: true

大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,命令则应用在项目所有的服务上。

执行 docker-compose [COMMAND] help 查看具体某个命令的使用说明。

基本的使用格式是

docker-compose [options] [COMMAND] [ARGS...]

选项

verbose 输出更多调试信息。

version 打印版本并退出。

-f, file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml

-p, project-name NAME 指定项目名称,默认使用目录名称。

 

命令Buil构建或重新构建服务。

服务一旦构建后,将会带上一个标记名,例如 web_db

可以随时在项目目录下运行 docker-compose build 来重新构建服务。

help获得一个命令的帮助。

kill通过发送 SIGKILL 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如

$ docker-compose kill -s SIGINT

logs查看服务的输出。

port打印绑定的公共端口。

pull拉取服务镜像。

run在一个服务上执行一个命令。

例如# docker-compose run ubuntu ping docker.com

将会启动一个 ubuntu 服务,执行 ping docker.com 命令。

默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。

该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。

两个不同点:

给定命令将会覆盖原有的自动运行命令;不会自动创建端口,以避免冲突。

如果不希望自动启动关联的容器,可以使用 –no-deps 选项,例如

$ docker-compose run --no-deps web python manage.py shell

将不会启动 web 容器所关联的其它容器。

scale设置同一个服务运行的容器个数。

通过 service=num 的参数来设置数量。例如:

$ docker-compose scale web=2 worker=3

 

Up构建,(重新)创建,启动,链接一个服务相关的容器。

链接的服务都将会启动,除非他们已经运行。

默认情况, docker-compose up 将会整合所有容器的输出,并且退出时,所有容器将会停止。

如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用 volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up no-recreate。如果需要的话,这样将会启动已经停止的容器。

 

环境变量环境变量可以用来配置 Compose 的行为。

DOCKER_ 开头的变量和用来配置Docker命令行客户端的使用 一样。如果使用boot2docker , $(boot2docker shellinit) 将会设置它们为正确的值。

COMPOSE_PROJECT_NAME设置通过 Compose 启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。

COMPOSE_FILE设置要使用的 docker-compose.yml 的路径。默认路径是当前工作目录。

DOCKER_HOST设置 Docker daemon 的地址。默认使用 unix:///var/run/docker.sock,Docker 客户端采用的默认值一致。

DOCKER_TLS_VERIFY如果设置不为空,则与 Docker daemon 交互通过 TLS 进行。

DOCKER_CERT_PATH配置TLS通信所需要的验证( ca.pem cert.pem key.pem ) 文 件 的 路 径 , 默 认 是~/.docker

 

以上操作来自课堂老师所讲

本文出自 “11841085” 博客,转载请与作者联系!

docker-compose

标签:docker-compose 项目

原文地址:http://11851085.blog.51cto.com/11841085/1840416

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!