陶刚的博客
与你分享我的点滴

Docker Compose多容器部署(实操演示2020)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

一、实战部署WordPress

1.叙述

WordPress是使用PHP语言开发的博客平台,用户可以在支持PHPMySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。——具体详细说明请参考百度百科

通过实战部署WordPress来说明为什么要使用docker compose工具(或者说是使用docker compose必要性),博主在之前Docker
专栏下的《Docker-Machine工具本地的使用以及在阿里云ECS上的使用(2020实操图解)
》文章有讲过docker machine工具的使用。

补充一下
Linux三剑客:grepsedawk
Docker三剑客:machinecomposeSwarm

2.具体实现

1. 在docker hub中存在wordpress和mysql image,可以直接通过docker pull拉取到本机即可
在这里插入图片描述
在这里插入图片描述
2. 博主之前已经拉取过mysql:5.7 image了,这里只需要拉取wordpress image即可

docker pull wordpress

在这里插入图片描述
3. 在创建mysql和wordpress容器之前,可以在docker hub上查看这两个image创建容器支持的环境变量参数
在这里插入图片描述
在这里插入图片描述
4. 创建mysql容器并设置mysql的密码、创建数据库、以及mysql数据映射

docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=wordpress mysql:5.7

在这里插入图片描述
5. 创建wordpress容器,并link到mysql容器中,这样就能相互通信,并且将wordpress80端口映射到本地8080
在这里插入图片描述
6. 接下来访问linux主机ip+8080端口,则出现wordpress安装界面,说明部署成功
在这里插入图片描述
7. 接下来点击继续,安装wordpress即可
在这里插入图片描述
8. 安装完成后,登录后进入wordpress
在这里插入图片描述
9. 之前博主部署过flask-web应用以及刚部署的wordpress应用,像这类应用以及需要更多容器或者说更多模块(环境)搭建的web应用,那么在创建容器的时候需要一个个的去创建就比较麻烦,再者管理这些容器或模块(启动、停止、删除)整个过程也是比较麻烦的,如果将类似这些需要多容器(模块)的应用定义成一个group(组)的话,并且可以对这个group进行一个统一的管理(启动、停止、删除)这样就比较舒服了,那么此时就需要用到docker compose工具了

二、Docker Compose File

1.简介

  • docker compose是用于定义和运行多容器docker应用程序的工具。
  • 这个工具可以通过一个yml文件定义多容器的docker应用。
  • 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器

Compose工具使用的三个步骤:

  • 使用Dockerfile定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

docker-compose.yml三大概念:

  • Services
  • Networks
  • volumes

1.docker官方文档可以查看docker-compose.yml
示例

version: '2.0'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

2. 在docker官网查看compose file
文件的版本和升级,目前有三个version
在这里插入图片描述
3. 不同版本的compose file对应不同版本的docker engine
在这里插入图片描述
4. compose file 2.x 版本 与 compose file 3.x版本的区别是,version 2.x只能用于单机,而version 3.x可用于单机和多机,当我们通过version 2.x定义一个app,然后通过docker-compose去启动这个app,那么这个app所包含的多个容器只能运行在同一台linux机器上;如果通过version 3.x去定义一个app,那么可以将这个app所包含的多个容器分别部署到不同的docker host上面(这个需要使用docker 三剑客中的Swarm),三个版本的compose file格式以及里面东西都不一样,具体可以在官网
上查阅即可。

2.Services

  • 一个service代表一个container,这个container可以从docker hub的image来进行创建,或者从本地通过Dockerfile build出来的image进行创建
  • service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和volume的引用

举例1

docker-compose.yml中的services配置如下,从docker hub上拉去postgres:9.4版本的image

version: '3.0'
services:
  db:
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - back-tier

以上对应的docker command如下

docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

举例2

docker-compose.yml中的services配置如下,从通过本地worker目录下的Dockerfile去build一个image

version: '3.0'
services:
  worker:
    build: ./worker
    links:
      - db
      - redis
    networks:
      - back-tier

3.Volumes

举例

docker-compose.yml文件配置如下,在db下的volumes引用了名为db-data的volume目录,这个volume目录是通过与db同级的volumes来定义的名为db-data的volume

version: '3.0'
services:
  db:
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - back-tier
  volumes:
    db-data:

4.Networks

举例

同理跟volumes一样,在worker下的networks引用了与services同级下的networks定义的基于bridge的back-tier

version: '3.0'
services:
  worker:
    build: ./worker
    links:
      - db
      - redis
    networks:
      - back-tier
  networks:
    front-tier:
      driver: bridge
    back-tier:
      driver: bridge

以上对应的docker command如下

docker network create -d bridge back-tier

5.compose file实例

定义两个service,分别是wordpress和mysql,在wordpress下包含镜像、端口映射、环境变量以及网络,在mysql下包含镜像、环境变量、数据挂载以及网络,wordpress和mysql这两个service都是使用的是基于bridge driver 名为my-bridge的network
在这里插入图片描述

三、Docker Compose安装与基本使用

1.docker-compose安装

1. 首先肯定是在docker官网查看安装文档

在这里插入图片描述
2. 根据以上官方文档得知在windows和mac上安装Docker Desktop for Windos(Docker Toolbox )和Docker Desktop for Mac时会包括Compose和其他Docker应用程序,所以直接在终端输入docker-compose –version即可验证
在这里插入图片描述
3. 在linux系统上安装了docker,则只是安装docker相关应用而不会包含compose工具
在这里插入图片描述
4. 安装方法根据官方提供的linux环境安装compose文档来进行安装即可
在这里插入图片描述
5. 由于官方提供的下载源是github的,所以下载速度特别慢,可以进行换源下载

sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

在这里插入图片描述

2.docker-compose基本使用

1. 在终端上输入docker-compose直接回车即可看到该工具支持的命令参数
在这里插入图片描述
2. 通过以下的docker-compose.yml文件,创建运行容器
在这里插入图片描述
3. 查看运行的容器,通过docker-compose ps命令与docker ps道理一样,只是docker-compose ps是查看通过docker-compose工具创建运行的容器而不是所有正在运行的容器
在这里插入图片描述
4. 停止docker-compose运行的容器以及启动容器,最后查看network中通过docker-compose工具创建的bridge
在这里插入图片描述
5. 通过docker-compose down命令,停止正在运行的容器并进行删除以及删除其容器创建的network
在这里插入图片描述
6. 通过-d参数让docker-compose up命令创建的容器日志在后台执行,这样使用就比较方便,同时通过docker-compose images来查看docker-compose工具创建的容器所使用的image
在这里插入图片描述
7. 通过docker-compose exec进入到容器bash中
在这里插入图片描述
8. 根据之前通过Dockerfile构建的的flask-redis容器,这里创建docker-compose.yml文件,在yml文件中去使用Dockerfile来创建web service的服务
在这里插入图片描述
9. 通过docker-compose up命令创建容器并运行
在这里插入图片描述
10. 通过在浏览器访问启动的flask app web程序,可以发现对应在docker-compose up创建运行容器日志中会记录访问的次数
在这里插入图片描述

四、水平扩展&&负载均衡

1.水平扩展

1. 创建服务并在后台运行
在这里插入图片描述
2. 查看docker-compose以及docker-compose up帮助,可以看到scale命令参数,该命令参数是指通过docker-compose.yml文件中设置service容器的个数
在这里插入图片描述
3. 通过docker-compose up –scale web=3 -d命令,创建3个web service,因为目前已经创建并运行了一个web service,所以只会新创建第二个和第三个,在创建web_2和web_3时提示error,原因是端口已经分配了,因为在yml文件中web service的配置中将容器的5000端口转发到本地的8080端口,所以再次创建相同的web service则会报错
在这里插入图片描述
4. down掉docker-compose创建运行的容器,删除yml中的端口绑定,重新尝试即可创建成功
在这里插入图片描述
5. 创建10个web service,创建也是非常快的,每个web service都会去访问这一个redis服务
在这里插入图片描述

2.负载均衡

