第七节: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"]
View Code
复制代码
复制代码
#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"]
View Code
复制代码

 

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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @   Yaopengfei  阅读(38)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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、解构赋值、箭头函数、剩余参数
点击右上角即可分享
微信分享提示