第五课 Docker践行DevOps理念-docker-compose学习和实践

第五课 Docker践行DevOps理念-docker-compose学习和实践

tags:

  • Docker
  • 慕课网

categories:

  • docker-compose
  • 水平拓展
  • 负载均衡

第一节 部署一个wordpress应用

  1. 这里我们使用wordpress 和 mysql两个镜像。
  2. 浏览器输入宿主机ip准备安装wordpress,出现
    • Error establishing a database connection显然,数据库连接失败了,到底哪除了问题
    • docker logs mysql
    • 提示:The server requested authentication method unknown to the client认证方法错误,mysql8.0以后默认的认证方式改了,所以才会有这样的错误
  3. 解决办法一:
#进入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;
  1. 解决办法二: 用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
  1. 一个个手动创建容器还是太麻烦啦,如果容器过多还容易搞混。我们可以把它定义成一个组,进行统一的管理,运行和删除。

第二节 docker-compose

2.1 docker-compose介绍

  1. 多容器的应用部署起来太麻烦
    • 要从Dockerfile build image或者Dockerhub拉取image
    • 要创建多个container
    • 要管理这些container (启动停止删除)
  2. Docker Compose‘ 批处理” 它是一个工具.
    • 这个工具可以通过一个yml文件定义多容器的docker应用
    • 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器
      在这里插入图片描述

2.2 docker-compose.yml文件

在这里插入图片描述

  1. docker-compose到现在为止有三个版本。

    • 推荐用version3。version2也有版本支持。但是不要用version1(已经废弃)
    • version2只能由于单机,version3可以用于多机
  2. Services

    • 一个service代表一个container ,这个container可以从dockerhub的image来创建, 或者从本地的Dockerfile构建出来的image来创建
    • Service的启动类似docker run ,我们可以给其指定.network和volume ,所以可以给service指定network和Volume的引用
  3. 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
  4. 上面的应用可以部署如下:

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
  1. 查看docker-compose命令:docker-compose up --help
  2. 直接执行docker-compose up会默认从当前文件夹下找docker-compose.yml文件。
  3. 也可以指定文件启动。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
  1. flask-redis 构建自己的镜像的docker-compose.yml编排
version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis

第三节 水平拓展和负载均衡

  1. 如果直接使用上面的flask-redis进行编排,由于端口绑定的原因不能拓展。因为大家都是容器内5000。可以端口去掉进行测试(这里我们使用下面的方法)
  2. 使用下面文件部署一个docker-compose的编排容器。
    • HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案。
    • 通过命令:docker-compose up --scale web=3 -d (拓展成三个)
    • 通过:curl 127.0.0.1:80 测试请求在哪个容器上
    • 发现请求轮询到不同的容器上。
  3. 因为一台主机资源有限,如何在多台主机的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="[email protected]"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

第四节 部署复杂的投票应用

在这里插入图片描述

  1. Results app是angular项目,Voting是python项目, work 是java项目。
  2. 直接 docker-compose up 运行
  3. 如果需要构建和下载的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:
发布了61 篇原创文章 · 获赞 8 · 访问量 2795

猜你喜欢

转载自blog.csdn.net/aa18855953229/article/details/105375682
今日推荐