1. 多个web service实现负载均衡,如下图所示,当创建运行多个web服务监听本地的某个端口,都去访问同一个redis服务,如果前面有一个负载均衡器去将每个请求均衡的分配到每个web服务器上,那么通过每个请求对应的web服务器来访问redis服务,从而就可以实现负载均衡减少单个redis服务器的压力(传统的方式是增加多台服务器)
在这里插入图片描述
2. 修改之前的Dockerfile文件中暴露的端口号为80,以及docker-compose中容器的端口号为80,并且添加了lb服务,这个服务就是以上中的负载均衡器
在这里插入图片描述
3. down掉之前创建的10个web服务,然后切换到lb-scale目录,创建运行容器
在这里插入图片描述
4. 通过curl工具访问本地8080端口,然后创建三个web 服务,再通过curl工具拉取会发现每次访问的hostname也就是web容器的地址是不一样,因为只有三个web 容器,所有会进行遍历访问
在这里插入图片描述
5. 创建5个web service,然后通过循环脚本去执行10条curl拉取命令,可以看到每次的hostname都是不一样的,这样就成功实现多个web service达到负载均衡的访问
在这里插入图片描述
6. 可以增加web容器,同样也可以减少,只需要设置scale的数量小于当前的web数量即可
在这里插入图片描述

五、投票应用的部署

1.应用架构

1.如下图该应用是需要5个部分组成,其中Voting App和Results App这两个应用是暴露给用户的,首先Voting App和Results Ap都是一个web app,Results Ap是显示候选人列表,而Results App是显示一个投票结果的,将Voting App投票结果缓存到redis中,通过Java的一个worker读取redis中的缓存数据并写入到PG database中,最后Results App从PG database数据库中将数据实时读取并显示到页面
在这里插入图片描述
2. 整个目录结构如下,其中result-app是由js项目,voting-app是由python flask项目,worker是由java项目
在这里插入图片描述
3. 分别查看result-app、voting-app以及worker目录下的Dockerfile文件
在这里插入图片描述
4. 查看docker-compose.yml文件,解释一下networks之所以配置两个,是因为voting-app和result-app要展示给用户所有这两个service单独配置了front-tier network,配置back-tier是为了与worker、redis、db进行互相通信,front-tier和back-tier没有配置driver所以默认为bridge driver
在这里插入图片描述

2.应用部署

1. 直接执行docker-compose up命令即可创建运行yml中的services,因为需要从docker hub去拉取镜像,所以时间上会比较长,在创建执行worker目录下的Dockerfile时报错了,报错是安装maven插件的错误(因为无法从maven的重要仓库区下载插件)
在这里插入图片描述
2. 以上解决办法是需要在本地创建maven的setting.xml及settings.xml配置文件去覆盖掉容器中的/usr/share/maven/conf/目录下的setting.xml和settings.xml配置文件即可(也就是把url修改成aliyun的maven地址,因为这样就可以解决无法下载的情况)
在这里插入图片描述
3. 再次执行docker-compose up,成功创建并运行docker-compose.yml文件中的service
在这里插入图片描述
4. 测试访问centos本机5000端口的投票页面以及5001端口的投票结果页面
在这里插入图片描述
5. 在执行docker-compose up时会先对docker-compose.yml文件中定义的services下的image以及Dockerfile文件中定义的image进行docker build,等待image build完成后才会执行第二步,所以就会存在docker-compose build命令,这个命令只会对docker-compose.yml文件中的所有的image进行pull以及build,不会进行其他的操作,当执行完docker-compose build后,再去执行docker-compose up就不会再去build image了(相当于说docker-compose up命令就是将build 和 up一起执行了,而docker-compose build只去拉取build image,build image后再执行docker-compose up就只会执行image除外的命令);docker-compose工具是适用于本地应用的开发环境(在本地使用docker-compose工具部署后,看到部署后是一个什么效果)而不是用于线上生产环境.

赞(0) 打赏
版权声明:本文为CSDN博主「cdtaogang」的原创文章,遵循CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接及本声明:记录学习生活 » Docker Compose多容器部署(实操演示2020)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