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-pip
,python-dev
,libffi-dev
,openssl-dev
,gcc
,libc-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-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
查看sentinel
分别启动 进入redis 中
cd /usr/local/docker/redis
启动
sudo docker-compose up -d
进入sential
cd /usr/local/docker/sentinel/
启动
sudo docker-compose up -d
查看是否成功
docker ps