十三、Docker Compose使用和主要功能

news2024/11/17 5:40:40

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出)

目录

  • 一、核心概念
  • 二、主要功能
  • 二、docker compose常用命令
  • 三、docker compose 案例
    • 3.1 自己写一个微服务模块
    • 3.2 用Dockerfile将上面的模块编排(不使用compose)
    • 3.3 使用compose编排
  • 总结

一、核心概念

compose有一个文件,两个要素。

一个文件:docker-compose.yml 两个要素:服务(service),工程(project)

服务(service): 一个个应用容器实例。
工程(project): 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

这里有必要说一下,最新官网是使用叫compose.yaml 或 compose.yml,为了兼容之前的版本,也同样支持docker-compose.yml

在这里插入图片描述

Compose 文件是一个 YAML 文件,定义:
Version 版本(可选)
Services 服务(必填)
Networks 网络
Volumes 卷
Configs 配置
Secrets 保密

以下是官网对Compose文件的相关描述,可以参考:(可以一边使用一边理解)

  • 您可以使用片段和扩展来保持 Compose 文件高效且易于维护。
  • 可以将多个 Compose 文件合并在一起来定义应用程序模型。 YAML 文件的组合是通过根据您设置的 Compose 文件顺序附加或覆盖 YAML 元素来实现的。 简单的属性和映射会被最高阶的 Compose 文件覆盖,列表会通过附加进行合并。 只要要合并的补充文件托管在其他文件夹中,就会根据第一个 Compose 文件的父文件夹解析相对路径。 由于某些 Compose 文件元素既可以表示为单个字符串也可以表示为复杂对象,因此合并适用于扩展形式。
  • 如果您想重用其他 Compose 文件,或者将应用程序模型的某些部分分解为单独的 Compose 文件,您还可以使用 include。 如果您的 Compose 应用程序依赖于由不同团队管理的另一个应用程序,或者需要与其他人共享,这非常有用。

二、主要功能

先看看官网怎么说:
在这里插入图片描述

使用Compose本质上就是三部曲:

  1. 使用 Dockerfile 定义应用程序的环境,以便可以在任何地方重现它。(写Dockerfile)
  2. 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。(写docker-compose.yml)
  3. 运行 docker compose up,Docker compose 命令将启动并运行整个应用程序。也可以使用 Compose 独立运行 docker-compose up(docker-compose 二进制文件)。(运行,docker compose up)

二、docker compose常用命令

Compose V2 版本不用写docke和compose中间的 -

命令含义
docker-compose -h查看帮助
docker-compose up启动所有docker-compose服务
docker-compose up -d启动所有docker-compose服务并后台运行
docker-compose down停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id进入容器实例内部
docker-compose exec yml文件中写的服务id /bin/bash进入容器实例内部
docker-compose ps展示当前docker-compose编排过的运行的所有容器
docker-compose top展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id查看容器输出日志
docker-compose config检查配置
docker-compose config -q检查配置,有问题才有输出
docker-compose restart重启服务
docker-compose start启动服务
docker-compose stop停止服务

三、docker compose 案例

通过对比不使用compose和使用compose两种情况,看看用了compose到底有什么优势。

3.1 自己写一个微服务模块

实现User增添加和删除,这不是主要的,主要是学docker compose。下面给出我的gitee的源码。嫌费事就拉下来改一改,能跑起来就可以了。源码下载

项目记得改一下

  • 自己虚拟机ip地址
  • mysql版本(我用的8版本),密码
  • redis密码

3.2 用Dockerfile将上面的模块编排(不使用compose)

  1. 在idea中打包上面的功能模块,放入虚拟机。
    在这里插入图片描述
    在这里插入图片描述

  2. 编写Dockerfile文件(保证和jar包在一个文件夹下!)

    • 先创建Dockerfile
      在这里插入图片描述
    • 填入下面内容
      # 基础镜像使用java
      FROM java:8
      # 作者
      LABEL 'author'='zwcoder'
      # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
      VOLUME /tmp
      # 将jar包添加到容器中并更名为zwcoder_docker.jar
      ADD docker_demo-0.0.1-SNAPSHOT.jar zwcoder_docker.jar
      # 运行jar包
      RUN bash -c 'touch /zwcoder_docker.jar'
      ENTRYPOINT ["java","-jar","/zwcoder_docker.jar"]
      #暴露6001端口作为微服务
      EXPOSE 6001
      
  3. 通过Dockerfile构建镜像

    docker build -t zwcoder_docker:2.0 .	#这有个.别忘了!!!
    

    在这里插入图片描述

  4. 查看新生成的镜像并运行
    这里展示不使用compose的情况,很简单,就是把所用到的redis,mysql容器先运行起来,在运行我们自己的为服务模块就好了。
    在这里插入图片描述

    • 运行mysql,并创建表
    docker run -p 3306:3306 --name mysql8 --privileged=true -v /zwcoder/mysql/conf:/etc/mysql/conf.d -v /zwcoder/mysql/logs:/logs -v /zwcoder/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    docker exec -it mysql8 /bin/bash #进入容器
    

    在这里插入图片描述
    在这里插入图片描述

    mysql -uroot -p	#登录mysql
    create database docker_study;	#创建数据库
    use docker_study;	#应用数据库
    #建表
    CREATE TABLE `t_user` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
      `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
      `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
      `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
      `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    
    

    在这里插入图片描述

    • 运行redis
    docker run  -p 6379:6379 --name redis608 --privileged=true -v /zwcoder/myredis/redis.conf:/etc/redis/redis.conf -v /zwcoder/myredis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
    docker exec -it redis608 /bin/bash
    

    在这里插入图片描述

    • 运行微服务模块
    docker images
    docker run -d -p 6001:6001 zwcoder_docker:2.0
    

    在这里插入图片描述

    在这里插入图片描述
    这样就成功了!

