docker-compose
Docker Compose
官方文档:https://docs.docker.com/compose/gettingstarted/
简介
Dockerfile build run 手动操作,单个容器?
微服务。100个微服务,依赖关系
Docker Compose 来轻松高效来管理容器,定义运行多个容器
三步骤
- Dockerfile文件保证项目在任何地方都可以运行
- docker-compose.yml 配置多个服务
- docker-compose up 启动 -d--》后台启动
作用:批量容器编排。
Docker Compose是Docker官方开源项目,需要安装
Dockerfile让程序在任何地方运行。web服务。redis mysql nginx......多个容器
Compose:根据配置,先去启动redis,再启动web
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重要概念
- 服务services 容器,应用 (web,redis,mysql..)
- 项目project 一组关联的容器.。博客---(文本,mysql.......)
安装
# 1.下载
# 官方,速度慢
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内源
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 2.授权
chmod +x /usr/local/bin/docker-compose
体验
- 应用app.py
- Dockerfile 应用打包为镜像
- compose.yaml文件(定义整个服务,需要的环境,web redis。。。)完整的上线服务
- 启动compose项目(docker-compose up)
- 准备
# 1.创建一个项目文件夹
mkdir composetest
cd composetest
# 2.创建一个应用,以python为例,是一个计数器的功能
vim 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.环境依赖包文件
vim requirements.txt
#添加内容
flask
redis
-
Dockerfile
# syntax=docker/dockerfile:1 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"]
-
docker-compose.yml
version: "3.9" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
-
启动
docker-compose up
-
停止
- docker-compose down(要进入文件下)或者ctrl+c
- docker-compose down(要进入文件下)或者ctrl+c
执行流程
- 创建网络
- 执行docker-compose.yaml
- 启动服务
自动的默认规则
docker ps
总结:
默认的服务名:文件名 _服务名 _num
多个服务器,集群。A B _num 副本数量 num代表第几个
集群状态。服务都不可能只有一个运行实例。
docker images
[root@jinpengyong ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 9c3f79649e3c 27 hours ago 183MB
docker-springboot latest 05ea3a57ebaa 2 days ago 661MB
redis latest 40c68ed3a4d2 7 days ago 113MB
tomcat 9.0 4e2e87a81bc1 9 days ago 680MB
redis alpine 5c08f13a2b92 11 days ago 32.4MB
python 3.7-alpine f0c1a69798c7 12 days ago 41.9MB
java 8 d23bdf5b1b1b 4 years ago 643MB
docker services ls
[root@jinpengyong ~]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
docker 网络
[root@jinpengyong ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1f122f7cec2f bridge bridge local
3812b609d226 composetest_default bridge local
[root@jinpengyong ~]# docker network inspect composetest_default
"Containers": {
"7eab26682a2a79c61567d108f5463f5108c44ddc1e8dc6eef5e4a174d877dced": {
"Name": "composetest_web_1",
"EndpointID": "c5a00826a64bd5dfe578528d37a9f65a05eedbe2a2bc331e0baf2e1cb4c2a1f1",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"e4007a5b24a6e45d545dc48c5a055e52d986bd532801a87f83561c496d208dce": {
"Name": "composetest_redis_1",
"EndpointID": "9626a6ac4b2189001f2736dabdf1aac059aaf12868c493f9922ee0e24c8e6533",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
项目中的各个服务都在同一个网络下。可以通过名字访问。
也可以再应用里看到cache = redis.Redis(host='redis', port=6379)
,这里写的是名字--》redis
总结
以前都是单个docker run 启动容器
docker-compose 通过docker-compose编写yaml配置文件,然后docker-compose up一键启动所有服务或停止
Docker小结
- docker镜像。run==>镜像
- Dockerfile构建镜像
- docker-compose 启动项目,(编排,多个微服务)
- docker网络
yaml规则
https://docs.docker.com/compose/compose-file/compose-file-v3/
# 3层
version: "3.9" # 第1层:版本
services: # 第2层:服务
服务1:web
# 服务配置
images
build
network
.....
服务n:redis
......
# 其他配置 网络/卷 全剧规则 第3层
volumes:
networks:
configs:
开源项目
博客:wordpress
https://docs.docker.com/samples/wordpress/
下载程序,安装数据库,配置。。。
compose应用--》一键启动
- 下载项目(docker-compose.yml)
- 如果需要文件Dockerfile( docker build)
- 文件准备齐全
启动:docker-compose up -d 后台启动
实战
-
项目代码
-
docker-compose.yml
version: '3.9' services: myapp: build: . image: myapp depends_on: - redis ports: - '8081:8081' redis: image: 'redis:alpine'
-
Dockerfile
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8081"] EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
-
启动
docker-compose up -d # 如果第一次报错。后面启动 docker-compose up -d --build
总结
工程 服务 容器
项目compose:三层
- 工程 porject
- 服务(环境也算)
- 容器 运行实例 docker k8s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY