第七节:docker compose v2 简介、指令、各种案例实操(webapi、redis、mysql)
一. compose v2简介
关于 docker compose 的详相关说明,可以查看之前的旧文章,不影响理解:https://www.cnblogs.com/yaopengfei/p/13672708.html
新版说明:
从 Docker 20.10 版本开始,Docker Compose V2 被集成到 Docker 引擎中,这意味着在 Docker 20.10 及以上版本中,可以直接使用 docker compose 命令来替代之前的 docker-compose 命令。
即 docker compose v2版,不需要单独安装了,如下图:docker版本 和 docker compose版本
二. 各种指令
前置说明:
docker compose v1版本,指令以 docker-compose开头, 而docker compose v2版本开始,去掉了-,指令都是以 docker compose开头,其他不变
1 参数剖析
-f :指定配置文件路径
-p:指定名称,生成的镜像和容器都会以该名称开头,但是在执行后续指令的时候也需要加上-p,否则无效。(特别注意:一旦使用了 -p参数,后续所有指令 up、ps、down、start等等,需要加-p参数,所以不建议使用这个参数)
默认情况下命令读取当前目录下,名为 docker-compose.yml 或 docker-compose.yaml 的文件, 当然用户也可以使用 -f 指定其他文件名。
如下图:
在config目录下有两个配置文件,分别是 docker-compose.yml 、api-compose.yml。
A . 运行指令【docker compose up -d】 读取的是docker-compose.yml,会自动生成镜像并创建容器,然后查看生成的镜像和容器,名称都是以当前文件夹 config 开头的。
PS:镜像和容器的命名规则,默认是前置都会以目录命名,且默认加上 _1 _2 _3 ,可以用-p来指定名称,代替以目录命名
B . 运行指令【docker compose -p ypf up -d】 读取的是docker-compose.yml, 生成镜像和容器前缀都是ypf开头
特别注意:一旦使用了 -p参数,后续所有指令 up、ps、down、start等等,需要加-p参数。查看容器的时候,也需加-p,否则查不到 【docker compose -p ypf ps】
或者后续在配置文件中指定:container_name 即可【推荐】,但是镜像images名称仍然有前缀
C . 运行指令【docker compose -f ./api-compose.yml up -d】 指定配置文件运行
2 指令剖析
查看镜像:【docker compose images】
查看容器:【docker compose ps】【docker compose ps -a】
停止容器:【docker compose stop】
重启容器:【docker compose restart】
开启容器:【docker compose start】
删除已经停止的容器:【docker compose rm】 加-f 强制删除无效, 且不会删除镜像和数据卷。
停止并删除运行中的 compose 应用(包含容器、数据卷、networks):【docker compose down】 但是images不会删除
创建并启动容器:【docker compose up -d】 -d表示以后台的方式运行,不要省略,而且它属于up的参数,必须加在up的后面,启动的过程中,如果没有images,会先构建镜像。
3. 常用的命令组合
创建并启动容器(指定yml的路径):【docker compose -f ./xxx/xx.yml up -d】
查看容器情况(指定yml的路径):【docker compose -f ./xxx/xx.yml ps】
创建并启动容器(指定yml的路径和容器命名):【docker compose -f ./nginx_api_compose.yml -p yxy up -d】
查看容器情况(指定yml的路径和容器命名):【docker compose -f ./nginx_api_compose.yml -p yxy ps】
三. yml文件详解
如下图1:基于各自的dockerfile文件
{
"services": {
"myapi1": {
"build": "../api1/",
"ports": [
"10001:10001"
]
},
"myapi2": {
"build": "../api2/",
"ports": [
"10002:10002"
]
}
}
}
如下图2:基于镜像
{
"services": {
"ypf_redis5": {
"image": "redis:5.0",
"container_name": "ypf_redis5",
"ports": [
"6379:6379"
],
"volumes": [
"/root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf",
"/root/redis/data:/data",
"/root/redis/logs:/var/log/redis"
],
"command": "redis-server /usr/local/etc/redis/redis.conf",
"restart": "always"
},
"ypf_mysql57": {
"image": "mysql:5.7",
"container_name": "ypf_mysql57",
"ports": [
"3306:3306"
],
"environment": {
"MYSQL_ROOT_PASSWORD": "123456"
},
"volumes": [
"/root/mysql/conf/my.cnf:/etc/mysql/my.cnf",
"/root/mysql/logs:/var/log/mysql",
"/root/mysql/data:/var/lib/mysql"
],
"restart": "always"
}
}
}
(1). version:版本号 docker compose v2中不必填写了,或者写一个高版本 3.8
(2) services:多个容器集合
(3) 服务对象:docker-compose.yml管理是以服务为单位管理的,一个services下面可以有多个服务,mysql,app都代表一个服务
(4) image:指定服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
(5) hostname 配置容器的host名称,在容器的hosts文件中加入了映射
(6) container_name:配置启动后的容器名称和docker的--name xxx
效果是一样的
(7). build:发布包目录
(8). ports:端口映射,前面是容器暴露端口,后面是镜像端口
(9). expose:对外暴露端口
(10). volumes:数据卷
(11) restart:restart参数能够使我们在重启docker时,自动启动相关容器,和docker的--restart
效果一致
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
四. 案例-发布多个webapi
(基于各自的dockerfile文件)
1. 各自的Dockerfile文件如下

