Docker Compose(单机使用)
介绍
以前使用Docker时
(一)写完项目后需要定义一个DockerFile
(二)通过DockerFile文件使用 docker build命令生产一个镜像
(三)通过run 命令去执行
上述流程全是手动操作,并且只能操作单个容器!
如果有个这样的案例
微服务。 100 个微服务!(就需要启动一百个项目,如果使用docker就需要每个去执行上述操作,而且每个项目可能之间还有依赖关系)依赖关系。
当遇见这种情况的时候我们就需要使用Docker Compose 来轻松高效的管理容器 。定义运行多个容器。(只需要把它定义在一个文件里就可以了,类似于shell脚本)
Docker Compose的概述(官网)
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅功能列表。
Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流。您可以在“常见用例”中了解有关每种情况的更多信息。
使用Compose基本上是一个三步过程:
- 使用定义您的应用环境,
Dockerfile
以便可以在任何地方复制。 - 定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 - Run
docker-compose up
and Compose启动并运行您的整个应用程序。(补充down停止)
总结:Docker Compose作用就是批量容器的编排
补充:Compose是Docker官方的开源项目,需要安装!
使用dockerfile 在如何地方都可以运行(简化运维和部署的工作)
比如:现在有 web服务、redis、mysql、cassandra、nginx等多个容器。以前就需要i一个一个的run运行
现在使用一个yaml文件就可以一起运行了
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
可以看见,这个compose里面会去先运行redis,然后在运行web服务,一百服务也如此
Compose :重要的概念
1、服务 services , 容器。应用。(例如: web 、 redis 、 mysql....,这么多服务,我们就可以使用compose进行编排。我们将这些编排好的服务打包就会生成一个项目 )
1、项目 project 。 一组关联的容器。 博客。 web 、 mysql 。
安装
下载docker compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 这个可能快点!
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker- compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
下载完毕!
赋予可执行权限
[root@master LH]# chmod +x /opt/LH/docker-compose (docker-compose通常放在docker相同目录下,我通常会将这两个文件放在/usr/bin目录下)
查看是否安装成功
Docker-Compose的初级体验
第一步:定义应用程序依赖项
1、为项目创建目录
[root@master opt]# mkdir -p kuangre
[root@master opt]# cd kuangre/
2、在项目目录中创建调用的文件,并将其粘贴到: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
flask
redis
第二步:创建DockerFile
#一个基本的环境包
FROM python:3.7-alpine
#工作的目录
WORKDIR /code
#刚定义的app.py的环境
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
#使用pip安装
RUN pip install -r requirements.txt
#暴露的端口为5000
EXPOSE 5000
#拷贝当前目录运行
COPY . .
CMD ["flask", "run"]
这告诉 Docker:
- 以 Python 3.7 映像为起点生成映像。
- 将工作目录设置为 。
/code
- 设置命令使用的环境变量。
flask
- 安装 gcc 和其他依赖项
- 复制并安装 Python 依赖项。
requirements.txt
- 向图像添加元数据,以描述容器正在端口 5000 上侦听
- 将项目中的当前目录复制到图像中的工作目录。
.
.
- 将容器的默认命令设置为 。
flask run
第三步:定义server服务在compos file上运行(编写*.yaml文件)
vim docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
解释,这里有两种生成镜像的方法,一种是使用build将DockerFile生成镜像,另一种是从镜像仓库拉去。
第四步:从项目目录中,通过运行 启动应用程序。docker-compose up(docker -f yaml文件 up)
做个小总结:
1 、应用 app.py
2 、 Dockerfile 应用打包为镜像
3 、 Docker-compose yaml 文件 (定义整个服务,需要的环境。 web 、 redis ) 完整的上线服务!
4 、启动 compose 项目( docker-compose up )
流程:
1 、创建网络
2 、执行 Docker-compose yaml
3 、启动服务。
Docker-compose yaml
Creating composetest_web_1 ... done
Creating composetest_redis_1 ... done
启动了两个项目
自动的默认规则?(使用暴露的端口号5000去执行)
docker imgaes (查看自动创建的images镜像)
默认的服务名 文件名 _ 服务名 _ num
多个服务器。集群。 A B _num 副本数量
服务 redis 服务 => 4 个副本。
集群状态。服务都不可能只有一个运行实例。 弹性、 10 HA 高并发。
kubectl service 负载均衡
3、网络规则 (通过compose启动的项目,都会在这个compose里面,它会自己帮我们进行维护。并且他们在同一个网络下)
10个服务 => 项目 (项目中的内容都在同个网络下。域名访问)
查看这个网络下发的服务
如果在同一个网络下,我们可以直接通过域名访问。
HA !
例如:我们直接写redis、mysql的域名即可,IP的话会自己动态生成
停止: docker-compose down
Docker 小结:
1 、 Docker 镜像。 run => 容器
2 、 DockerFile 构建镜像(服务打包)
3 、 docker-compose 启动项目(编排、多个微服务 / 环境)
4 、 Docker 网络
yaml
docker-compose核心
总共分为三层
第一层:
version:'' #它与docker-compose相对应
第二层:
server: #服务
服务1: web
# 服务配置
images
build
network .....
服务2: redis ....
服务3: mysql
第三层: #统称其他配置
网络/卷、全局规则
volumes:
networks:
configs:
按照顺序启动(depends_on最后启动)
了解更多yaml相关知识,官网推荐:https://docs.docker.com/compose/compose-fifile/#specifying-durations