四十六、docker-compose部署

一个项目肯定包含多个容器,每个容器都手动单独部署肯定费时费力。docker-compose可以通过脚本来批量构建镜像和启动容器,快速的部署项目。

使用docker-compose部署主要是编写docker-compose.yml脚本。

一、项目结构

不论是Dockerfile还是docker-compose.yml脚本的编写都依赖上下文,所以需要明确部署文件夹的项目结构。假设当前项目部署文件夹名为auto,那么它的结构如下:

二、安装

方法1:前提得安装了pip

pip install docker-compose

方法2:

(1)使用curl命令下载docker-compose二进制文件:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

(2)为二进制文件添加可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

(3)验证安装是否成功

docker-compose --version

三、把后端项目、nginx目录拉取过来

(1)获取我原来放在云服务器里manual文件夹中的后端项目git地址,然后在auto里面重新拉取代码并存房贷django_app这个目录下。

(2)在auto目录下新建一个目录nginx_docker。将原来在manual里面的nginx目录拷贝到当前auto目录里面的nginx_docker目录下。

cp -r /ck13/manual/nginx/* ./

(3)在auto目录下创建一个docker-compose.yaml

vim docker-compose.yml

(4)删掉auto/nginx_docker目录下的nginx.conf。剩余三个文件需要映射到nginx容器里.

这里可以参考看一下官方文档: docs.docker.com/reference/

# 指定版本
version: "3"
services:
  # 每个服务的名称就是启动后的容器的名字
  # 当使用docker-compose -p ck13 -d up 命令部署后, 这个服务的容器的默认名为 ck13_redis_1
  redis:
    # 启动这个容器需要用到的景象是什么
    image: redis:alpine
    # 重启策略
    restart: always
  mariadb:
    image: mariadb:latest
    restart: always
    # 启动容器时需要定义的环境变量
    environment:
      MARIADB_ROOT_PASSWORD: pythonvip
      MARIADB_DATABASE: lemontest
    # 挂载卷
    volumes:
      - mariadb:/var/lib/mysql
    ports:
      - "3306:3306"
  django_app:
    # 服务依赖,会等待对应的服务启动之后才会启动当前服务
    depends_on:
      - redis
      - mariadb
    # 如果需要在启动服务之前构建镜像
    # 指定构建目录,这个目录就是Dockerfile所在的目录
    # 它是一个相对路径,相对于当前的docker-compose.yml文件
    build: ./django_app
    # 如果有build指令, 那么image指令就是指定生成镜像取的名字
    image: ck13_django_app_img
    environment:
       ENV: production
    restart: always
    volumes:
      - app_logs:/app/logs
  nginx:
    depends_on:
      - django_app
    build: ./nginx_docker
    image: ck13_nginx_img
    restart: always
    # 端口映射
    # 宿主机端口:容器端口
    # TODO: 注意端口要用双引号包裹
    ports:
      - "9400:80"
      - "9500:81"


# 服务中定义的命名卷,必须在全局的volumes中声明一下
volumes:
  mariadb:
  app_logs:

因为容器名要改变,所以我们之前在django后端项目中配的一些路径啥的都不能用了。

这里修改了记得在云服务器当前项目文件夹中重新git pull拉取最新的代码。

还有这里的配置文件也要改,修改default.conf文件。将proxy_pass改成上面docker-compose.yml中的服务名。

 

nginx_docker目录下新增Dockerfile文件

 

from nginx:alpine
  
COPY ./static /usr/share/nginx/html/static/
COPY ./dist/ /usr/share/nginx/html/dist/
COPY ./conf.d /etc/nginx/conf.d

VOLUME /var/log/
EXPOSE 80 81

 删除我之前手动部署的容器、镜像

docker stop ck13_nginx ck13_django ck13_db ck13_redis

docker rm ck13_nginx ck13_django ck13_db ck13_redis

在这个目录下去运行docker-compose命令。

docker-compose -p ck13 up -d

 或者可以用自动化部署脚本,放在你项目的同级目录里。

#! /bin/bash
project=ck13
delete() {
	# 删除操作
	echo "开始删除项目"
	echo "删除项目只会删除容器,不会删除卷"
	echo "要删除数据卷请手动删除"
	docker-compose -p $project down
}
deploy() {
	# 部署操作
	echo "开始部署项目"
	echo "注意重新部署项目会重新构建镜像!"
	docker-compose -p $project ps | grep -E "${project}_.*" &>/dev/null
	if (($? == 0)); then
		echo "已存在项目${project}!"
		read -p "要重新部署项目吗?(y/n)" confirm
		if [[ $confirm == "y" ]]; then
			delete
			docker-compose -p $project up -d --build
		fi
	else
		docker-compose -p $project up -d --build
	fi
}
restart() {
	# 重启操作
	echo "开始重启项目"
	docker-compose -p $project ps | grep -E "${project}_.*" &>/dev/null
	if (($? != 0)); then
		echo "不存在项目${project}"
	else
		docker-compose -p $project restart
	fi
}
close() {
	echo "开始暂停项目"
	docker-compose -p $project stop
}
start() {
	while true; do
		echo "接口自动化测试平台部署系统"
		select name in "部署项目" "重启项目" "暂停项目" "删除项目" "退出菜单"; do
			case $name in
			"部署项目")
				deploy
				break
				;;
			"重启项目")
				restart
				break
				;;
			"暂停项目")
				close
				break
				;;
			"删除项目")
				delete
				break
				;;
			"退出菜单")
				break
				;;
			esac
		done
		if [ $name = "退出菜单" ]; then
			break
		fi
	done
}
start

运行脚本

 

 部署中如果有问题的话,可以使用如下命令去检查问题。

docker logs ck13_nginx_1

docker volume ls

# 查找日志路径
docker inspect ck13_log
# 
cd /var/lib/docker/volumes/ck13_log/_data/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验室汇报汇报汇报

1、kafka是什么 Producer:即生产者,消息的产生者,是消息的入口;Consumer:消费者,即消息的消费方,是消息的出口;Broker:中间代理,即一个broker就是一个server。…

接口优化的常见方案实战总结

一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。    二、接口优化…

设计模式-结构型模式之装饰模式

3. 装饰模式3.1. 模式动机一般有两种方式可以实现给一个类或对象增加行为:继承机制使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制…

java基础——迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类

迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类 第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。 想要遍历Collection集合&…

链表基础知识

1.链表必知必会 什么是链表? 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思&#…

【好刊推荐】知名出版社影响因子7+被踢出SCI,投稿前如何选期刊?

今年3月Hindawi旗下的19本期刊被SCIE剔除,其中有一本影响因子7,以下从期刊各个指标方面分析一下具体原因: 期刊剔除:影响因子7 期刊简介 期刊名称: OXIDATIVE MEDICINE AND CELLULAR LONGEVITY ISSN / eISSN&#…

数据结构——堆和优先队列

文章目录前言堆堆的引入堆的定义堆的储存结构优先队列优先队列简介优先队列的基础操作入队出队优先队列的实现堆的应用堆排序TOP-K问题什么是TOP-K问题TOP-K问题的排序解法TOP-K问题的堆解法总结前言 堆是一个比较基础,且实现起来难度也不算太大的一个数据结构。而…

可选择的Elasticsearch好用的可视化客户端工具

前言 常言道:工欲善其事,必先利其器。对于我们开发和测试同学来说,在日常的工作中有一款趁手的工具那真实如虎添翼啊,工作效率可是蹭蹭蹭的往上长,节省下来的时间摸摸鱼该有多好啊。最近我们系统开始使用elasticsearc…

Spring注解开发

定义bean 我们先直接通过一张图来理解注解在Spring开发中如和定义bean: 那么我们既然加了注解,相当于定义了bean可是Spring的配置文件怎么知道他的存在,于是我们引入component-scan进行包扫描即为了让Spring框架能够扫描到写在类上的注解&…

Lego- 美团接口自动化测试实战(详细解析)

目录:导读 一、概述 1.1 接口自动化概述 1.2 提高 ROI 1.3 Lego 的组成 二、脚本设计 2.1 Lego 的做法 2.2 测试脚本 2.3 配置文件 三、用例设计 3.1 一些思考 3.2 Lego 接口自动化测试用例 3.3 参数化 3.4 前后置动作 3.5 执行各部分 四、网站功能 …

八百字讲清楚——BCEWithLogitsLoss二分类损失函数

BCEWithLogitsLoss是一种用于二分类问题的损失函数,它将Sigmoid函数和二元交叉熵损失结合在一起。 假设我们有一个大小为NNN的二分类问题,其中每个样本xix_ixi​有一个二元标签yi∈0,1y_i\in {0,1}yi​∈0,1,并且我们希望预测每个样本的概率…

Seal AppManager发布:基于平台工程理念的全新应用部署管理体验

4月12日,数澈软件Seal(以下简称“Seal”)宣布推出新一代应用统一部署管理平台 Seal AppManager,采用平台工程的理念,降低基础设施操作的复杂度为研发和运维团队提供易用、一致的应用管理和部署体验,进而提升…

28岁,他是如何成为上市公司测试总监的

现在的大环境下,各行各业都开始内卷起来,测试也不例外,企业要求也越来越高,“会代码”逐渐成为测试工程师的一个标签。你要想拿到一个不错的薪资,必不可少的一个技能—自动化测试,自动化测试难吗&#xff1…

【2023最新】超详细图文保姆级教程:App开发新手入门(5)

上文回顾,我们已经完成了一个应用的真机调试,本章我们来了解一下如何引入YonBuilder移动开发的(原生)移动插件, 并利用移动插件完成一个简单的视频播放器。 8. 「移动插件」的使用 8.1 什么是 「移动插件」? 用通俗…

HDLBits-Modules 题解【Verilog模块例化】(中文翻译+英文原文,可顺带学习英文)

Moudule 概念介绍 到目前为止,你已经熟悉了一个模块,它是一个通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分(例如赋值语句和always块)组合而成的更大模块来构建的。因为模…

对决:Kubernetes vs Docker Swarm - 谁才是最优秀的容器编排方案?

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 文章目录一、介绍1. 什么是Kubernetes2. 什么是Docker Swarm3. 为什么需要容器编排?二、 架构比较1. Kubern…

C++【栈队列(3种)反向迭代器】

文章目录一、容器适配器二、栈(一)栈定义(二)栈使用接口(三)栈模拟实现(1) 栈模拟实现解析(2) 栈模拟实现代码(3) 栈模拟结果三、队列(一)普通队列(1)普通队列…

30天学会《Streamlit》(3)

30学会《Streamlit》是一项编码挑战,旨在帮助您开始构建Streamlit应用程序。特别是,您将能够: 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第3天 - st.…

实验三、图像复原

1. 实验目的 (1) 理解退化模型。 (2) 掌握常用的图像复原方法。 2. 实验内容 (1) 模拟噪声的行为和影响的能力是图像复原的核心。 示例 1 :使用 imnoise 添加噪声。 J imnoise(I,gaussian) 将方差为 0.01 的零均值高斯白噪声添加到灰度图像 I。 J imnoise(I,g…

最近ChatGPT封号太严重了,这里是解封攻略步骤(建议收藏)

这个周末,先是意大利暂时封杀ChatGPT,限制OpenAI处理本国用户信息。 接着,据韩国媒体报道,三星导入ChatGPT不到20天,便曝出机密资料外泄。 还没结束,又有大量网友发现ChatGPT目前停止注册,开始…