说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
文章目录
一、实战部署WordPress
1.叙述
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。——具体详细说明请参考百度百科
通过实战部署WordPress来说明为什么要使用docker compose工具(或者说是使用docker compose必要性),博主在之前Docker
专栏下的《Docker-Machine工具本地的使用以及在阿里云ECS上的使用(2020实操图解)
》文章有讲过docker machine工具的使用。
补充一下
Linux三剑客:grep、sed、awk
Docker三剑客:machine、compose、Swarm
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工具部署后,看到部署后是一个什么效果)而不是用于线上生产环境.
评论前必须登录!
注册