前言
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置创建并启动所有服务。虽然现在Compose的使用不是非常广泛,大多数选择还是更倾向于k8s。但是对于一些不是很大的项目来说Compose依然还是可以去选择的。
传统的使用的docker
在传统的docker使用上,如果我们需要去部署一个springboot的项目,他依赖于redis、mysql等一些环境,我们就需要docker pull去拉取这些镜像,并且逐个去运行,使用起来还是非常不方便的,但是docker compose就能很好的帮助我们去解决这一问题,我们先来体验一下compose再来聊它。
安装docker compose
查看是否安装,如果没有安装请进行安装
docker-compose version
#1.下载
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
#2.添加权限信息
sudo chmod +x /usr/local/bin/docker-compose
首先看看传统方式使用
1、创建项目目录
mkdir composetest
cd composetest
2、创建app.py,并写入测试代码
touch 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)
3、新建requirements.txt文件,并写入
touch requirements.txt
vim requirements.txt
flask
redis
4、编写Dockerfile
touch 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
COPY . .
CMD ["flask", "run"]
5、根据Dockerfile生成image
docker build -t python-app-image .
6、查看镜像
7、获取redis的镜像
docker pull redis:alpine
8.创建 container
- 创建网络
docker network ls
docker network create --subnet=172.20.0.0/24 app-net
- 创建python程序的container,并指定网段和端口
docker run -d --name web -p 5000:5000 --network app-net python-app-image
- 创建redis的container,并指定网段
docker run -d --name redis --network app-net redis:alpine
7.访问 ip:5000,发现可以
使用compose来进行
在上面我们队docker compose已经进行了安装
我们删除上面所创建的images和container,但是保留我们创建的一些文件(Dockerfile那些文件)
docker rm -f $(docker ps -a -aq)
docker rmi $(docker images)
进入app.py所在的目录
touch docker-compose.yaml
vim docker-compose.yaml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
networks:
- app-net
redis:
image: "redis:alpine"
networks:
- app-net
networks:
app-net:
driver: bridge
通过docker-compose.yaml启动
docker-compose up -d
构建过程可能需要等待一会,构建成功后会帮我们创建所需要的images和container我们继续按照上面的访问进行访问ip:5000
发现能够访问,相比较传统的方式,使用
docker-compose.yaml/yml而言,要方便的很多。
docker-compose.yml
上述docker-compose的注释,当然远远不止这些,有兴趣的可以去看看相关语法。
(1)version: ‘3’ #表示docker-compose的版本
(2)services #一个service表示一个container
(3)networks #相当于docker network create app-net
(4)volumes #相当于-v v1:/var/lib/mysql
(5)image #表示使用哪个镜像,本地build则用build,远端则用image
(6)ports #相当于-p 8080:8080
(7)environment #相当于-e
docker-compose常见操作:
- 查看版本
docker-compose version
- 根据yml创建service
docker-compose up
–指定yaml:docker-compose up -f xxx.yaml
–后台运行:docker-compose up
- 查看启动成功的service:
docker-compose ps或者docker ps
- 查看images:
docker-compose images
- 停止/启动service:
docker-compose stop/start
- 删除service[同时会删除掉network和volume]:
docker-compose down
- 进入到某个service:
docker-compose exec redis sh
scale扩缩容
注意在使用扩容的同时,我们需要去掉docker-compose.yml/yaml文件service指定的端口号,因为是在单机中会造成端口占用问题。
停止之前的docker-compose.修改一下配置
version: '3'
services:
web:
build: .
networks:
- app-net
redis:
image: "redis:alpine"
networks:
- app-net
networks:
app-net:
driver: bridge
启动:
docker-compose up -d
扩容缩容
docker-compose up --scale web=5 -d
#查看容器
docker-compose ps
#查看日志
docker-compose logs web