Docker 核心技术之Docker Compose
Docker Compose 简介
Docker Compose是什么?
Docker Compose是一个能一次性定义和管理多个Docker容器的工具。
详细地说:
- Compose中定义和启动的每一个容器都相当于一个服务(service)
- Compose中能定义和启动多个服务,且它们之间通常具有协同关系
管理方式:
- 使用YAML文件来配置我们应用程序的服务。
- 使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。
Docker Compose 工作原理

Docker Compose安装
Docker for Mac与Docker for Windows自带docker-compose
Linux下需要单独安装:
第一步:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
第二步:
sudo chmod +x /usr/local/bin/docker-compose
终端中使用 docker-compose --version 查看安装的版本
docker-compose --version

这里示例安装版本是1.21.2,很可能您看到这里时,已经出现更新的版本,因此建议换成最新版本。查看最新版本。
其他安装方法查看
https://docs.docker.com/compose/install/#install-compose
Docker Compose CLI
利用docker-compose --help 查看
docker-compose --help

或者查看官方文档
https://docs.docker.com/compose/reference/overview/
对比后会发现:Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的。最主要的区别就是前者能一次性运行管理多个容器,后者只能一次管理一个。
了解 Docker Compose File
Docker Compose File 有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有。
https://docs.docker.com/compose/compose-file/
在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本

Docker Compose File TOP配置参数概览
Docker Compose File 顶级配置项:
- version:指定Docker Compose File版本号 (很重要)
- services:定义多个服务并配置启动参数
- volumes:声明或创建在多个服务中共同使用的数据卷对象
- networks:定义在多个服务中共同使用的网络对象
- configs:声明将在本服务中要使用的一些配置文件
- secrets:声明将在本服务中要使用的一些秘钥、密码文件
- x-***:自定义配置。主要用于复用相同的配置。
更多详细配置
https://docs.docker.com/compose/compose-file/#service-configuration-reference
Docker Compose File 参考示例

Docker Compose 案例一 小型web服务项目搭建
项目结构如下

不知道镜像的版本的话,可以去 git 上找,网址如下
https://github.com/docker-library/docs
步骤:
- 搭建一个flask的小型web项目
- 根据项目环境,利用Dockerfile构建镜像
- 撰写docker-compose.yaml配置文件,启动项目
创建项目的工作目录
mkdir workspace cd workspace mkdir case1-flask-web
撰写项目代码
vi flask-web-code/app.py
代码如下
# encoding=utf-8
import time
import redis
from flask import Flask
app = Flask(__name__)
# 此处host是docker-compose.yaml配置文件中 redis服务的名称
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
'''利用redis统计访问次数'''
retries = 5
# 由于当redis重启时,可能会有短暂时间无法访问redis
# 因此循环的作用就是在这个期间重试,默认重试5次
while True:
try:
# redis的incr方法,如果hits值存在则自动+1,否则新增该键,值为1
return cache.incr("hits")
except redis.execeptions.ConnectError as exec:
if retries == 0:
raise exec
retries -= 1
time.sleep(0.5)
@app.route("/")
def main():
count = get_hit_count()
return "欢迎访问!网站已经累计访问{}次\n".format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
app.py
配置需求文件
vi flask-web-code/requirements.txt
配置如下
redis flask
requirements.txt
编写docker file文件
vi Dockerfile
内容如下
# flask web app v1.0 # 搭建一个基于 flask 的 web项目,实现访问量统计 # 第一步:获取一个镜像 python3.6 FROM python:3.6-alpine LABEL Description="本镜像用于启动建议的基于flask的web程序" Author="Itcast" Version="1.0" # 第二部拷贝项目代码到镜像中 ADD COPY COPY ./flask-web-code /code # 第三部:安装项目的环境依赖 flask redis WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
构建镜像 在 Dockerfile 同级目录下输入以下命令
docker build . -t my-flask-image

查看构建的镜像
docker images

撰写 docker compose 文件
在 case1-flask-web 目录下创建 docker-compose.yaml 内容如下
version: '3.6'
services:
web:
build: .
ports:
- "5000:5000"
container_name: flask_web
networks:
- web
redis:
image: redis
volumes:
- redis-data:/data
container_name: redis
networks:
- web
volumes:
redis-data:
driver: local
networks:
web:
driver: "bridge"
检测 docker compose 配置是否正确
docker-compose config

启动容器
docker-compose up -d

访问服务
curl 127.0.0.1:5000

停止容器
docker-compose down

Docker Compose 案例二 单机环境ELK系统搭建
ELK工作原理介绍 官方文档
https://www.elastic.co/guide/index.html

步骤:
配置单机版的docker-compose.yaml文件(ELK镜像地址)
https://www.docker.elastic.co/
下载镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4 docker pull docker.elastic.co/kibana/kibana:6.2.4 docker pull docker.elastic.co/logstash/logstash:6.2.4
结构如下

官方的 elasticsearch 的compose 拷贝下来 ,保存到 docker-compose.yaml 中
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
利用 docker-compose up启动环境
docker-compose up -d

查看 compose log 日志
docker-compose logs

可以看到报了一个错误 virtual 太低了
这点在官方文档上就有说明

配置好后,再次启动
docker-compose down docker-compose up -d
再次查看日志
docker-compose logs -f
正常

访问 elas 服务
curl 127.0.0.1:9200

加入 logstash 到compose
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
container_name: logstash
networks:
- esnet
完整内容如下
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
container_name: logstash
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
启动多个容器
docker-compose up -d

加入 Kibana 到 compose 中
kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
container_name: kibana
ports:
- "5601:5601"
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
完整内容如下
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
container_name: logstash
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
container_name: kibana
ports:
- "5601:5601"
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
启动 compose
docker-compose up -d

