Docker笔记:docker compose部署项目, 常用命令与负载均衡
docker compose的作用
- docker-compose是docker官方的一个开源项目
- 可以实现对docker容器集群的快速编排
- docker-compose 通过一个配置文件来管理多个Docker容器
- 在配置文件中,所有的容器通过 services来定义
- 然后使用docker-compose脚本来启动,停止和重启容器
- 使用docker-compose可以对我们项目进行快速部署
docker命令部署项目
- 比如,项目中有:nginx, web, mysql 三项服务
1 )mysql 的部署
- 拉取镜像 $
docker pull mysql
- 创建mysql, 并将mysql数据库导入到容器里
- $
docker run --name mysql_c -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
- 在物理机 $
mkdir /root/mysql/conf.d /root/mysql/data
来创建两个目录
- $
- 客户端 尝试连接 物理机上的mysql容器,成功
- 连接成功后,创建数据库或导入数据库,这里导入之前的数据库
2 )web的部署
- 测试本地的web项目是否可以链接容器数据库,检查连接配置,正常
- 这里如果mysql连接配置写的是ip最好改成 host对应的域名
- 打包或不打包的不同部署方式,参考前文
- 需要注意连接数据库的问题,这里简单举例: 这里用centos镜像来运行的,不是golang或已经打包好的镜像
- $
docker run -itd --name goweb1 --link mysql_c:mysql -p 8080:8080 -v /root/wwwroot/:/root centos
--link
之后,会在 /etc/host 生成mysql对应的别名配置,就可以连接到mysql了
- $
docker exec -it goweb1 /bin/bash
这里goweb1是容器,可以用自己的 - $
chmode -R goweb1
这里找到对应的目录修改执行权限, 这里goweb1是目录 - $
nohup ./goweb &
这里 goweb是可执行程序 - 客户端访问测试正常
3 )nginx的部署
- 如果想要不通过ip访问,通过域名访问,就要配置ng的转发
- 转发配置, 默认配置文件 default.conf,新建任意 xxx.conf 存放在物理机上 /root/nginx/conf.d
goweb.conf
upstream backend {ip_hash;server goweb1:8080; # 这里是 goweb1 容器服务的host别名
}server {listen 80;server_name goweb.xxxx.com; # 你的域名地址location / {# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP # 禁用缓存proxy_buffering off; # 反向代理的地址proxy_pass http://backend; }# error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
-
启动nginx映射端口,配置映射目录,连接web服务
- $
docker run -itd --name nginxweb -p 80:80 --link goweb1:centos -v /root/nginx/conf.d/:/etc/nginx/conf.d nginx
- $
-
检查 host配置
- $
cat /etc/hosts
- 如果是客户端访问 goweb.xxxx.com 域名,客户端需要配置相关的host, 才能访问
- 确认配置文件无误
- $
-
ping 域名 成功
-
以上是纯docker命令部署,也可通过 Dockerfile来配置部署goweb应用程序
-
不管是原生docker命令部署,还是 Dockerfile部署,其实都比较麻烦
docker compose 部署项目
1 )安装 docker compose
- 如果你是安装的桌面版 Docker,不需要额外安装,已经包含了
- 如果是没图形界面的服务器版 Docker,你需要单独安装
- 如果是 centos8 默认源是有问题的,我们可以配置到阿里源
- 参考:http://bbs.itying.com/topic/6256730b212f3a0c78d4ac16
- $
rm -rf /etc/yum.repos.d/*
- $
touch /etc/yum.repos.d/CentOS-Base.repo
- 复制链接提供的内容
- $
yum clean all
- $
yum makecache
- 在安装 docker compose 前还要配置 docker的源,这里是时候的 阿里源
- $
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- $
- $
- 参考:http://bbs.itying.com/topic/6256730b212f3a0c78d4ac16
- $
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 如果在安装的时候,后面有 docker-compose-plugin 参数,也会被安装
- $
yum install docker-compose-plugin
- 这是单独安装
- 如果是 centos8 默认源是有问题的,我们可以配置到阿里源
- 运行 docker compose 检查是否安装成功
2 )配置 docker-compose.yml
version: "3"services: # 定义容器服务mysql_c: # 当前容器配置image: mysqlcontainer_name: mysql_c # 可以不写,和配置名保持一致environment: MYSQL_ROOT_PASSWORD: 123456restart: alwaysports:- 3306:3306volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysqlgoweb1:image: gowebimg # 这个golangweb的镜像需要提前准备好build:context: ./dockerfile: Dockerfile# container_name: goweb1restart: alwaysports:- 8080:8080depends_on: # 表示 mysql_c 容器创建完成后,再去创建 goweb1 容器- mysql_cnginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb1volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d
- 验证配置文件: $
docker compose convert
- 如果有错,不会启动,输出错误,如: yaml: line3: did not find expected key
- 编译运行容器: $
docker compose up
- 后台运行: $
docker compose up -d
- $
docker ps / docker compose ps
- 这样,一次就起来了3个容器服务
- 之后,验证服务是否正常
- 如果不正常,进行检查,如 检查web服务
- $
docker compose exec 服务名 /bin/bash
- 例如: $
docker compose exec goweb1 /bin/bash
- 例如: $
- 查看里面的配置文件
- 注意一般而言,我们这样查看都是基于未打包的
- 因为打包后的可执行文件,不是docker打包可能结果和配置不匹配
- 上述配置,有可能会遇到一些问题,比如 mysql容器先启动起来,goweb应用接着启动起来,但是mysql可能还没启动起来
- 可重启应用解决 $
docker compose restart goweb1
- 可使用脚本解决
- 可重启应用解决 $
- 重启某个服务
- $
docker compose restart goweb1
- $
- docker compose 极大方便了我们结合不同的容器
- 通过一个配置文件,一个命令即可部署
3 )解决启动顺序问题导致的数据库访问不通
- 使用 wait-for-it.sh 脚本
- https://github.com/vishnubob/wait-for-it
-
改写 compose 文件
goweb1:image: gowebimg # 这个golangweb的镜像需要提前准备好build:context: ./dockerfile: Dockerfile# container_name: goweb1restart: alwaysports:- 8080:8080depends_on: # 表示 mysql_c 容器创建完成后,再去创建 goweb1 容器- mysql_ccommand: ["./wait-for-it.sh", "mysql_c:3306", '--', './goweb'] # goweb是编译后的可执行文件
docker compose 常见命令
- $
docker compose build
可编译/重新编译服务- 如果有 Dockerfile会编译我们的镜像
–force-rm
:总是删除构建过程中的临时容器。–no-cache
:镜像构建过程中不使用 cache。–pull
:始终先尝试通过 pull 来获取最新版本的镜像
- $
docker compose logs
可查看操作日志 - $
docker compose ps
可查看当前主机容器信息,类似 docker ps - $
docker compose start
启动容器 - $
docker compose restart
重启容器 - $
docker compose stop
停止容器 后面不加容器,则全部停止 - $
docker compose rm
删除容器 不加容器,删除停止状态的容器-f
强制删除
- $
docker compose exec
进入容器 - $
docker compose version
查看版本
docker compose 实现容器扩容
1 )方案1:基于命令
- $
docker compose up --scale='goweb1=3' -d
- goweb1 是服务名, 3 是部署扩展3台用于负载均衡
- 注意,如果web服务启动多态,配置相同的端口会有问题,这时只需要注释掉 上面的 ports 配置
# ports:# - 8080:8080
- $
docker compose ps
可看见3台 goweb1 服务 - 结束掉一台,会自动重新负载均衡
- 可以进入 nginx 服务 ping goweb1 服务,ip地址会动态变化
2 )方案2: 基于docker-compose.yml文件
goweb1:build:context: ./dockerfile: Dockerfilerestart: alwaysdeploy:replicas: 3 #副本数量resources: #资源limits: #配置cpucpus: "0.5" # 设置该容器最多只能使用 50% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启depends_on:- mysql_ccommand: ["./wait-for-it.sh","mysql_c:3306","--","./goweb"]
- 注意,启动多个副本不能指定 container_name
相关文章:
Docker笔记:docker compose部署项目, 常用命令与负载均衡
docker compose的作用 docker-compose是docker官方的一个开源项目可以实现对docker容器集群的快速编排docker-compose 通过一个配置文件来管理多个Docker容器在配置文件中,所有的容器通过 services来定义然后使用docker-compose脚本来启动,停止和重启容…...
Java单元测试:JUnit和Mockito的使用指南
引言: 在软件开发过程中,单元测试是一项非常重要的工作。通过单元测试,我们可以验证代码的正确性、稳定性和可维护性,帮助我们提高代码质量和开发效率。本文将介绍Java中两个常用的单元测试框架:JUnit和Mockito&#x…...

缓存雪崩问题与应对策略
目录 1. 缓存雪崩的原因 1.1 缓存同时失效 1.2 缓存层无法应对高并发 1.3 缓存和后端系统之间存在紧密关联 2. 缓存雪崩的影响 2.1 系统性能下降 2.2 数据库压力激增 2.3 用户请求失败率增加 3. 应对策略 3.1 多级缓存 3.2 限流与降级 3.3 异步缓存更新 3.4 并发控…...

python编程需要的电脑配置,python编程用什么电脑
大家好,小编来为大家解答以下问题,python编程对笔记本电脑配置的要求,python编程对电脑配置的要求有哪些,现在让我们一起来看看吧! 学习python编程需要什么配置的电脑 简单的来讲,Python的话普通电脑就可以…...
目标检测YOLO实战应用案例100讲-基于深度学习的跌倒检测(续)
目录 3.3 基于YOLOv7算法的损失函数优化 3.3.1 IoU损失策略 3.3.2 GIoU回归策略 3.3.3...

05-命令模式
意图(GOF定义) 将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求排队或者记录日志,以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…...
Docker安全及日志管理
DockerRemoteAPI访问控制 默认只开启了unix socket,如需开放http,做如下操作: 1、dockerd -H unix:///var/run/docker.sock -H tcp://192.168.180.210:2375 2、vim /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H uni…...
【LeetCode每日一题】152. 乘积最大子数组
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 思路 由于做了53. 最大子数组和 下意识觉得求出所有元素的以该元素结尾的连续…...

Python 反射
Python 反射是什么? 学习了几天,做个总结留给自己看。 感觉跟 SQL 入门要掌握的原理一样,Python 反射看起来也会做4件事,“增删查获” 增 - 增加属性,方法 setattr 删 - 删除属性,方法 delattr 查 - …...

HTML基本网页制作
一、制作工商银行电子表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>第一个网页的标题</ti…...

Tcl语言语法精炼总结
一、置换符号 1.变量置换 $ TCl解释器会将认为$后面为变量名,将变量名置换成它的值 2.命令置换 [] []内是一个独立的TCL语句 3.反斜杠置换 \ 换行符、空格、[、$等被TCL解释器当作特殊符号处理。加上反斜杠后变成普通字符 \t TAB \n 换行符 4.双引号 “” “…...

[GPT]Andrej Karpathy微软Build大会GPT演讲(下)--该如何使用GPT助手
该如何使用GPT助手--将GPT助手模型应用于问题 现在我要换个方向,让我们看看如何最好地将 GPT 助手模型应用于您的问题。 现在我想在一个具体示例的场景里展示。让我们在这里使用一个具体示例。 假设你正在写一篇文章或一篇博客文章,你打算在最后写这句话。 加州的人口是阿拉…...

路由器静态路由的配置
路由器静态路由的配置步骤如下: 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0,其中g0/0/0表示路由器的接口,可以根据实际情况进行修改。然后使用命令ip add配置接口的IP地址。配置下一跳地址。在静…...
[Firefly-Linux] RK3568在Ubuntu上安装内核头文件实现本地编译驱动程序
文章目录 一、介绍二、安装三、编译驱动四、自行编译debian包一、介绍 在 Linux 操作系统中,linux-headers.deb 和 linux-images.deb 分别用于安装内核头文件和内核二进制文件。 linux-headers.deb: 内核头文件包,通常以 linux-headers-x.x.x-x 的形式命名。包含编译内核模…...
RabbitMQ Streams 详解
RabbitMQ Streams是一种持久复制数据结构,可以完成与队列相同的任务:它们缓冲来自生产者的消息,这些消息由消费者读取。然而,流与队列的区别在于两个重要方面:消息的存储和消费方式。 Streams为仅追加的消息日志建模&a…...

跨境电商如何利用跨境客服软件提升销售额
随着全球化的推进,跨境电商成为了许多企业拓展市场的重要途径。然而,跨境电商面临着语言、文化、时差等多种挑战,为了提供更好的客户服务并提升销售额,跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…...
css/less/scss代码注意事项
一.命名 1.类名使用小写字母,以中划线分割;id 使用 驼峰式命名; 2.less/scss中的函数、混合采用驼峰命名; 3. class 的命名不要使用 标签名,如.p .div .img; 二.选择器 尽量使用直接子选择器,否则,有时会造成性能损耗 .content .title { .…...

Git应用——代码提交规范 feat ,fix ,style
当前使用 feat 增加新功能fix 修复问题/BUGstyle 代码风格相关无影响运行结果的perf 优化/性能提升refactor 重构revert 撤销修改test 测试相关docs 文档/注释chore 依赖更新/脚手架配置修改等workflow 工作流改进ci 持续集成types 类型定义文件更改wip 开发中 别处看到 fea…...

TDengine Kafka Connector将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine
教程放在这里:TDengine Java Connector,官方文档已经写的很清晰了,不再赘述。 这里记录一下踩坑: 1.报错 java.lang.UnsatisfiedLinkError: no taos in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.j…...

单片机的低功耗模式介绍
文章目录 简介一、功耗来源说明1.1、芯片工作模式1.2、静态损耗1.3、I/O额外损耗1.4、动态损耗 二、功耗如何测量三、降低功耗有什么方法3.1、选取合适的芯片工作模式3.2、降低工作频率3.3、关闭不需要使用的外设3.4、 降低静态电流损耗3.5、 周期采集供电3.6、 设置IO口状态 四…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...