从这里就可以看出,不使用compose的时候,需要每次运行一个镜像,还要考虑到镜像启动的顺序问题,当镜像数量增多时,一定会变得非常繁琐!再看看使用compose。

3.3 使用compose编排

  1. 改一下微服务模块的yml文件,不再写死ip,而是使用服务名
    在这里插入图片描述
    再重新打包,上传到虚拟机,并重新构建新的镜像。(先把之前的容器和镜像删除,这些命令不熟悉的可以参考三、Docker命令及基本使用)
    在这里插入图片描述
  2. 创建compose文件
    Compose v1是用的docker-compose.yml
    Compose v2是用的compose.yml,但是兼容v1
    这在上面的内容说了,这里直接使用compose.yml
    在这里插入图片描述
services: #服务,下面是一个一个容器实例
  microService:   #我们自己打包的微服务模块
    image: zwcoder_docker:3.0 #使用的镜像
    container_name: ms01  #容器名
    ports:  #端口映射
      - "6001:6001"
    volumes:  #容器数据卷
      - /zwcoder/microService:/data
    networks: #网络,保证容器都运行在一个网段
      - atguigu_net #这个网络在最后一行定义了
    depends_on: #当前容器实例依赖哪些容器实例
      - redis
      - mysql

  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /zwcoder/myredis/redis.conf:/etc/redis/redis.conf
      - /zwcoder/myredis/redis/data:/data
    networks:
      - atguigu_net
    command: redis-server /etc/redis/redis.conf

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'docker_study'
      MYSQL_USER: 'zwcoder'
      MYSQL_PASSWORD: 'zwcoder'
    ports:
      - "3306:3306"
    volumes:
      - /zwcoder/mysql/db:/var/lib/mysql
      - /zwcoder/mysql/conf/my.cnf:/etc/my.cnf
      - /zwcoder/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

networks: #定义网络
  atguigu_net:  
  1. 验证compose.yml有没有写错
    docker compose config -q
    
    在这里插入图片描述
    没有输出,就说明没问题!
  2. 使用compose启动
    docker compose up -d #后台运行
    
    在这里插入图片描述
    成功!
  3. 测试
    • 进入mysql容器,重新建表(和上面一样) docker exec -it mysql容器id /bin/bash
    • 进入redis容器 docker exec -it redis容器id /bin/bash
    • 访问虚拟机ip:6001/swagger-ui.html
    • 测试微服务的方法
      在这里插入图片描述
    • 查看mysql容器表中的数据(mysql操作不在写了),会增加新数据
      在这里插入图片描述
    • 查看redis容器表中的数据
  4. 关停compose
    docker compose stop
    
    在这里插入图片描述

总结

Docker compose 在应对容器不太多,二三十个容器的时候还是挺好的,如果容器数量继续增加,那就要k8s登场了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

滑动平均值滤波(CODESYS ST源代码)

有关滑动平均值滤波算法的详细介绍请查看下面文章链接,这里不再赘述: 博途PLC各种平均值滤波算法对比(SCL+梯形图代码)_模拟量平均值滤波梯形图程序_RXXW_Dor的博客-CSDN博客此文会对比各种滤波算法的优劣,给出具体算法描述和测试代码算术平均值不区分原始数据的质量,特…

高阶组件/react组件复用

也可以用children模式 优化 高阶组件 组件名称相同设置组件名字 效果 解决props丢失 setstate是异步更新的 推荐语法 页面更新完后的回调函数 组件性能优化 1. 2.

WAIC2023会后记

听了3天WAIC的会, 大开眼界,算是上了堂大课。 本次参会的目的是听听AI企业信息化的想法、理论和实践。以进一步探索可能的业务场景。三天的会结束后,留下深刻印象的有如下几点。 大模型当道 2023这次大会的主题成了大模型,谈的…

超链接标签和列表标签

五、超链接标签 href: target: 行内标签,没有href属性和span没区别 有href不写值,跳转当前页面,即刷新效果 写完之后后端数据还没过来,不知道要跳转哪个页面,不想进行刷新页面,加#,叫锚点 回到底…

Gradle插件开发

Gradle插件开发 本文链接:https://blog.csdn.net/feather_wch/article/details/131623779 什么是插件? 开发方式 插件扩展 加固实战

