Docker高级篇之Docker-compose容器编排

文章目录

    • 1. Docker-compse介绍
    • 2. Docker-compse下载
    • 3. Docker-compse核心概念
    • 4. Docker-compse使用案例

1. Docker-compse介绍

Docker-compose时Docker官方的一个开源的项目,负责对Docker容器集群的快速编排。Docker-compose可以管理多个Docker容器组成一个应用,你需要定义一个YAML格式的配置文件,docker-compose.yml,写好多个容器之间的调用关系,然后,只需要一个命令,就能同时启动/关闭这些容器。

docker建议我们每个容器中只运行一个服务,因为docker容器本身占用的资源比较少,所以是将每个服务单独的分割开来,但是这样我们又面临一个问题?

如果我们需要同时部署多个服务,难道我们要给每个服务单独写Dockerfile然后构建镜像,构建容器,这样是很麻烦的,所以docker官方为我们提供了docker-compos多服务部署的工具。例如现在我们需要实现一个web微服务项目,除了web服务容器本身,往往还需要加上后端的mysql服务器,redis服务器,注册中心,甚至还包括nginx负载均衡容器等。Compose运行用户通过docker-compose.yml来定义一组相关联的应用容器为一个项目,这样就可以很容器地用一个配置文件定义一个多容器应用,然后使用一条指令安装这个应用的所有依赖,完成构建。docker-compose解决了容器和容器之间如何编排的问题。

2. Docker-compse下载

官网下载的位置为:https://docs.docker.com/compose/install/

安装Docker Compose最简单也是最推荐的方法是安装Docker Desktop。Docker Desktop包括Docker Compose、Docker Engine和Docker CLI,它们是Docker Compose的先决条件。这里我Mac电脑上面是直接安装了docker desktop,自带按照了docker compose,所以如何安装我就不演示了,网上也有很多教程。
在这里插入图片描述
我们可以查看docker compose的版本:

docker-compose --version

在这里插入图片描述

3. Docker-compse核心概念

docker-compose的核心概念就是一个文件,两个要素。其中一个文件是docker-compose.yml。两个要素分别是服务和工程。服务指的是一个个应用容器的实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。工程就是由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

使用docker-compose的步骤如下:

  • 编写dockerfile定义各个微服务应用并构建出对应的镜像文件
  • 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
  • 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线

docker-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 docker-compose.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停止服务

4. Docker-compse使用案例

改造前面使用过的docker_boot案例:

  • SQL建表建库
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=1114 DEFAULT CHARSET=utf8 COMMENT='用户表';
  • 下载项目

链接:https://pan.baidu.com/s/1f2aMCKGToDp6DwPLKMJUXw
提取码:cbwn

  • 编写Dockerfile
#基础镜像使用java
FROM java:8#作者
MAINTAINER jackiechai#VOLUE指定临时文件夹为/tmp。在主机指定目录下创建一个临时文件并链接到容器的/tmp
VOLUME /tmp#将jar包添加到容器并更名
ADD docker_boot-0.0.1-SNAPSHOT.jar jackiechai_docker.jar#运行jar包RUN bash -c 'touch /jackiechai_docker.jar'
ENTRYPOINT ["java","-jar","/jackiechai_docker.jar"]
#暴露端口6001作为微服务EXPOSE 6001
  • 运行docker file构建镜像
docker build -t jackiechai_docker.jar:1.6 .

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

我们首先不使用docker-compose来运行这个项目:

  • 是先创建mysql容器实例
docker run -p 3308:3306 --name mysql57 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf:/etc/mysql/conf.d -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/logs:/logs -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d e00adb645cb5

在这里插入图片描述