#1.依赖两个基础镜像 FROM mcr.microsoft.com/dotnet/aspnet:8.0 FROM mcr.microsoft.com/dotnet/sdk:8.0 #2.制作人 MAINTAINER ypf <ypf@qq.com> #3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) ENV ASPNETCORE_URLS=http://*:10001 #4.容器对外暴露的端口 EXPOSE 10001 #5.指定默认工作目录 WORKDIR /userapi #6. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的userapi工作目录下 COPY . /userapi/ #7.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目 ENTRYPOINT ["dotnet", "WebApi8.dll"]

#1.依赖两个基础镜像 FROM mcr.microsoft.com/dotnet/aspnet:8.0 FROM mcr.microsoft.com/dotnet/sdk:8.0 #2.制作人 MAINTAINER ypf <ypf@qq.com> #3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) ENV ASPNETCORE_URLS=http://*:10002 #4.容器对外暴露的端口 EXPOSE 10002 #5.指定默认工作目录 WORKDIR /userapi #6. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的userapi工作目录下 COPY . /userapi/ #7.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目 ENTRYPOINT ["dotnet", "WebApi8.dll"]
2. docker-compose.yml文件如下
{
"services": {
"myapi1": {
"build": "../api1/",
"container_name": "myapi1",
"ports": [
"10001:10001"
]
},
"myapi2": {
"build": "../api2/",
"container_name": "myapi2",
"ports": [
"10002:10002"
]
}
}
}
3 运行指令【docker compose up -d】,然后查看镜像【docker compose ps】
五. 案例-同时安装redis和mysql
详细的要求参考之前单独的文章:https://www.cnblogs.com/yaopengfei/p/13630267.html
下面仅仅为核心步骤,以前前置操作:比如创建目录、配置权限等等,都参考前面的文章。
运行指令【docker compose up -d】 查看镜像:【docker compose ps】
docker-compose.yml 文件如下:
查看代码 {
"services": {
"ypf_redis5": {
"image": "redis:5.0",
"container_name": "ypf_redis5",
"ports": [
"6379:6379"
],
"volumes": [
"/root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf",
"/root/redis/data:/data",
"/root/redis/logs:/var/log/redis"
],
"command": "redis-server /usr/local/etc/redis/redis.conf",
"restart": "always"
},
"ypf_mysql57": {
"image": "mysql:5.7",
"container_name": "ypf_mysql57",
"ports": [
"3306:3306"
],
"environment": {
"MYSQL_ROOT_PASSWORD": "123456"
},
"volumes": [
"/root/mysql/conf/my.cnf:/etc/mysql/my.cnf",
"/root/mysql/logs:/var/log/mysql",
"/root/mysql/data:/var/lib/mysql"
],
"restart": "always"
}
}
}
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2023-02-27 第十五节:node项目部署(pm2部署windows、linux、问题解决)
2021-02-27 第一节:ES6用法之let、const、解构赋值、箭头函数、剩余参数