7. Docker-Compose

7.1 介绍

7.1.1 概念

Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

7.1.2 安装

安装官网

https://docs.docker.com/compose/install/

安装在centos 上

  • 需要以下安装环境
    py-pippython-devlibffi-devopenssl-devgcclibc-dev,和make
  • 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

建议使用备用地址

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • 设置权限
sudo chmod +x /usr/local/bin/docker-compose
  • 设置快捷方式
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • 检查是否成功
docker-compose --version

如果下载太慢的话,使用这个

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

或者直接使用pip 安装

centos7 可以选择如下安装

yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version

centos8 需要使用pip3 命令安装

sudo pip3 install docker-compose

7.2 使用

  • 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
  • 定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
  • 运行 docker-compose up Compose启动并运行您的整个应用程序。

docker-compose.yml 长成这样子

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

7.2.1 快速开始

mkdir composetest
cd composetest

创建app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

同目录下创建requirements.txt

flask
redis

创建Dockerfile

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

内容讲解

从Python 3.7映像开始构建映像。
将工作目录设置为/code。
设置flask命令使用的环境变量。
安装gcc和其他依赖项
复制requirements.txt并安装Python依赖项。
向图像添加元数据以描述容器正在侦听端口5000
将.项目中的当前目录复制到.映像中的工作目录。
将容器的默认命令设置为flask run。

创建docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

目录

docker教程_7 Docker-Compose_linux

启动

docker-compose up

观察连接

http://localhost:5000/

7.2.2 搭建自己的博客wordpress

mkdir my_wordpress
cd   my_wordpress

创建 docker-compose.yml

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

启动项目

docker-compose up -d

7.2.3 搭建redis 集群

抄袭别人的

mkdir -p docker/redis docker/sentinel
cd docker/redis
touch docker-compose.yml

下一步编辑docker-compose.yml

version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass 123456
    ports:
      - 6379:6379

  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6380:6379
    command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456

  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6381:6379
    command: redis-server --slaveof redis-master 6379  --requirepass 123456 --masterauth 123456

进入

cd ../sentinel
touch docker-compose.yml sentinel.conf

编辑docker-compose.yml

version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf

  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
      - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf

  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf

编辑 sentinel.conf

port 26379
dir /tmp
sentinel monitor mymaster 172.19.55.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster 123456

注意点

① 第三行中 mymaster 是可以自定义集群的名字,如果使用其他语言连接集群,需要写上该名字。

② 192.168.223.129是我虚拟机的ip,请换成自己的ip,不要127.0.0.1 否则会链接到你的应用程序去,写IP就可以。

③ 那个2呢,是因为我有3台哨兵,2个投票超过50%了,所以设置2即可,如果是更多,设置超过50%概率就好,自己喜欢。

复制

sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf

docker教程_7 Docker-Compose_docker_02

查看sentinel

docker教程_7 Docker-Compose_linux_03

分别启动 进入redis 中

cd /usr/local/docker/redis

启动

sudo docker-compose up -d

进入sential

cd /usr/local/docker/sentinel/

启动

sudo docker-compose up -d

查看是否成功

docker ps