在浏览器中输入
http://192.168.1.112:5601

再次网compose 中添加一个logstash 服务这时
elastic有两个服务,logstash 也有两个服务,一个kibana服务,此时compose 文件内容如下所示
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
container_name: logstash
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
logstash2:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
container_name: logstash2
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
container_name: kibana
ports:
- "5601:5601"
networks:
- esnet
depends_on:
- elasticsearch
- elasticsearch2
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
Docker Compose 多主机环境ELK系统搭建
Swarm 介绍

集群版Docker Compose工作原理

步骤
- 使用docker swarm配置多个docker node集群节点
- 配置集群版ELK的docker-compose.yaml文件
- 利用docker stack deploy部署集群版ELK环境
官方文档
https://docs.docker.com/engine/reference/commandline/swarm/
初始化 swarm
docker swarm init

这个保存下来
docker swarm join --token SWMTKN-1-3kulbpf51q5gmtl8hoa2bow2x9ea1pcx6ficg1w2tntrami4f7-cqgtgc5vf8b449sio740pqrh9 192.168.1.112:2377
只需在另一个服务器上执行上面的即可
查看 节点
docker node ls

swarm-elk.yaml
version: '3.6'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
deploy:
placement:
constraints:
- node.role == manager
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
volumes:
- esdata2:/usr/share/elasticsearch/data
networks:
- esnet
deploy:
placement:
constraints:
- node.role == worker
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
networks:
- esnet
deploy:
replicas: 2
logstash2:
image: docker.elastic.co/logstash/logstash:6.2.4
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
networks:
- esnet
deploy:
replicas: 2
kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
ports:
- "5601:5601"
networks:
- esnet
deploy:
placement:
constraints:
- node.role == manager
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
driver: "overlay"
docker stack deploy 启动
docker stack deploy -h

docker stack deploy -c swarm-elk.yaml elk

查看所有服务
docker service ls

查看一个服务的日志
docker service logs elk_elasticsearch -f

把所有启动的服务都删掉
docker stack rm elk

Docker 核心技术之Docker Compose的更多相关文章
- Docker(四):Docker 三剑客之 Docker Compose
前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...
- Docker 核心技术与实现原理
提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...
- Docker三剑客之Docker Compose
一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...
- [Docker] Converting from Docker Compose to Kubernetes
kompose is a tool to help users who are familiar with docker-compose move to Kubernetes. kompose tak ...
- Docker核心技术
Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...
- 后端技术杂谈10:Docker 核心技术与实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- docker核心技术(2)
鸟瞰容器生态系统 一谈到容器,大家都会想到 Docker. Docker 现在几乎是容器的代名词.确实,是 Docker 将容器技术发扬光大.同时,大家也需要知道围绕 Docker 还有一个生态系统. ...
- Docker深入浅出系列 | Docker Compose多容器实战
目录 前期准备 Docker Compose是什么 为什么要用Docker Compose Docker Compose使用场景 Docker Compose安装 Compose Yaml文件结构 C ...
随机推荐
- Locust性能测试学习总结
Locust学习总结分享 简介: Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具,它非常容易使用,也非常好学.它的主要思想就是模拟一群用户将访问你的网站.每 ...
- 1.1专题介绍「深入浅出ASP.NET Core系列」
大家好,我是IT人张飞洪,专注于.NET平台十年有余. 工作之余喜欢阅读和写作,学习的内容包括数据结构/算法.网络技术.Linux系统原理.数据库技术原理,设计模式.前沿架构.微服务.容器技术等等…… ...
- 2.3Options建立配置和实体的映射「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. Startup.cs中创建MVC中间件 关键代码:services.AddMvc();app.UseMvcWith ...
- Java基础之 反射是什么?
什么是反射,反射能干嘛? 反射是:指程序可以访问.检测和修改它本身状态或行为的一种能力 反射是一种能力,所以给的定义就是说明了它能干嘛. 我们平时用反射主要做: 获取类型的相关信息 动态调用方法 动态 ...
- Writing a Simple Service and Client (C++)
此前说的publisher/subscriber都是广播式的,subscriber被动地接收消息,二者没有request/response这种交互. Service Node Client Node ...
- SpringMVC与Struts2的主要区别
区别1: Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilterSpringMvc的核心是基于一个Servlet即DispatcherServlet( ...
- 超大文本文件浏览器Snaptext,支持不限制大小的文本文件浏览
文本文件超过1G就很少有软件可以打开了,超过10G就只有有限的几个可以打开了,那20G.30G.100G呢? Snaptext超大文本浏览器,应该是世界上最快速的文本文件浏览器,它支持基本不限制大小的 ...
- 太嚣张了!他竟用Python绕过了“验证码”
在web页面中,经常会遇到验证码,这对于我这么一个热爱web自动化测试人员,就变成了一件头疼的事.于是千方百计找各种资源得到破解简单的验证码方法. 识别验证码 大致分如下几个步骤: 1.获取验证码图片 ...
- Java通过JDBC连接数据库的三种方式!!!并对数据库实现增删改查
前言 java连接数据库完整流程为: 1,获得驱动(driver),数据库连接(url),用户名(username),密码(password)基本信息的三种方式. 2,通过获得的信息完成JDBC实现连 ...
- c/c++ 继承与多态 文本查询的小例子(智能指针版本)
为了更好的理解继承和多态,做一个文本查询的小例子. 接口类:Query有2个方法. eval:查询,返回查询结果类QueryResult rep:得到要查询的文本 客户端程序的使用方法: //查询包含 ...