当前位置: 首页 > news >正文

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
    • $ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
      • 如果在安装的时候,后面有 docker-compose-plugin 参数,也会被安装
    • $ yum install docker-compose-plugin
      • 这是单独安装
  • 运行 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解释器会将认为$后面为变量名&#xff0c;将变量名置换成它的值 2.命令置换 [] []内是一个独立的TCL语句 3.反斜杠置换 \ 换行符、空格、[、$等被TCL解释器当作特殊符号处理。加上反斜杠后变成普通字符 \t TAB \n 换行符 4.双引号 “” “…...

[GPT]Andrej Karpathy微软Build大会GPT演讲(下)--该如何使用GPT助手

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

路由器静态路由的配置

路由器静态路由的配置步骤如下&#xff1a; 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0&#xff0c;其中g0/0/0表示路由器的接口&#xff0c;可以根据实际情况进行修改。然后使用命令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是一种持久复制数据结构&#xff0c;可以完成与队列相同的任务&#xff1a;它们缓冲来自生产者的消息&#xff0c;这些消息由消费者读取。然而&#xff0c;流与队列的区别在于两个重要方面&#xff1a;消息的存储和消费方式。 Streams为仅追加的消息日志建模&a…...

跨境电商如何利用跨境客服软件提升销售额

随着全球化的推进&#xff0c;跨境电商成为了许多企业拓展市场的重要途径。然而&#xff0c;跨境电商面临着语言、文化、时差等多种挑战&#xff0c;为了提供更好的客户服务并提升销售额&#xff0c;跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…...

css/less/scss代码注意事项

一.命名 1.类名使用小写字母&#xff0c;以中划线分割;id 使用 驼峰式命名; 2.less/scss中的函数、混合采用驼峰命名; 3. class 的命名不要使用 标签名,如.p .div .img; 二.选择器 尽量使用直接子选择器&#xff0c;否则&#xff0c;有时会造成性能损耗 .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

教程放在这里&#xff1a;TDengine Java Connector&#xff0c;官方文档已经写的很清晰了&#xff0c;不再赘述。 这里记录一下踩坑&#xff1a; 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口状态 四…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...