修改mysql然后让navicat连接到mysql服务(操作流程看这篇博客:https://blog.csdn.net/a1023266384/article/details/119455841)同时创建数据库和表:

不进行这步操作可能报错:1130 - Host ‘172.17.0.1’ is not allowed to connect to this MySQL server

在这里插入图片描述

  • 然后创建redis实例
docker run -p 6379:6379 --name redis608 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf -v /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
  • 启动镜像
docker run -d -p 6001:6001 [镜像id]

在这里插入图片描述

  • 进行swagger测试

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

数据插入成功

在这里插入图片描述

数据查找成功

上面我没使用docker-compose玩成了服务的部署。但是会存在下面这些问题:

  • 先后顺序要求固定,先mysql+redis部署,才能进行微服务的部署
  • 运行了多个run命令
  • 容器间的启停或宕机,有可能导致ip地址对应的容器实例变化,映射出错,要么生产ip写死,要么通过服务调用

使用docker-compose来运行这个项目:

  • 编写docker-compose.yml文件
version: "3"
services:microService:image: jackiechai_docker.jar:1.6container_name: ms01ports:- "6001:6001"volumes:- /Users/jackchai/Desktop/复习/Docker/boot/microService:/datanetworks:- jack_netdepends_on:- redis- mysql
redis:image: redis:6.0.8ports:- "6379:6379"volumes:- /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf - /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/datanetworks:- jack_netcommand: redis-server /etc/redis/redis.confmysql:image: mysql/mysql-server:5.7environment:MYSQL_ROOT_PASSWORD: '123456'MYSQL_ALLOW_EMPTY_PASSWORD: 'no'MYSQL_DATABASE: 'db2024'MYSQL_USER: 'jackiechai'MYSQL_PASSWORD: '123456'ports:- "3307:3306"volumes:- /Users/jackchai/Desktop/复习/Docker/boot_mysql/db:/var/lib/mysql- /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf/my.cnf:/etc/my.cnf- /Users/jackchai/Desktop/复习/Docker/boot_mysql/init:/docker-entrypoint-initdb.dnetworks:- jack_netcommand: --default-authentication-plugon=mysql_native_password
networks:jack_net

在这里插入图片描述

  • 然后修改微服务的配置,将固定地址访问改成服务名访问
server.port=6001
# ========================alibaba.druid????=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql:3307/db2024?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis????=====================
spring.redis.database=0
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis????===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.wang.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

然后重新打包

  • 然后运行docker-compose

首先我们需要坚持docker-compose是否出现语法错误:

docker-compose config -q

如果docker-compose.yml没有任何错误,它不会出现任何提示

然后我们可以运行docker-compose了

docker-compose up -d

在这里插入图片描述
然后我们进入mysql建库建表:

docker exec -it c265227ba92a bash

在这里插入图片描述

  • 最后我们使用swagger进行测试

同样可以执行成功,这里就不演示了。

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

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

相关文章

Golang:使用时会遇到的错误及解决方法详解

Go语言使用时常常会遇到的一些错误及解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下 1、go: go.mod file not found in current directory or any parent directory go mod init name 2、Failed to build the application: main.go:4:2:…

【深度学习驱动流体力学】Python流体力学Ansys Fluent

1、PyFluent:Python Ansys Fluent 的结合 PyFluent 是一个将 Python 编程语言与 Ansys Fluent 流体动力学 (CFD) 仿真软件集成的工具。它允许用户通过 Python 脚本来控制和自动化 Fluent 中的仿真任务,实现从预处理、求解到后处理的全流程控制。PyFlue…

字符串拼接之char实现

目录 一、前言 二、memcpy函数用法 三、代码实现 一、前言 c中想到字符串拼接,我们都知道可以用c库中std::string的字符串中的简单加法进行拼接。示例: int main() {std::string str1 "hello";std::string str2 "World";std::…

差动放大器

差动器的出现是为了解决直接耦合电路存在的零点漂移问题,另外,差动放大器还有灵活的输入,输出方式。 一,基本差动放大器 差动放大器在电路结构上具有对称性,三极管VT1,VT2同型号,R1R2,R3R4,R5…

每天写java到期末考试(6.10)--java小项目01

实现项目任务 java类 package java1;import java.util.ArrayList; import java.util.Scanner;public class Test {public static void main(String[] args) {//8.创建一个集合,用于存放相同个体,一个个添加,注意作用范围,将数组放…

Java从入门到放弃

线程池的主要作用 线程池的设计主要是为了管理线程,为了让用户不需要再关系线程的创建和销毁,只需要使用线程池中的线程即可。 同时线程池的出现也为性能的提升做出了很多贡献: 降低了资源的消耗:不会频繁的创建、销毁线程&…

LeetCode 算法:缺失的第一个正数c++

原题链接🔗:缺失的第一个正数 难度:困难⭐️⭐️⭐️ 题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输…

域内攻击 ----> DCSync

其实严格意义上来说DCSync这个技术,并不是一种横向得技术,而是更偏向于权限维持吧! 但是其实也是可以用来横向(配合NTLM Realy),如果不牵强说得话! 那么下面,我们就来看看这个DCSyn…

[Vue3:axios]:实现登录跳转页面展示列表(查看教师所承担课程的学生选课情况)

文章目录 一:前置操作项目结构: 二:登录页面主要流程说明运行截图前端代码Login.vue 三:列表页面交互逻辑:涉及页面Page02.vue (登录成功跳转学生选课页面)运行截图 一:前置操作 ht…

数据结构:插入排序和希尔排序

插入排序 逆序的情况下: 时间复杂度:O(N^2) 空间复杂度:O(1) 顺序的情况下: 时间复杂度:O(N) 空间复杂度…

将字符串str1复制为字符串str2

定义两个字符数组str1和str2,再设两个指针变量p1和p2,分别指向两个字符数组中的有关字符,通过改变指针变量的值使它们指向字符串中的不同的字符,以实现字符的复制。编写程序: 运行程序: 程序分析&#xff1…

【T3】畅捷通T3软件查询明细账等账簿,出现某些列串位置。

【问题描述】 查询畅捷通T3软件科目明细账的时候, 出现某些行的数据串位置, 摘要、金额、方向都没有在对应的列。 【解决方案】 根据跟踪发现,最终在客户档案上发现问题。 数据串位中对应的客户名称、简称中的对后面多了一个【tab】键的空格…

从数组和指针笔试题深度理解 sizeof 和 strlen

一、sizeof 和 strlen 的区别 a.sizeof sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。…

Mysql学习(八)——多表查询

文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,…

Deepin安装PostGresql

最近要把开发环境完全从Windows移到Deepin上,本次介绍在Deepin借助apt-get安装和配置数据库。同时可以用Dbever提供图形化管理工具。 安装PostGreSQL数据库和创建数据库 #安装postgresql zhanglianzhuzhanglianzhu-PC:/$ sudo apt-get install postgresql-16 正在…

STM32CubeIDE使用过程记录

最近在做一款机器人的开发,使用到了STM32CubeIDE,这里记录一些使用技巧方便后续查阅。 STM32CubeIDE使用过程记录 快捷键开启代码自动补全功能看门狗设置CRC设置IO口取反定时器设置 及 定时器中断外部中断GPIO配置STC15单片机GPIO模式配置片内闪存&#…

完美落地的自动化测试框架(pytest):智能生成?业务依赖?动态替换?报告构建?你来,这儿有!

前言 随着软件测试行业的快速发展,去测试化、全员测开化的趋势,技术测试已成为确保软件质量不可或缺的一环。 但对于许多没有代码基础或缺乏系统性自动化知识的测试人员来说,如何入手并实现高质量的自动化测试成为了一个挑战。 为此&#xff…

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页:花果山~程序猿-CSDN博客 文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一.配置开发环境 二…

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统 登陆界面 联系作者 如需本项目源代码,可扫码或者VX:bob1638 联系作者。 主页-02 系统功能持续更新中。。。 介绍 本系统是采用现代信息技术手段,采用JAVA开发语言,VUE语言,HTML语…

python导入非当前目录(如:父目录)下的内容

在开发python项目时,通常会划分不同的目录,甚至不同层级的目录,这时如果直接导入不在当前目录下的内容时,会报如下的错误:ModuleNotFoundError: No module named miniai其实这里跟操作系统的环境变量很类似的&#xff…