第五课 Docker践行DevOps理念-docker-compose学习和实践
tags:
- Docker
- 慕课网
categories:
- docker-compose
- 水平拓展
- 负载均衡
文章目录
第一节 部署一个wordpress应用
- 这里我们使用wordpress 和 mysql两个镜像。
- 浏览器输入宿主机ip准备安装wordpress,出现
- Error establishing a database connection显然,数据库连接失败了,到底哪除了问题
- docker logs mysql
- 提示:The server requested authentication method unknown to the client认证方法错误,mysql8.0以后默认的认证方式改了,所以才会有这样的错误
- 解决办法一:
#进入mysql容器
docker exec -it mysql /bin/bash
#登陆数据库
mysql -u root -p
use mysql;
#开启root远程访问权限
grant all on *.* to 'root'@'%';
#修改加密规则
alter user 'root'@'localhost' identified by 'root' password expire never;
#更新密码
alter user 'root'@'%' identified with mysql_native_password by 'root';
#刷新权限
flush privileges;
- 解决办法二: 用mysql 5.6:
# 挂载数据库文件到磁盘/var/lib/mysql 不需要暴露端口 因为它只给wordpress访问
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.6
# 启动wordpress容器 将本地 8080 端口映射到容器内部的 80 端口
# 这里需要把虚拟机的8080映射到主机上8080上 输入127.0.0.1:8080
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_NAME=wordpress --link mysql -p 8080:80 wordpress
- 一个个手动创建容器还是太麻烦啦,如果容器过多还容易搞混。我们可以把它定义成一个组,进行统一的管理,运行和删除。
第二节 docker-compose
2.1 docker-compose介绍
- 多容器的应用部署起来太麻烦
- 要从Dockerfile build image或者Dockerhub拉取image
- 要创建多个container
- 要管理这些container (启动停止删除)
- Docker Compose‘ 批处理” 它是一个工具.
- 这个工具可以通过一个yml文件定义多容器的docker应用
- 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器
2.2 docker-compose.yml文件
-
docker-compose到现在为止有三个版本。
- 推荐用version3。version2也有版本支持。但是不要用version1(已经废弃)
- version2只能由于单机,version3可以用于多机
-
Services
- 一个service代表一个container ,这个container可以从dockerhub的image来创建, 或者从本地的Dockerfile构建出来的image来创建
- Service的启动类似docker run ,我们可以给其指定.network和volume ,所以可以给service指定network和Volume的引用
-
windows和mac不需要独立安装docker-compose。linux需要独立安装
- curl -L “https://github.com/docker/compose/releases/download/1.18.0/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
- 加速下载:sudo curl -L “https://get.daocloud.io/docker/compose/releases/download/1.18.0/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
- 给docker-compose执行权限,运行命令: chmod +x /usr/local/bin/docker-compose
- 检查,运行docker-compose --version
-
上面的应用可以部署如下:
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
- 查看docker-compose命令:docker-compose up --help
- 直接执行docker-compose up会默认从当前文件夹下找docker-compose.yml文件。
- 也可以指定文件启动。docker- compose -f docker-compose.yml up
# 不看log的 编排启动
docker-compose up -d
# 查看编排中的容器
docker-compose ps
# 查看编排用到的镜像
docker-compose images
# 停止编排中的容器
docker-compose stop
# 启动编排中的容器
docker-compose start
# 停止并删除编排中的容器 包括磁盘、网络、镜像、容器
docker-compose down
# 进入到编排的容器 mysql 中
docker-compose exec mysql bash
docker-compose exec wordpress bash
- flask-redis 构建自己的镜像的docker-compose.yml编排
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
第三节 水平拓展和负载均衡
- 如果直接使用上面的flask-redis进行编排,由于端口绑定的原因不能拓展。因为大家都是容器内5000。可以端口去掉进行测试(这里我们使用下面的方法)
- 使用下面文件部署一个docker-compose的编排容器。
- HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案。
- 通过命令:docker-compose up --scale web=3 -d (拓展成三个)
- 通过:curl 127.0.0.1:80 测试请求在哪个容器上
- 发现请求轮询到不同的容器上。
- 因为一台主机资源有限,如何在多台主机的cluster中,水平拓展。后面的swarm中会有讲到。
#app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80, debug=True)
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports: ["8080"]
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy
links:
- web
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
FROM python:2.7
LABEL maintaner="QnHyn@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
第四节 部署复杂的投票应用
- Results app是angular项目,Voting是python项目, work 是java项目。
- 直接 docker-compose up 运行
- 如果需要构建和下载的image过多,可以先docker-compose build。在运行
version: "3"
services:
voting-app:
build: ./voting-app/.
volumes:
- ./voting-app:/app
ports:
- "5000:80"
links:
- redis
networks:
- front-tier
- back-tier
result-app:
build: ./result-app/.
volumes:
- ./result-app:/app
ports:
- "5001:80"
links:
- db
networks:
- front-tier
- back-tier
worker:
build: ./worker
links:
- db
- redis
networks:
- back-tier
redis:
image: redis
ports: ["6379"]
networks:
- back-tier
db:
image: postgres:9.4
volumes:
- "db-data:/var/lib/postgresql/data"
networks:
- back-tier
volumes:
db-data:
networks:
front-tier:
back-tier: