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,一经查实,立即删除!

相关文章

CentOS:安装NodeJs

1、首先安装wget yum install -y wget 如果已经安装了可以跳过该步 2、下载nodejs最新的bin包 可以在下载页面 Node包 中找到下载地址 ​wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz也可以在本地下载最新的bin包,然后通过 Ftp 上传到 Ce…

华为坤灵路由器初始化开局的注意事项,含NAT配置

坤灵路由器比较坑&#xff0c;无web界面&#xff0c;全程命令行配置&#xff0c;但是版本更新导致和华为企业路由器配置很多不一样的地方&#xff0c;今天介绍下 1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view […

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.2 从零移植 Ubuntu,基于RISC-V

1. 概述 上一章节我们的Linux kernel已经跑起来了,接下来我们就移植rootfs,在移植rootfs之前,我们要知道几个概念,这样有助于后续移植rootfs。 2. kernel和rootfs的调用关系 如下,是上一章节我们kernel运行时打印的log,可以看出他在启动时会去调用四个脚本,这四个脚本就…

非spring使用r2dbc

在非Spring环境下使用R2DBC&#xff0c;需要手动创建连接和执行SQL语句。以下是一个示例&#xff1a; java import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactoryOptions; import io.r2dbc.spi.Result; import io.r2dbc.spi.Row; import io.r2d…

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

Go语言使用时常常会遇到的一些错误及解决方法&#xff0c;文中的示例代码讲解详细&#xff0c;感兴趣的小伙伴可以了解一下 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:…

企业AI融合的五个发展阶段及工作流程

在人工智能(AI)重塑工作场所的今天,企业如何整合这项技术,实现业务流程和决策的革新?本文将探讨企业在AI融合过程中的五个发展阶段,以及如何通过这“五个C”模型来优化工作流程。 研究背景 根据微软和领英的年度工作趋势指数,我们发现员工普遍接受AI,而管理层在决策上…

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

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

字符串拼接之char实现

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

差动放大器

差动器的出现是为了解决直接耦合电路存在的零点漂移问题&#xff0c;另外&#xff0c;差动放大器还有灵活的输入&#xff0c;输出方式。 一&#xff0c;基本差动放大器 差动放大器在电路结构上具有对称性&#xff0c;三极管VT1&#xff0c;VT2同型号&#xff0c;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.创建一个集合&#xff0c;用于存放相同个体&#xff0c;一个个添加&#xff0c;注意作用范围&#xff0c;将数组放…

词频统计(Word Frequency Analysis)详解

词频统计&#xff08;Word Frequency Analysis&#xff09;是语言学和文本分析中的一个重要工具&#xff0c;用于统计文本中各个词汇的出现频率。以下是关于词频统计&#xff08;PTA&#xff09;的详细解释&#xff0c;结合参考文章中的相关信息进行归纳和总结&#xff1a; 一…

cell的复用机制和自定义cell

cell的复用机制和自定义cell UITableView 在学习cell之前&#xff0c;我们需要先了解UITableView。UITableView继承于UIScrollView&#xff0c;拥有两个两个相关协议 UITableViewDelegate和UITableViewDataSource&#xff0c;前者用于显示单元格&#xff0c;设置行高以及对单…

Java从入门到放弃

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

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

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

(第31天)【leetcode题解】404、左叶子之和

目录 404、左叶子之和题目描述思路代码 404、左叶子之和 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 思路 题目分析&#xff1a; 判断左叶子节点&#xff1a;A节点的左孩子不为空&#xff0c;且左孩子的左右孩子都为空&#xff0c;那么这个左孩子…

Java手写HashMap

之前面试拼多多的时候问到了&#xff0c;但是没练习过。 直接上代码 import java.util.Objects;/*** ClassName: MyHashMap* PackageName: com.joshua* author: Joshua Lee* create: 2024/6/10 - 20:21* description: 自己实现HashMap*/ public class MyHashMap<K, V> {…

ASP.NET的WebService跨域CORS问题解决方案

ASP.NET WebService 跨域(CORS, Cross-Origin Resource Sharing)问题通常发生在当您尝试从不同的源(域名、协议或端口)调用 WebService 时。浏览器由于安全原因,默认会阻止此类跨域请求。为了解决这个问题,您需要在 WebService 服务器端配置 CORS。 以下是在 ASP.NET We…

域内攻击 ----> DCSync

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

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

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

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

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