docker compose的用处是对 Docker 容器集群的快速编排。(源码)
一个 Dockerfile 可以定义一个单独的应用容器。但我们经常碰到需要多个容器相互配合来完成某项任务的情况(如实现一个 Web 项目,需要服务器、数据库、redis等),Compose 刚好允许通过一个单独的 docker-compose.yml 文件来定义一组相关联的应用容器为一个项目(project)。
一、安装
安装完docker(docker安装:Ubuntu22)后就已经完成了compose的安装了,也可从Releases · docker/compose (github.com)仓库安装。
二、概念
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目实现上是调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
三、应用举例
使用docker compose启动一个python服务器,访问后可显示访问次数。
服务器源码:(对"/"路径建立路由,访问后调用hello函数,在redis中给hits的value+1,然后输出到网页)
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis',port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello,已被访问{}次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0",debug=True)
Dockerfile:
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
docker-compose.yml:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
然后启动容器:sudo docker compose up
即可启动项目,访问5000端口:
四、命令讲解
4.1docker compose up
docker compose up命令会构建镜像,创建网络、卷,并启动容器,容器名称以项目名称(目录名称)为前缀,以一个数子为后缀(Docker Compose允许扩缩容);创建的镜像、容器、网络和卷可直接使用docker命令进行查看。
- 参数:
- -f:docker-compose up会查找名为 docker-compose.yml 或 docker-compose.yaml 的 compose 文件,或使用 -f 指定 compose 文件名。
- -d:在后台启动应用。
4.2docker compose down
上述项目执行down后:
过程:
- 关闭服务。
- 删除服务。(注意:容器和网络会被删除,数据卷和镜像不会,所以再次启动就能快很多)
4.3docker compose ps
查看项目状态:
显示容器名称、其中运行的Command、当前状态以及其监听的网络端口。
4.4docker compose top
列出各个服务(容器)内运行的进程。(PID编号为在宿主机上的进程ID。)
4.5docker compose stop
停止应用(关闭服务),不删除资源:
4.6docker compose start
启动停止的应用。
4.7docker compose restart
重启应用。
4.8docker compose rm
删除已经停止的应用(仅容器和网络)。
五、docker-compose文件编写
建议查看:Compose 模板文件 | Docker 从入门到实践
建议最好还是配合chatgpt进行编写,直接手写可能每一步都会报问题(〃'▽'〃)