[工业互联-16]:工业Windows操作系统与实时性方案

目录 第1章 Windows操作系统 1.1 简介 1.2 Windows架构 第2章 工业Windows操作系统 2.1 简介 2.2 常见的工业Windows操作系统版本 2.3 定制化工业Windows 第3章 EtherCAT实时Windows方案 3.1 实时Windows的缘由 3.2 总体框架 3.3 ROS2方案 3.4 方案1:使…

PXE-网络批量装机

目录 【1】安装dhcp、tftp-server、httpd、syslinux、关闭防火墙、挂载镜像 【2】配置dhcp服务 【3】配置tftp服务 【4】拷贝pxe服务器的相关文件到tftp的根目录 【5】创建pxelinux.cfg文件 【6】配置httpd 【7】Kickstart自动化文件 【8】重启所有服务 【9】验证 【1…

C#对DataGridView控件的常用操作

1998年我开始接触Powerbuilder 6.5之前,使用过FoxPro 2.5B和Visual Base 5,比较而言,对数据库应用的开发,FoxPro 2.5B对开发人员很友好,开发程序速度快,Visual Base 5则几乎没有多少的优势,用上…

webpack5搭建与基本配置

webpack基础构建 新建文件夹进入文件夹查看是否安装node,命令:node-v创建package.json文件,命令:npm init -y安装webpack和webpack-cli,(命令自动创建出package-lock.json文件和node_modules文件夹&#x…

残差网络(ResNet) -深度学习(Residual Networks (ResNet) – Deep Learning)

在第一个基于cnn的架构(AlexNet)赢得ImageNet 2012比赛之后,每个随后的获胜架构都在深度神经网络中使用更多的层来降低错误率。这适用于较少的层数,但当我们增加层数时,深度学习中会出现一个常见的问题,称为消失/爆炸梯度。这会导…

MachineLearningWu_6_FeatureScaling

x.1 feature scale 接下俩我们将考虑数据的不一致性,例如有的数据的范围很大,可能分布在好几千,但是我们的weight矩阵最好是在[-1, 1]的小数,如果数值太大就会导致我们的weight变化也很大,如下面这个例子就并不好&…

编译型语言和解释型语言的区别

1.操作系统怎么识别编程语言 计算机能识别二进制数,但是无法识别编程语言,比如你把 01000001100通过相关手段输入计算机中计算机就能识别其中的含义并且执行对应的命令,但是你输入 print(hello world)计算机就无法识别其含义,这就…

基于springboot+mybatis-plus+mysql+vue音乐网站管理系统

基于springbootmybatis-plusmysqlvue音乐网站管理系统 一、系统介绍1、系统主要功能:2.涉及技术框架:3.项目说明: 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能: 音乐播放 用户登录注册 用户信息编辑、头…

4. PS切图

4.1常见的图片格式 jpg图像格式: JPEG ( .JPG )对色彩的信息保留较好,高清,颜色较多,我们产品类的图片经常用jpg格式的gif图像格式 : GIF格式最多只能储存256色,所以通常用来显示简单图形及字体,但是可以保存透明背景和动画效果,实际经常用于一些图片小动画效果png图像格式&am…

Tomcat 线程池

目录 概述 tomcat线程池工作原理 关键源码 Connector 配置 Executor 线程配置 tomcat核心组件(题外) 概述 Tomcat 是一个流行的 Java Web 服务器,它使用线程池来处理客户端请求。线程池是一组预先创建的线程,用于执行并发任…

FreeRTOS ~(七)互斥量 ~ (1/3)互斥量解决互斥缺陷

前情提要 FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷 FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷 FreeRTOS ~(六)信号量 ~ (2/…

Android Camera2 获取RAW数据

这边文章主要记录下在Android系统上,如何通过Camera2 API去拿到RAW数据,也是当个备忘。 平时我们拿实时预览数据,更多的是获取yuv数据。一般涉及到raw域算法在APP层实现的时候,我们才会用到获取raw数据。 APP上集成Raw算法的思路…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(运算符和表达式)

目录 🍉2.运算符和表达式 2.1 C运算符 2.2基本的算术运算符 2.3自增( )自减( - - )运算符 2.4算术表达式和运算符的优先级与结合性 2.运算符和表达式 2.1 C运算符 C语言提供了以下运算符: (1)算术…

印度反垄断机构偏袒亚马逊,谷歌对滥用安卓市场地位罚款提出质疑

根据路透社消息,谷歌指控印度反垄断机构在其安卓系统调查中对亚马逊持偏袒态度,并向印度最高法院提起诉讼,对其关于滥用安卓市场地位的罚款提出质疑。 印度竞争委员会(CCI)最近要求谷歌改变商业模式,称谷歌…

结合具体场景举例说明chatgpt预训练模型中Tokenization的原理

假设我们有一个场景,Alice想向Chatbot询问一部电影的推荐。她发送了一条消息:“你好,能给我推荐一部好看的电影吗?” 在这个场景中,Chatbot使用了ChatGPT预训练模型。首先,Chatbot需要对Alice的消息进行Tok…