【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 .

buildimage 最好指定一个即可,即通过其中一种方式指定镜像

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文件

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

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

相关文章

策略模式实现

策略模式: 策略模式是一种行为型设计模式,它允许你定义一系列算法,把它们封装起来,并且使它们可以互相替换。这样,使用算法的客户端代码可以独立于具体的算法实现方式。 就好像是你要去旅行,你可以选择多种不同的交通…

【EI会议征稿中|IEEE出版】第三届信息技术与当代体育国际学术会议(TCS 2023)

【IEEE出版】第三届信息技术与当代体育国际学术会议(TCS 2023) 2023 3rd International Conference on Information Technology and Contemporary Sports 2023年第三届信息技术与当代体育国际学术会议(TCS 2023)将于2023年12月2…

Dueling DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 Dueling DQN 因为还是DQN,所以我们沿用double DQN,然后把 Qnet 换成 VAnet。 其他的不变,详情参考前一篇文章。 class VA(nn.Module):"""只有一层隐藏层的A网络和V网络"""def __init__(self, state_dim, hidd…

子目录文件夹图片汇总

import os import shutildef collect_images(source_folder, target_folder):# 遍历主文件夹及其所有子文件夹for root, dirs, files in

位1的个数

题目链接 位1的个数 题目描述 注意点 输入必须是长度为 32 的 二进制串 解答思路 位运算判断每一位是否为1 代码 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int res 0;for (int i 0; i < 32; i) {res …

项目经理和产品经理该如何选择?

最近很多人咨询“项目经理跟产品经理该怎么选&#xff0c;我更适合哪个&#xff1f;”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等&#xff0c;今天就一次性说清楚项目经理跟产品经理有什么区别&#xff0c;应该怎么选择。 不想看长篇大论的&#x…

Python+Pytest接口自动化之HTTP协议基础

HTTP协议简介 HTTP 即 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;&#xff0c;是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。 设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型…

Kubernetes版本升级到v1.18.0方法

升级k8s版本才能使用kube-prometheus安装监控 1、查看集群状态 [rootk8s-master k8s-script]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 5d22h v1.18.0 k8s-slave1 Ready <none> 4d10h v1.18.0 k…

ActiveMQ使用指南

介绍 ActiveMQ是Apache开源组织旗下的一个项目&#xff0c;是一个流行的开源消息中间件。它完全支持JMS1.1和J2EE1.4规范的JMS Provider实现&#xff0c;并且是纯Java开发的产品。ActiveMQ支持多种语言编写客户端&#xff0c;包括C,C,C#,Perl,PHP,Ruby,Ajax等&#xff0c;同时…

php5, php7,php8 有什么区别

PHP 5、PHP 7 和 PHP 8 是 PHP 编程语言的不同版本&#xff0c;它们之间有许多改进和变化。以下是它们的一些主要区别&#xff1a; 1. 性能提升&#xff1a; PHP 5&#xff1a; PHP 5.x 版本的性能相对较低&#xff0c;特别是在处理大量并发请求和执行大型应用程序时。 PHP 7…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

【unity】如何用Unity获取Windows桌面

【背景】 默认的Unity可实现的屏幕共享仅仅针对Unity编辑器的编辑窗口中的Camera展现的内容。本篇研究如何实现用Unity实时反映Windows桌面窗口画面。 【准备插件】 下载地址&#xff1a; https://download.csdn.net/download/weixin_41697242/88623496 将解压后的文件夹直…

Feign-自定义配置

目录 一、自定义Feign配置 二、修改日志级别 方式一&#xff1a;application配置文件方式 方式二&#xff1a;java代码方式 三、总结 一、自定义Feign配置 二、修改日志级别 配置Feign日志有两种方式 方式一&#xff1a;application配置文件方式 &#xff08;1&#xff09…

目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集 DOTA数据集包含2806张航空图像&#xff0c;尺寸大约从800x800到4000x4000不等&#xff0c;包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形&#xff08;区别于传统的对边平行bbox&#xff09;。类别分别为&#xff1a;plane, ship, s…

前端八股文

前端八股文 目录 前端八股文1.css选择优先级&#xff1f;2.px与rem区别&#xff1f;3.重绘与重排的区别&#xff1f;4.元素水平垂直居中的方法&#xff1f;5.什么是闭包&#xff0c;闭包有什么特点&#xff1f;6.什么是事件委托&#xff1f;7.什么是原型链&#xff1f;8.new操作…

交易历史记录20231205 记录

昨日回顾&#xff1a; select top 10000 * from dbo.CODEINFO A left join dbo.全部&#xff21;股20231205010101 B ON A.CODE B.代码 left join dbo.全部&#xff21;股20231205CONF D on A.CODED.代码left join dbo.全部&#xff21;股20231205 G on A.CODEG.代码 left…

LeetCode-合并有序链表问题

1.合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路&#xff1a; 首先建立一个头节点方便后续操作&#xff0c;然后开始循环将两个链表的节点值进行比较&#xff0c;如果list1…

A Piece of Cake

A Piece of Cake 题目链接 题意 输出一个整数表示a[n]的总和 思路 输入数组a[n]在for循环中确定数学式子ans等于它本身加上数学式子 坑点 for循环中i要从0开始&#xff0c;不然a[1] 2 x a[2] 3 x a[3] … a[0] x a[a[0]]的值就会出错&#xff0c;2 x a[2]就会变成 3 x a[…

fastapi实现websocket在线聊天

最近要实现一个在线聊天功能&#xff0c;基于fastapi的websocket实现了这个功能。下面介绍一下遇到的技术问题 1.问题难点 在线上环境部署时&#xff0c;一般是多进程的方式进行部署启动fastapi服务&#xff0c;而每个启动的进程都有自己的独立存储空间。导致存储的连接对象分…

Windows Subsystem for Linux (WSL) 安装与使用笔记

文章目录 Part.I IntroductionPart.II 安装Chap.I 安装流程Chap.II 迁移至其他盘 Part.III 使用Chap.I 一些信息Chap.II 配置下载软件的源Chap.III 安装 pip Reference Part.I Introduction Windows Subsystem for Linux 简写为 WSL&#xff0c;是 Windows 的一个 Linux 子系统…