前言

实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。

我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有需要一个配置文件,负责实现对Docker容器集群的快速编排。

docker-compose

简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

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

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

安装

docker-compose使用pip安装即可

pip install docker-compose

使用docker-compose version查看版本

[root@yoyo ~]# docker-compose version
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
docker-compose version 1.24.1, build 4667896
docker-py version: 3.7.3
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
[root@yoyo ~]#

实例

docker-compose.yml文件

docker-compose已经安装成功,接下来去https://hub.docker.com上找个项目部署练练手,项目地址:https://hub.docker.com/r/easymock/easymock

docker-compose 文件内容

version: '3'

services:
mongodb:
image: mongo:3.4
volumes:
# ./data/db 数据库文件存放地址,根据需要修改为本地地址
- './data/db:/data/db'
networks:
- easy-mock
restart: always redis:
image: redis:4.0.6
command: redis-server --appendonly yes
volumes:
# ./data/redis redis 数据文件存放地址,根据需要修改为本地地址
- './data/redis:/data'
networks:
- easy-mock
restart: always web:
image: easymock/easymock:1.6.0
command: /bin/bash -c "npm start"
ports:
- 7300:7300
volumes:
# 日志地址,根据需要修改为本地地址
- './logs:/home/easy-mock/easy-mock/logs'
# 配置地址,请使用本地配置地址替换
# - './production.json:/home/easy-mock/easy-mock/config/production.json'
networks:
- easy-mock
restart: always networks:
easy-mock:

在本地新建一个文件夹/root/easymock,接着新建文件docker-compose.yml,把上面的内容写入到这个文件里,如下步骤

[root@yoyo ~]# mkdir /root/easymock
[root@yoyo ~]# cd /root/easymock/
[root@yoyo easymock]# touch docker-compose.yml
[root@yoyo easymock]# vi docker-compose.yml
[root@yoyo easymock]# cat docker-compose.yml
version: '3' services:
mongodb:
image: mongo:3.4
volumes:
# ./data/db 数据库文件存放地址,根据需要修改为本地地址
- './data/db:/data/db'
networks:
- easy-mock
restart: always redis:
image: redis:4.0.6
command: redis-server --appendonly yes
volumes:
# ./data/redis redis 数据文件存放地址,根据需要修改为本地地址
- './data/redis:/data'
networks:
- easy-mock
restart: always web:
image: easymock/easymock:1.6.0
command: /bin/bash -c "npm start"
ports:
- 7300:7300
volumes:
# 日志地址,根据需要修改为本地地址
- './logs:/home/easy-mock/easy-mock/logs'
# 配置地址,请使用本地配置地址替换
# - './production.json:/home/easy-mock/easy-mock/config/production.json'
networks:
- easy-mock
restart: always networks:
easy-mock: [root@yoyo easymock]#

docker-compose up启动

使用docker-compose up 指令启动服务,可以看到依次启动三个容器

  • Creating easymock_redis_1 ... done
  • Creating easymock_mongodb_1 ... done
  • Creating easymock_web_1 ... done
[root@yoyo easymock]# docker-compose up
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
Creating network "easymock_easy-mock" with the default driver
Pulling mongodb (mongo:3.4)...
3.4: Pulling from library/mongo
f7277927d38a: Pull complete
8d3eac894db4: Pull complete
edf72af6d627: Pull complete
3e4f86211d23: Pull complete
5747135f14d2: Pull complete
f56f2c3793f6: Pull complete
f8b941527f3a: Pull complete
4000e5ef59f4: Pull complete
b2229b3c9065: Pull complete
63e3700b27e5: Pull complete
a77f0e7057fd: Pull complete
4ea8e2e4c04b: Pull complete
3214e739257b: Pull complete
d05fd2e6729f: Pull complete
Digest: sha256:0264d096073b0a862586cfe9a4a8d1a41e206b447d5f1043f241177d9cc70b7d
Status: Downloaded newer image for mongo:3.4
Pulling redis (redis:4.0.6)...
4.0.6: Pulling from library/redis
c4bb02b17bb4: Pull complete
58638acf67c5: Pull complete
f98d108cc38b: Pull complete
83be14fccb07: Pull complete
5d5f41793421: Pull complete
ed89ff0d9eb2: Pull complete
Digest: sha256:0e773022cd6572a5153e5013afced0f7191652d3cdf9b1c6785eb13f6b2974b1
Status: Downloaded newer image for redis:4.0.6
Pulling web (easymock/easymock:1.6.0)...
1.6.0: Pulling from easymock/easymock
7e6591854262: Pull complete
089d60cb4e0a: Pull complete
9c461696bc09: Pull complete
45085432511a: Pull complete
70a7567bd8cf: Pull complete
0f7e44bf28f5: Pull complete
523067e58a08: Pull complete
35e77c0527fd: Pull complete
0df0b0c81b8b: Pull complete
cd5e5a709bf4: Pull complete
d50e2d78de99: Pull complete
Digest: sha256:37d50204c694eb4e50a7ba66406736bc1ae631e0e230abf77573d5ed154fb5a2
Status: Downloaded newer image for easymock/easymock:1.6.0
Creating easymock_redis_1 ... done
Creating easymock_mongodb_1 ... done
Creating easymock_web_1 ... done

如果看到以下报错,permission denied, open 'logs/2019-08-18-info.log',给log文件夹加个权限即可

chmod 777 /root/easymock/logs/

