【Docker】学习笔记(三)三剑客之 docker-compose文件书写项目多服务容器运行
简介
引言(需求)
- 为了完成一个完整项目势必用到N多个容器配合完成项目中的业务开发,一旦引入N多个容器,N个容器之间就会形成某种依赖,也就意味着某个容器的运行需要其他容器优先启动之后才能正常运行;
容器的编排(先后运行顺序)至关重要
- 无法从项目的角度将一组容器划分到一起,日后难点在于项目多服务器部署
项目角度:管理一组项目容器
功能
- 实现对docker容器集群的快速编排(站在项目角度将一组容器集合在一起,对这组容器按照一定顺序进行启动)
- 通过定义一个单独的
docker-compose.yml配置文件来定义一组相关联的应用容器为一个项目
重要概念
- 项目(project): 由一组关联的应用容器(服务)组成的一个完整业务单元,在
docker-compose.yml文件中定义 - 服务(services): 一个应用的多个容器,实际上可以包括若干个运行相同镜像的容器实例
docker-compose安装
安装
apt安装
sudo apt install -y docker-compose
pip安装
sudo pip3 install docker-compose
验证是否安装成功及其版查询版本
docker-compose -v
# 输出信息如下:
docker-compose version 1.25.0, build unknown
docker-compose 与docker-engine 版本兼容关系
# 查看本地版本
docker -v
# Docker version 24.0.7
# docker-compose 指定vision版本3.2,意味着部署服务器docker engin引擎版本至少高于17.04.0
# 具体对应关系官网查看
# https://docs.docker.com/compose/compose-file/compose-file-v3/# 版本不支持会报如下错误
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
案例一(文件基本结构)
- 创建一个工程项目目录
mkdir -p ems/docker
cd ems/docker
- 在项目根目录下创建配置文件
docker-compose.yml
# docker-compose 版本号
version: "3.3"# 一个应用服务
services:tomcat01:# 利用本地仓库已经构建好的镜像,如果没找到会自动尝试hub上pullimage: tomcat:8.0# 容器名称 --namecontainer_name: tomcat01# 做端口映射 -pports:- "8080:8080"# - "8081:8081" # 可以映射多个端口tomcat02:image: tomcat:8.0container_name: tomcat02ports: - "8081:8080"redis01:image: redis:5.0.12container_name: redis01ports:- "6379:6379"mysql01:image: mysql:5.6container_name: mysql01# 给当前容器指定环境参数 类似于 docker run -e MYPASSWORD=root redis:5.0.12 -dports:- "3306:3306"environment: - "MYSQL_ROOT_PASSWORD=ROOT" # 推荐写法- MYSQL_ROOT_PASSWORD:root# 指定同步数据卷 -v ./data路径一定要先存在volumes:# 相对或绝对路径# - ./data:/var/lib/mysql# 别名挂载数据卷一定要先申明# ERROR: Named volume "data:/var/lib/mysql:rw" is used in service "mysql01" but no declaration was found in the volumes section- data:/var/lib/mysql# 申明数据卷别名
volumes:data:
- 启动 docker-compose 一组服务
# -d 表示后台启动容器
docker-compose up -d
# 直接bash面板启动
docker-compose up
- 访问一下tomcat
http://192.168.18.224:8080/
docker-compose down 清除上一次的缓存配置(连同创建的容器一起清除)
docker-compose 常用服务配置命令详解
官方参考文档
https://docs.docker.com/compose/compose-file/build/
官方中文文档
Dockerfile文件
# 指定基础镜像
FROM openjdk:8-jre
# ARG特殊,他不是有效指令,可以在FROM之前
ARG buildno
ARG password# 暴露端口(可以在容器服务中暴露)
EXPOSE 8081
# 设置环境变量
ENV APP_PATH=/apps
# 指定工作目录
WORKDIR ${APP_PATH}
# 拷贝文件到镜像中
COPY apps.jar ${APP_PATH}
# 使用数据卷
VOLUME ${APP_PATH}# 运行jar包 java -jar apps.jar
ENTRYPOINT [ "java", "jar" ]
CMD [ "apps.jar" ]
默认情况下,Dockerfile中指定的选项(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,不需要在docker-compose.yml中再次指定它们
docker-compose.yml文件
version: "3.3"
services:tomcat01:image: tomcat:8.0container_name: tomcat01ports:- "8080:8080"networks:- sensizrestart: alwaysapps:# 通过Docjerfile文件指定镜像# build: ./ # 可以直接指定,其他参数默认build:# 指定dockerfile上下文目录,也可以是git仓库的URLcontext: ./# 指定Dockerfile的文件名,如果为默认值Dockerfile可以不写dockerfile: Dockerfile# # 给docker中传入环境变量参数# args:# buildno: 1ports:- 8081:8080cap_add:- ALLcommand: ["test.jar"]# 先启动顺序tomcat01 mysql resdi,再启动appsdepends_on:- tomcat01- mysql01# - redisnetworks:- sensizmysql01:image: mysql:5.6# 数据卷别名要首先申明volumes:- data:/var/lib/mysqlports:- "3303:3306"environment:- MYSQL_ROOT_PASSWORD=root# env_file: # - ./ENV_FILE.envexpose:- 8888# 声明数据卷别名
volumes:data:
# 申明使用的网桥
networks:sensiz:
image
🌸 指定启动容器的镜像,可以是镜像仓库/标签或者镜像id(或者id的前一部分)
如果本地仓库镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。但最好指定二者之一即可。
build
🌸 通过dockerfile构建镜像(即同样支持docker engine中的 docker build -t thicv:v1.0 . )
注 build与image 最好指定一个即可,即通过其中一种方式指定镜像
version: "3.3"
services:apps:# 通过Docjerfile文件指定镜像# build: ./ # 可以直接指定,其他参数默认build:# 指定dockerfile上下文目录,也可以是git仓库的URLcontext: ./# 指定Dockerfile的文件名,如果为默认值Dockerfile可以不写dockerfile: Dockerfile# # 给docker中传入环境变量参数args:buildno: 1password: secret# 也可以是# - password=secret
args添加构建镜像的参数,环境变量只能在构建过程中访问。 首先,在Dockerfile中指定要使用的参数:
ARG buildno
ARG passwordRUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
cap_add | cap_drop
指定容器的内核能力(capacity)分配
# 如拥有所有能力可以指定为cap_add:- ALL# 去掉NET_ADMIN能力cap_drop:- NET_ADMIN
command
🌸 覆盖容器启动后默认执行的命令 类似于docker run image test.jar
containner_name
🌸 指定容器名称,如若不指定,默认名称使用: 项目名称-服务名称-序列号 格式
注:指定容器名称后,该服务器将无法进行扩展,不推荐使用
volumes
🌸 指定宿主机与容器文件的映射
注 别名一定要先声明,挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读
version: "3.3"
services:mysql01:image: mysql:5.6# 数据卷别名要首先申明volumes:- data:/var/lib/mysq:ro# 声明数据卷别名
volumes:data:
depends_on
🌸 解决容器的依赖、启动先后问题
但当前服务不会等待被依赖服务【完全启动】之后才启动
environment | env_file
-
environment指定容器启动时的环境变量,类似于docker run -e 选项
-
env_file 指定容器启动时的环境变量文件
version: "3.3"
services:mysql01:image: mysql:5.6# 数据卷别名要首先申明environment:- MYSQL_ROOT_PASSWORD=root# env_file: # - ./ENV_FILE.env
expose
🌸 暴露端口,但不映射到宿主机,只与被链接的服务访问,且仅可以指定内部端口为参数
labels
为容器添加元数据信息,做辅助说明
networks
🌸 用来指定启动容器使用的网桥,类似于docker run --network
一个项目的一组容器应当在同一个网桥中
ports
🌸 用来指定宿主机与容器间的端口映射
restart
指定容器退出后 的策略为始终重启,相当于daocker run --restart=always
-
always总是重新启动 -
no是默认重启策略,即任何情况都不会重启 -
on-failure退出代码只是出现故障,重新启动
restart: always
docker-compose 常用操作命令进阶
大部分命令的对象可以是项目本身,也可以指定为项目中的服务或容器
docker engine 的命令同样可以操作服务容器
语法 docker-compose [选项] [服务id]
| 指令 | 说明 |
|---|---|
| docker-compose --help | 查询命令帮助 |
| docker-compose up | 对整个项目进行操作(镜像构建、创建服务、启动服务并关联服务相关容器的额一系列造作)-d表示后台启动 |
| docker-compose up [servicesID] | 仅仅启动compose中某一个服务容器 |
| docker-compose down | 停止并删除所有启动的容器、网桥等 |
| docker-compose down [servicesID] | 仅仅关闭compose中某一个服务容器 |
| docker-compose exec [servicesID] | 进入某个已经运行的容器(这样不用加选项 -it) |
| docker-compose ps | 列出所有运行的容器 |
| docker-compose restart | 重启整个项目 |
| docker-compose restart [servicesID] | 仅仅重启某一个服务 |
| docker-compose rm | 删除所有项目(删除已经停止的服务容器),-f 选项也可以强制删除,-v 删除挂载的数据卷 |
| docker-compose rm [servicesID] | 仅仅删除某一个服务 |
| docker-compose top | 查看项目中所有的服务容器运行进程 |
| docker-compose top [services] | 仅仅查看对应服务的运行进程 |
| docker-compose logs [servicesID] | 查看对应服务容器的运行日志,-f 实时查看 |
docker-compose -f ./docker-compose.yml在某路径下查询docker-compose.yml文件
相关文章:
【Docker】学习笔记(三)三剑客之 docker-compose文件书写项目多服务容器运行
简介 引言(需求) 为了完成一个完整项目势必用到N多个容器配合完成项目中的业务开发,一旦引入N多个容器,N个容器之间就会形成某种依赖,也就意味着某个容器的运行需要其他容器优先启动之后才能正常运行; 容…...
node.js基础
node.js基础 🍓什么是node.js🍓node.js模块🍒🍒 内置模块🍅🍅🍅fs模块🍅🍅🍅path模块🍅🍅🍅http模块 🍒&#…...
fastapi实现websocket在线聊天
最近要实现一个在线聊天功能,基于fastapi的websocket实现了这个功能。下面介绍一下遇到的技术问题 1.问题难点 在线上环境部署时,一般是多进程的方式进行部署启动fastapi服务,而每个启动的进程都有自己的独立存储空间。导致存储的连接对象分…...
LLM推理部署(六):TogetherAI推出世界上LLM最快推理引擎,性能超过vLLM和TGI三倍
LLM能有多快?答案在于LLM推理的最新突破。 TogetherAI声称,他们在CUDA上构建了世界上最快的LLM推理引擎,该引擎运行在NVIDIA Tensor Core GPU上。Together推理引擎可以支持100多个开源大模型,比如Llama-2,并在Llama-2–…...
Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器
1 规范项目结构 上期中在导入一系列的商店资源包后,Assets 目录已经变的混乱不堪 开发过程中,随着资源不断更新,遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…...
展望2024年供应链安全
2023年是开展供应链安全,尤其是开源治理如火如荼的一年,开源治理是供应链安全最重要的一个方面,所以我们从开源治理谈起。我们先回顾一下2023的开源治理情况。我们从信通院《2023年中国企业开源治理全景观察》发布的信息。信通院调研了来自七…...
React 列表页实现
一、介绍 列表页是常用的功能,从后端获取列表数据,刷新到页面上。开发列表页需要考虑以下技术要点:1.如何翻页;2.如何进行内容搜索;3.何时进行页面刷新。 二、使用教程 1.user-service 根据用户id获取用户列表,返回…...
【程序人生】还记得当初自己为什么选择计算机?
✏️ 初识计算机: 还记得人生中第一次接触计算机编程是在高中,第一门编程语言是Python(很可惜由于条件限制的原因,当时没能坚持学下去......现在想来有点后悔,没能坚持,唉......)。但是…...
9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用
在很多情况下,前端模板中在很多页面有都重复的内容可以使用,比如页头、页尾、甚至中间的内容都有可能重复。这时,为了提高开发效率,我们就可以考虑在共同的部分提取出来, 主要方法有如下: 1. 模板继承 2. U…...
IDEA中.java .class .jar的含义与联系
当使用IntelliJ IDEA这样的集成开发环境进行Java编程时,通常涉及.java源代码文件、.class编译后的字节码文件以及.jar可执行的Java存档文件。 1. .java 文件: 1.这些文件包含了Java源代码,以文本形式编写。它们通常位于项目中的源代码目录中…...
北斗三号短报文森林消防应急通信及天通野外图传综合方案
森林火灾突发性强、破坏性大、危险性高,是全球发生最频繁、处置最困难、危害最严重的自然灾害之一,是生态文明建设成果和森林资源安全的最大威胁,甚至可能引发生态灾难和社会危机。我国总体上是一个缺林少绿、生态脆弱的国家,是一…...
js Array.every()的使用
2023.12.13今天我学习了如何使用Array.every()的使用,这个方法是用于检测数组中所有存在的元素。 比如我们需要判断这个数组里面的全部元素是否都包含张三,可以这样写: let demo [{id: 1, name: 张三}, {id: 2, name: 张三五}, {id: 3, name…...
前端编码中快速填充内容--乱数假文
写前端页面的时候,如果要快速插入图片,可以使用 https://picsum.photos/ 详见笔者这篇博文: 工具网站:随机生成图片的网站-CSDN博客 可是,如果要快速填充文字内容该怎么做呢? 以前,我们都是…...
数据结构二维数组计算题,以行为主?以列为主?
1.假设以行序为主序存储二维数组Aarray[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]( )。 A.808 B.818 C.1010 D&…...
springboot(ssm电影院订票信息管理系统 影院购票系统Java系统
springboot(ssm电影院订票信息管理系统 影院购票系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0࿰…...
AI 问答-供应链管理-相关概念:SCM、SRM、MDM、DMS、ERP、OBS、CRM、WMS...
一、供应链管理是什么 供应链管理:理解供应链管理_snowli的博客-CSDN博客 二、SCM 供应链管理 SCM全称为“Supply Chain Management”,即供应链管理。 SCM是企业管理范畴中一个非常重要的概念,指的是企业与供应商、生产商、分销商等各方之…...
初学vue3与ts:vue3选项式api获取当前路由地址
vue2的获取方法 this.$route.pathvue3选项式api获取方法 import { useRouter } from vue-router; const router useRouter(); console.log(router) console.log(router.currentRoute.value.path)...
2023最新大模型实验室解决方案
人工智能是引领未来的新兴战略性技术,是驱动新一轮科技革命和产业变革的重要力量。近年来,人工智能相关技术持续演进,产业化和商业化进程不断提速,正在加快与千行百业深度融合。 大模型实验室架构图 大模型实验室建设内容 一、课…...
leetcode707.设计链表
题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的…...
【K8s】Kubernetes CRD 介绍(控制器)
文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
