
原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2' services: elasticsearch: image: elasticsearch # command: elasticsearch ports: - "9200:9200" # REST API端口 - "9300:9300" # RPC端口 logstash: image: logstash command: logstash -f /etc/logstash/conf.d/logstash.conf volumes: - ./config:/etc/logstash/conf.d - /opt/build:/opt/build ports: - "5000:5000" kibana: image: kibana environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 ports: - "5601:5601" logstash.conf 参考示例: input { file { codec => json path => "/opt/build/*.json" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:severity}\s+\[%{DATA:service},%{DATA:trace},%{DATA:span},%{DATA:exportable}\]\s+%{DATA:pid}---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:rest}" } } } output { elasticsearch { hosts => "elasticsearch:9200" } } 参考文档 https://docs.docker.com/compose/samples-for-compose/#samples-tailored-to-demo-compose
编者按:这是一篇翻译,原文详见:https://docs.docker.com/compose/production/ 译文原文:http://www.itmuch.com/docker/27-docker-compose-in-production/,转载请说明出处。 在development中使用Compose定义应用程序时,可使用此定义,在不同环境(如CI,staging和production)中运行应用程序。 部署应用最简单的方法是在单机服务器上运行,类似于运行development环境的方式。如果要对应用程序扩容,可在Swarm集群上运行Compose应用程序。 Modify your Compose file for production(为生产环境修改您的Compose文件) 您几乎肯定会对您的应用配置进行更改,从而使这些配置更适合线上环境。 这些更改可能包括: 删除任何绑定到应用程序代码的Volume,以便代码保持在容器内,不能从外部更改 绑定到主机上的不同端口 设置不同的环境变量(例如,减少日志的冗长程度或启用email发送) DEBUG INFO WARN ERROR FETAL 指定重启策略(例如, restart: always ),从而避免停机 添加额外服务(例如,日志聚合器) 因此,您可能需要定义一个额外的Compose文件,比如production.yml ,它指定了适用于生产的配置。此配置文件只需包含从原始Compose文件的修改。该附加Compose文件,可在原始的docker-compose.yml 基础上被应用,从而创建新的配置。 一旦获得了第二个配置文件,可使用-f 选项告诉Compose: docker-compose -f docker-compose.yml -f production.yml up -d 请参阅 Using multiple compose files 获取更完整的示例。 Deploying changes(部署修改) 当您更改应用代码时,您需要重新构建镜像并重新创建容器。例如,重新部署名为web 的服务,可使用: $ docker-compose build web $ docker-compose up --no-deps -d web 这将会先重新构建web 的镜像,然后停止、销毁、重新创建web 服务。 --no-deps 标志可防止Compose重新创建任何web 依赖的服务。 Running Compose on a single server(单机服务器上运行Compose) 通过适当地设置DOCKER_HOST 、DOCKER_TLS_VERIFY 和DOCKER_CERT_PATH 等环境变量,可使用Compose将应用程序部署到远程的Docker主机。 对于像这样的任务,Docker Machine 可使本地/远程Docker主机管理变得非常简单,即使您没有远程部署也推荐使用Docker Machine。 一旦您设置了如上环境变量,所有正常的docker-compose 命令将无需进一步的配置。 Running Compose on a Swarm cluster(在Swarm集群上运行Compose) Docker Swarm ,是一款Docker原生的集群系统,它暴露了与单个Docker主机相同的API,这意味着您可在Swarm实例上使用Compose,并在多个主机上运行应用程序。 阅读更多关于集成指Compose/Swarm整合的内容,请详见 integration guide 。
原文:http://www.itmuch.com/docker/24-docker-compose-network/ ,转载请说明出处。 本节我们来详细探讨Compose的网络设置。本节介绍的网络特性仅适用于Version 2 file format,Version 1 file format不支持该特性。 基本概念 默认情况下,Compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。 默认情况下,应用程序的网络名称基于Compose的工程名称,而项目名称基于docker-compose.yml所在目录的名称。如需修改工程名称,可使用--project-name标识或COMPOSE_PORJECT_NAME环境变量。 举个例子,假如一个应用程序在名为myapp的目录中,并且docker-compose.yml如下所示: version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres 当我们运行docker-compose up时,将会执行以下几步: 创建一个名为myapp_default的网络; 使用web服务的配置创建容器,它以“web”这个名称加入网络myapp_default; 使用db服务的配置创建容器,它以“db”这个名称加入网络myapp_default。 容器间可使用服务名称(web或db)作为hostname相互访问。例如,web这个服务可使用postgres://db:5432 访问db容器。 更新容器 当服务的配置发生更改时,可使用docker-compose up命令更新配置。 此时,Compose会删除旧容器并创建新容器。新容器会以不同的IP地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。 links 前文讲过,默认情况下,服务之间可使用服务名称相互访问。links允许我们定义一个别名,从而使用该别名访问其他服务。举个例子: version: '2' services: web: build: . links: - "db:database" db: image: postgres 这样web服务就可使用db或database作为hostname访问db服务了。 指定自定义网络 一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用networks命令自定义网络。networks命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,我们还可使用networks将服务连接到不是由Compose管理的、外部创建的网络。 如下,我们在其中定义了两个自定义网络。 version: '2' services: proxy: build: ./proxy networks: - front app: build: ./app networks: - front - back db: image: postgres networks: - back networks: front: # Use a custom driver driver: custom-driver-1 back: # Use a custom driver which takes special options driver: custom-driver-2 driver_opts: foo: "1" bar: "2" 其中,proxy服务与db服务隔离,两者分别使用自己的网络;app服务可与两者通信。 由本例不难发现,使用networks命令,即可方便实现服务间的网络隔离与连接。 配置默认网络 除自定义网络外,我们也可为默认网络自定义配置。 version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1 这样,就可为该应用指定自定义的网络驱动。 使用已存在的网络 一些场景下,我们并不需要创建新的网络,而只需加入已存在的网络,此时可使用external选项。示例: networks: default: external: name: my-pre-existing-network
原文:http://www.itmuch.com/docker/23-docker-compose-commands/,转载请注明出处。 和docker命令一样,docker-compose命令也有很多选项。下面我们来详细探讨docker-compose的常用命令。 build 构建或重新构建服务。服务被构建后将会以project_service 的形式标记,例如:composetest_db 。 help 查看指定命令的帮助文档,该命令非常实用。docker-compose所有命令的帮助文档都可通过该命令查看。 docker-compose help COMMAND 示例: docker-compose help build # 查看docker-compose build的帮助 kill 通过发送SIGKILL 信号停止指定服务的容器。示例: docker-compose kill eureka 该命令也支持通过参数来指定发送的信号,例如: docker-compose kill -s SIGINT logs 查看服务的日志输出。 port 打印绑定的公共端口。示例: docker-compose port eureka 8761 这样就可输出eureka服务8761端口所绑定的公共端口。 ps 列出所有容器。示例: docker-compose ps 也可列出指定服务的容器,示例: docker-compose ps eureka pull 下载服务镜像。 rm 删除指定服务的容器。示例: docker-compose rm eureka run 在一个服务上执行一个命令。示例: docker-compose run web bash 这样即可启动一个web服务,同时执行bash命令。 scale 设置指定服务运行容器的个数,以service=num的形式指定。示例: docker-compose scale user=3 movie=3 start 启动指定服务已存在的容器。示例: docker-compose start eureka stop 停止已运行的容器。示例: docker-compose stop eureka 停止后,可使用docker-compose start 再次启动这些容器。 up 构建、创建、重新创建、启动,连接服务的相关容器。所有连接的服务都会启动,除非它们已经运行。 docker-compose up 命令会聚合所有容器的输出,当命令退出时,所有容器都会停止。 使用docker-compose up -d 可在后台启动并运行所有容器。 TIPS (1) 本节仅讨论常用的docker-compose命令,其他命令可详见Docker官方文档:https://docs.docker.com/compose/reference/overview/ 。
原文:http://www.itmuch.com/docker/22-docker-compose-yml-commands/ ,转载请注明出处。 docker-compose.yml是Compose的默认模板文件。该文件有多种写法,例如Version 1 file format、Version 2 file format、Version 2.1 file format、Version 3 file format等。其中,Version 1 file format将逐步被被弃用;Version 2.x及Version 3.x基本兼容,是未来的趋势。考虑到目前业界的使用情况,本节只讨论Version 2 file format下的常用命令。 (1) build 配置构建时的选项,Compose会利用它自动构建镜像。build的值可以是一个路径,例如: build: ./dir 也可以是一个对象,用于指定Dockerfile和参数,例如: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 (2) command 覆盖容器启动后默认执行的命令。示例: command: bundle exec thin -p 3000 也可以是一个list,类似于Dockerfile中的CMD指令,格式如下: command: [bundle, exec, thin, -p, 3000] (3) dns 配置dns服务器。可以是一个值,也可以是一个列表。示例: dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9 (4) dns_search 配置DNS的搜索域名,可以是一个值,也可以是一个列表。示例: dns_search: example.com dns_search: - dc1.example.com - dc2.example.com (5) environment 环境变量设置,可使用数组或字典两种方式。示例: environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET (6) env_file 从文件中获取环境变量,可指定一个文件路径或路径列表。如果通过 docker-compose -f FILE 指定了Compose文件,那么env_file中的路径是Compose文件所在目录的相对路径。使用environment指定的环境变量会覆盖env_file指定的环境变量。示例: env_file: .env env_file: - ./common.env # 共用 - ./apps/web.env # web用 - /opt/secrets.env # 密码用 (7) expose 暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。示例: expose: - "3000" - "8000" (8) external_links 连接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是提供共享或公共服务的容器。格式跟links类似,例如: external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql (9) image 指定镜像名称或镜像id,如果本地不存在该镜像,Compose会尝试下载该镜像。 示例: image: java (10) links 连接到其他服务的容器。可以指定服务名称和服务别名( SERVICE:ALIAS ),也可只指定服务名称。例如: web: links: - db - db:database - redis (11) networks 详见本书《Docker Compose网络设置》一节。 (12) network_mode 设置网络模式。示例: network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]" (13) ports 暴露端口信息,可使用HOST:CONTAINER 的格式,也可只指定容器端口(此时宿主机将会随机选择端口),类似于docker run -p 。 需要注意的是,当使用HOST:CONTAINER 格式映射端口时,容器端口小于60将会得到错误的接口,因为yaml会把xx:yy 的数字解析为60进制。因此,建议使用字符串的形式。示例: ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" (14) volumes 卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) ,也可指定访问模式 (HOST:CONTAINER:ro)。示例: volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume - datavolume:/var/lib/mysql (15) volumes_from 从另一个服务或容器挂载卷。可指定只读(ro)或读写(rw),默认是读写(rw)。示例: volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw TIPS (1) docker-compose.yml还有很多其他命令,比如depends_on、pid、devices等。限于篇幅,笔者仅挑选常用的命令进行讲解,其他命令不作赘述。感兴趣的读者们可参考官方文档:https://docs.docker.com/compose/compose-file/ 。