web_1      | WARNING: NODE_ENV value of 'production' did not match any deployment config file names.
web_1 | WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode
web_1 | server started at http://0.0.0.0:7300
web_1 | events.js:182
web_1 | throw er; // Unhandled 'error' event
web_1 | ^
web_1 |
web_1 | Error: EACCES: permission denied, open 'logs/2019-08-18-info.log'
web_1 | npm ERR! code ELIFECYCLE
web_1 | npm ERR! errno 1
web_1 | npm ERR! easy-mock@1.6.0 start: `cross-env NODE_ENV=production node app`
web_1 | npm ERR! Exit status 1
web_1 | npm ERR!
web_1 | npm ERR! Failed at the easy-mock@1.6.0 start script.
web_1 | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
web_1 |
web_1 | npm ERR! A complete log of this run can be found in:
web_1 | npm ERR! /home/easy-mock/.npm/_logs/2019-08-18T15_02_51_366Z-debug.log

接着浏览器输入http://ip:7300/即可访问了

docker-compose挂后台运行

挂后台运行需加-d参数

docker-compose up -d

查看正在启动的docker容器使用docker ps

[root@yoyo easymock]# docker-compose up -d
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
Starting easymock_mongodb_1 ... done
Starting easymock_web_1 ... done
Starting easymock_redis_1 ... done
[root@yoyo easymock]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
026f41a372cf easymock/easymock:1.6.0 "/bin/bash -c 'npm s…" 11 minutes ago Up 7 seconds 0.0.0.0:7300->7300/tcp easymock_web_1
5dbbb2086b1c redis:4.0.6 "docker-entrypoint.s…" 11 minutes ago Up 7 seconds 6379/tcp easymock_redis_1
f4772582dd03 mongo:3.4 "docker-entrypoint.s…" 11 minutes ago Up 7 seconds 27017/tcp easymock_mongodb_1
1d07763a6eaa tomcat "catalina.sh run" 7 weeks ago Up 5 weeks 0.0.0.0:8090->8080/tcp yoyotomcat
37a3b50d151c mysql:5.6 "docker-entrypoint.s…" 7 weeks ago Up 5 weeks 0.0.0.0:3308->3306/tcp mymysql
[root@yoyo easymock]#

docker-compose停止运行

停掉服务使用docker-compose down

docker-compose down

[root@yoyo easymock]# docker-compose down
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
Stopping easymock_web_1 ... done
Stopping easymock_redis_1 ... done
Stopping easymock_mongodb_1 ... done
Removing easymock_web_1 ... done
Removing easymock_redis_1 ... done
Removing easymock_mongodb_1 ... done
Removing network easymock_easy-mock
[root@yoyo easymock]#

docker学习6-docker-compose容器集群编排的更多相关文章

  1. docker(7)docker-compose容器集群编排

    前言 实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器. 我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有 ...

  2. 测试环境docker化—容器集群编排实践

    本文来自网易云社区 作者:孙婷婷 背景 在前文<测试环境docker化-基于ndp部署模式的docker基础镜像制作>中已经详述了docker镜像制作及模块部署的过程,按照上述做法已可以搭 ...

  3. Docker应用:Kubernetes(容器集群)

    阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...

  4. Win10上的Docker应用:Kubernetes(容器集群)

    阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...

  5. Docker容器集群管理之Swarm

    Docker容器集群管理主流方案 Swarm Docker公司自研发的集群管理系统. Kubernetes Google开源的一个容器集群管理系统,用于自动化部署.扩展和管理容器应用.也称为K8S ...

  6. Swarm容器集群管理(超详细)

    一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...

  7. Docker-Compose 容器集群的编排

    Docker-Compose 容器集群的编排 1.Docker-Compose 概述 2.Docker Compose 环境安装 Docker-Compose功能:  可以实现单机上的容器集群编排 1 ...

  8. Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET

    Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET undefined Package - crawler undefined 科学网- ...

  9. docker镜像创建redis5.0.3容器集群

    拉取redis5.0.3镜像 # docker pull daocloud.io/library/redis:5.0.3 [root@localhost ~]# docker pull daoclou ...

随机推荐

  1. 【数据集】WiderFace-A Face Detection Benchmark

    前言 参考 1.WiderFace; 完

  2. ufw防火墙规则不生效

    正式站系统是Ubuntu 16.04.6 一.今天一个项目有百度爬出,在nginx中封掉还在一直爬取,都403还不停爬取 二.在uwf封掉爬出ip,想封掉80端口没有用,然后封掉整个网段还是没有用,尴 ...

  3. 【MongoDB学习之四】索引 聚合 备份与恢复 监控

    环境 MongoDB 4.0 CentOS 6.5_x64 一.索引语法ensureIndex()方法基本语法格式如下所示:>db.COLLECTION_NAME.ensureIndex({KE ...

  4. kafka 如何保证数据不丢失

    一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会问到相关的问题.但凡遇到这种问题,是指3个方面的数据不丢失,即:producer consumer 端数据不丢失  b ...

  5. Java开发笔记(一百四十九)引入预报告的好处

    前面介绍了各种SQL语句的调用过程,虽然例子代码写死了每个SQL串,但是完全可以把查询条件作为方法参数传进来.比如现在想删除某个课程的教师记录,那么在编写删除方法时,就把课程名称作为该方法的一个输入参 ...

  6. 常用SQL指令

    SQL去重复语句:select 改为Delete select * from TRWTC01 where ITEM_NAME in (select ITEM_NAME from TRWTC01 gro ...

  7. Python 基础 while 循环

    Python 基础 while 循环 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 基本循环 while 条件: # 循环体 ...

  8. ODBC数据导入

    这个方法其实是导入excel 首先进入pl/sql dev (1):tools-->ODBC importer (2):点击connect,选择需要导入的excel (3):如果事先数据库中没有 ...

  9. golang --Converting and Checking Types

    package main import ( "fmt" "strconv" ) func main() { strVar := "100" ...

  10. windows 10 如何设定计划任务自动执行 python 脚本?

    我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中.之前我都是手动执行这些脚本,现在我希望如何这些脚本能自动定时执行. ...