使用 docker-compose 构建你的项目

使用 docker-compose 构建你的项目

  • 1. Docker
    • 1.1 安装
    • 1.2 docker-compose
  • 2 准备项目
    • 2.1 初始化一个node项目
    • 4. 准备一个 Dockerfile 文件
    • 5. 构建镜像
  • 3.docker-compose构建
    • 3.1 配置docker-compose.yml 文件
    • 3.2 编排多个服务
  • 重新构建镜像 --force-rm 删除构建过程中的临时容器。
  • 运行容器
  • 4. 水平扩展 node 服务
    • 4.1 scale
    • 4.2 修改nginx配置文件

最近再次手撕docker。所以就想者分享一下这方面的知识。欢迎各位踩我

1. Docker

docker的是什么, 就当大家有一定的Docker基础了

所以这篇文章主要是实战方面的内容,具体理论的话,可以去搜搜其它文章了解学习一下。或者去官网

1.1 安装

window 系统或者 macos 系统可以直接去官网下载 Docker Desktop,链接:hub.docker.com/?overlay=on…
然后就是傻瓜式安装了,这边就不介绍了
注意: window下需要企业版才能安装,家庭版不能安装(或者安装比较麻烦)

1.2 docker-compose

在安装完 Docker Desktop 后,会默认自动安装好 docker-compose
可以自己在命令行上试试,查看当前版本

docker-compose -v
docker -v

2 准备项目

2.1 初始化一个node项目

mkdir  /www
mkdir  /www/node-server
cd /www/node-server

在这里插入图片描述

  1. 初始化package.json
npm init -y

执行后创建以下文件及文件夹
在这里插入图片描述

  1. 搭建一个http服务器
    这边使用的是express,用koa也行,看自己喜欢
npm install express

简单代码 dev-server.js
在这里插入图片描述

 let express = require('express')
let os = require('os')
let app = express()
// 获取本机ip地址
function getLocalIpAddress () {let ip = ''let netInfo = os.networkInterfaces()let osType = os.type()if (osType === 'Windows_NT') { for (const dev in netInfo) {// win7的网络信息中显示为本地连接,win10显示为以太网if (dev === '本地连接' || dev === '以太网') {for (let j = 0; j < netInfo[dev].length; j++) {if (netInfo[dev][j].family === 'IPv4') {ip = netInfo[dev][j].address;break;}}}}} else if (osType === 'Linux') {ip = netInfo.eth0[0].address;}return ip
}
app.get('/getJson', (request, response) => {response.send({title: 'Hello Express、Hello Docker',ip: getLocalIpAddress(),env: process.env.NODE_ENV})
})
// 监听3000端口
app.listen(3000, () => {console.log('server is started')
})

4. 准备一个 Dockerfile 文件

在这里插入图片描述

Docker中镜像和容器的关系就像类与实例的关系
镜像可以通过Dockerfile文件来生成,容器通过镜像来创建

Dockerfile用于生成镜像
复制代码

# 指定的一个基础镜像
FROM node:latest
# 工作目录
WORKDIR /www/node-server/  
# copy package.json 到工作目录中
COPY package.json /www/node-server/package.json
# 安装依赖
RUN npm install
# 拷贝当前目录的文件到工作目录中
# 如果有不需要忽略的文件,可以写在 .dockerignore 文件中,比如忽略 node_modules 文件夹
COPY . /www/node-server/
# 向外暴露3000端口
EXPOSE 3000
# 容器运行后执行的命令
CMD npm run start

5. 构建镜像

修改package.json 增加代码

  "scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "node dev-server.js 3000"},

在这里插入图片描述
执行构建镜像命令

 docker build -t node-server .

检查构建结果
在这里插入图片描述

构建成功后,创建容器

docker run --name node-server-1 -p 3000:3000 node-server

使用浏览器访问 3000 端口看看是否启动成功了
在这里插入图片描述

3.docker-compose构建

前面我们要使用容器时,需要先定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。
然而我们的系统一般都包含上百的服务,每个服务又有多个实例,如果全手动来启动关闭的话,那工作量之大可想而知

那通过 docker-compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

3.1 配置docker-compose.yml 文件

在项目目录下创建一个 docker-compose.yml 文件
在这里插入图片描述

version: "3"
services: # 服务列表node: # node 服务build: context: /www/node-server # Dockerfile 的目录,用于构建镜像dockerfile: Dockerfilecontainer_name: node-server-1 # 容器名称ports: # 暴露的端口- "3000:3000"restart: always # 自动重启environment: # 设置环境变量- NODE_ENV=productioncommand: npm run start # 覆盖容器启动后默认执行的命令

构建镜像

docker-compose build

执行结果如下
在这里插入图片描述

运行容器

docker-compose up -d

报错

[root@dev07 music]# docker-compose up -d
Creating node-server-1 ... errorCreating node-server-1 ... ERROR: for node-server-1  Cannot create container for service node: Conflict. The container name "/node-server-1" is already in use by container "39e4c77c6c5215731eef4aERROR: for node  Cannot create container for service node: Conflict. The container name "/node-server-1" is already in use by container "39e4c77c6c5215731eef4ab66d1e25d0428619c82e33ba49d059d2b0fc2fc87c". You have to remove (or rename) that container to be able to reuse that name.
ERROR: Encountered errors while bringing up the project.

问题分析:
使用docker build时 ,构建过镜像
解决方案:

[root@dev07 music]# docker rm 39e4c77c6c5215731eef4ab66d1e25d0428619c82e33ba49d059d2b0fc2fc87c

不出意外的话,通过浏览器访问3000端口也是能正常访问

3.2 编排多个服务

比如我们现在需要构建一个 nginx服务来将请求代理到我们的 node-server,那我们需要构建两个服务
那么问题来了

  • nginx容器如何使用我的自己的nginx.conf配置文件

可以通过 volumes 文件映射

  • nginx容器和 node-server 容器如何进行通信

可以使用 docker-inspect 命令来查看 node-server 容器的IP地址,然后修改nginx.conf的配置、
使用networks和links

docker容器每次重新构建运行时,IP 地址不一定是一样的,所以每次都要修改nginx.conf的配置,所以方案1的效率显然是低下的。

  • 新增一个 nginx.conf 配置文件
worker_processes 1;events {worker_connections 1024;
}
http {upstream node-server {  server node:3000;} server {listen 80;server_name localhost;location / {proxy_pass http://node-server/;}}
}

重新修改一下 docker-compose.yml 文件

复制代码# docker-compose.yml

version: "3"
services: # 服务node: # node 服务build: . # Dockerfile 的目录,用于构建镜像container_name: node-server-1 # 容器名称ports: # 暴露的端口- "3000:3000"restart: always # 自动重启environment: - NODE_ENV=productionnetworks: # 加入网络- "my-network"command: npm run start # 覆盖容器启动后默认执行的命令nginx:image: nginx:latest 指定 nginx 镜像ports: # 将本机的 8080 端口映射到容器的80端口- "8080:80"            container_name: nginx-noderestart: alwaysvolumes: # 映射本机 F:/nginx.conf 文件到 容器的 /etc/nginx/nginx.conf:ro 文件- "F:/nginx.conf:/etc/nginx/nginx.conf:ro"networks: - "my-network"links: # 设置 node 服务别名,其实是设置/etc/hosts的域名解析- "node"depends_on: # 指定依赖于哪个服务- node
networks: # 网络my-network: # 网络名称driver: bridge

重新构建

复制代码# 删除上次构建的容器
docker-compose down

重新构建镜像 --force-rm 删除构建过程中的临时容器。

docker-compose build --force-rm

运行容器

docker-compose up -d
不出意外的话,通过浏览器访问本地的8080端口,是可以访问到 node-server 的

按着上面的套路,可以继续扩展 redis、mysql服务等,也是通过加入 network 和 links 来进行相互通信
这部分就不进行介绍了

4. 水平扩展 node 服务

当用户量比较小的情况下,我们一个 node 服务就够用了,当用户量大的时候,就一个 node 服务的话,就显得力不从心了。
一般情况下都是升级机器,加服务,通过 nginx进行负载均衡
在这里插入图片描述

那我们如何通过 docker-compose 快速的水平扩展服务呢?

4.1 scale

docker-compose 给我们提供了一个 scale 命令,用于在本机下快速构建多个服务

# 删除上次构建的容器
docker-compose down
# 重新构建镜像 --force-rm 删除构建过程中的临时容器。
docker-compose build --force-rm
# 运行容器 增加 --scale node=5
docker-compose up -d --scale node=5 

通过–scale node=5我们构建5个node服务
不过不出意外的话,是会构建失败的,报端口占用错误

因为我们的每个node服务都占用了 3000 本机的端口。
所以我们需要修改一下 docker-compose.yml 文件,只暴露容器的3000端口,不暴露本机的端口

# docker-compose.yml
version: "3"
services: # 服务node: # node 服务build: . # Dockerfile 的目录,用于构建镜像# container_name: node-server-1 # 容器名称# ports: # 暴露的端口#    - "3000:3000"expose:- "3000"restart: always # 自动重启environment: - NODE_ENV=productionnetworks: # 加入网络- "my-network"command: npm run start # 覆盖容器启动后默认执行的命令nginx:image: nginx:latest 指定 nginx 镜像ports: # 将本机的 8080 端口映射到容器的80端口- "8080:80"            container_name: nginx-noderestart: alwaysvolumes: # 映射本机 F:/nginx.conf 文件到 容器的 /etc/nginx/nginx.conf:ro 文件- "F:/nginx.conf:/etc/nginx/nginx.conf:ro"networks: - "my-network"links: # 设置 node 服务别名,其实是设置/etc/hosts的域名解析- "node"depends_on: # 指定依赖于哪个服务- node
networks: # 网络my-network: # 网络名称driver: bridge

重新运行

复制代码# 运行容器 增加 --scale node=5
docker-compose up -d --scale node=5
不出意外的话,这次可以构建成功
通过 docker ps -a 可以查看当前运行的容器
复制代码docker ps -a
不出意外的话,通过nginx访问,负载均衡没有生效,每次访问得到的ip地址一直是同一个

4.2 修改nginx配置文件

我们通过 docker inspect nginx-node 命令,在查看一下 nginx 容器的信息

docker inspect nginx-node

在这里插入图片描述

可以看到 “node-server_node_3:node”,我们nginx配置了server node:3000;,所以每次请求,nginx都将请求代理到node-server_node_3这个node服务上了,

upstream node-server {  server node:3000;
} 

所以我们修改一下 nginx.conf 配置,这样就能将请求代理到不同的机器上了

upstream node-server {  upstream node-server {  server node_1:3000 weight=3; # 加权重server node_2:3000;server node_3:3000;server node_4:3000;server node_5:3000;}
} 

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

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

相关文章

基于springboot大学生租房系统springboot10

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

.bat批处理命令处理文件

批处理命令处理文件找到上级目录&#xff0c;并删除文件与文件夹 参考资料&#xff1a; [BAT] 如何获取bat的上一级目录、上两级目录..._bat 上层目录_Risun_Lee的博客-CSDN博客echo offset currPath%~dp0set parentPathset parentparentPath:beginfor /f "tokens1,* de…

人工智能如何提高转录效率

人工转录已经以某种形式存在了数百年&#xff0c;甚至数千年。近年来&#xff0c;在人工智能&#xff08;AI&#xff09;技术推动下&#xff0c;转录取得长足发展。转录文稿本身是音频内容的文本形式&#xff1b;借此&#xff0c;读者无需再听一遍录音便可了解一段时间内所讲述…

HTTP 协商缓存 ETag、If-None-Match

&#xff08;1&#xff09;浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上ETag。 ETag是服务器根据当前请求的资源生成的一个唯一标识。 这个唯一标识是一个字符串&#xff0c;只要资源有变化这个串就不同&#xff…

Xilinx SDK编译完成自动生成SREC文件(适用于ISE、Vivado、Vitis)

把elf转换成srec格式的常规方式&#xff0c;是打开Program Flash Memory界面&#xff0c;选择elf文件&#xff0c;点击Convert ELF to SREC 会在hardware目录下的cache文件夹下生产srec文件。 可以通过配置编译后执行命令&#xff0c;在每次编译完成自动生产srec文件。 会在…

精品Python校园社团活动签到报名小程序

《[含文档PPT源码等]精品基于Python实现的校园社团小程序》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js…

2023年华数杯数学建模C题母亲身心健康对婴儿成长的影响解题全过程文档及程序

2023年华数杯全国大学生数学建模 C题 母亲身心健康对婴儿成长的影响 原题再现&#xff1a; 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c;还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、…

知名IT网站博客园陷入绝境

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 博客园陷入生死存亡的绝境。 5月份知名IT开发者网站发布文章称“博客园网站遇到困难了&#xff1a;寻求捐助”&#xff0c;并开通了捐助渠道。4个月过去了&#xff0c;好像效果并不明显&#xff…

分享5款小编被私信推荐最多的软件

​ 最近陆陆续续收到好多小伙伴的推荐&#xff0c;这边也是抓紧时间整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.图床工具——PicGo ​ PicGo是一款免费的个人图床工具&#xff0c;支持Windows、MacOS和Linux系统。它可以让您快速地上传图片并获取图片的URL链接&a…

C#调用C++ dll 返回数组

先看一下C语言函数返回数组的问题&#xff1b; 先看一个错误的示范&#xff1b; 因为 a 是局部变量&#xff0c;只存在函数 function() 中&#xff0c;返回给main中的b是错误的&#xff1b; 函数返回数组的一种写法如下&#xff1b; #include<stdio.h> int function(in…

极光笔记 | 大语言模型插件

在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;是根据预训练数据集进行”学习“&#xff0c;获取可以拟合结果的参数&#xff0c;虽然随着参数的增加&#xff0c;模型的功能也会随之增强。但无论专业领域的小模型&#xff0c;还是当下最火、效果最好的大模…

2023 年最新 Docker 容器技术基础详细教程(更新中)

Docker 基本概述 Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux 或 Windows 操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间…

跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍

Xojo mac是一款跨平台的软件开发工具&#xff0c;它允许开发人员使用一种编程语言来创建应用程序&#xff0c;然后可以在多个操作系统上运行。Xojo 2023是Xojo开发工具的最新版本&#xff0c;它提供了许多功能和改进&#xff0c;以帮助开发人员更轻松地构建高质量的应用程序。 …

Redis代码实践总结

一、背景&#xff1a; redis从安装到实践&#xff0c;做一些具体的记录。 1.1 Redis和 RedisStack和Redis Enterprise redis简介 Redis 是一种开源&#xff08;BSD 许可&#xff09;内存中数据结构存储&#xff0c;用作数据库、缓存、消息代理和流引擎。 Redis 提供数据结构…

Jmeter+Maven+jenkins+eclipse搭建自动化测试平台

【软件测试行业现状】2023年了你还敢学软件测试&#xff1f;未来已寄..测试人该何去何从&#xff1f;【自动化测试、测试开发、性能测试】 背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github…

期权是什么?一分钟带你玩转期权策略!

很多人问我期权是什么&#xff0c;这个问题怎么回答呢&#xff1f;首先期权是一种交易模式&#xff0c;如同股票期货一样&#xff0c;但它又不同于股票和期货&#xff0c;因为它有自己的交易规则和特性&#xff0c;期权更多是一种工具&#xff0c;可以做空大盘对冲下跌风险&…

【音视频】H264视频压缩格式

H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10&#xff0c;又叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…

malloc与free

目录 前提须知&#xff1a; malloc&#xff1a; 大意&#xff1a; 头文件&#xff1a; 申请空间&#xff1a; 判断是否申请成功&#xff1a; 使用空间&#xff1a; 结果&#xff1a; 整体代码&#xff1a; malloc申请的空间怎么回收呢? 注意事项&#xff1a; free:…

智慧养殖:浅谈视频监控与AI智能识别技术助力奶牛高效、智慧养殖

一、方案背景 随着科技的飞速发展&#xff0c;智能化养殖逐渐成为现代畜牧业的发展趋势。人工智能技术、物联网、视频技术、云计算、大数据等新兴技术&#xff0c;正在为奶牛养殖业带来全新的变革。越来越多的牧场、养殖场开始运用新技术来进行智能监管、提高生产效率、降低生…

靠差异化上了短剧“牌桌”后,百度准备怎么做生态?

从最初的野蛮生长到如今的百花齐放&#xff0c;短剧市场已然进入了质量与创意的竞争。 据《中国网络视听发展研究报告》数据显示&#xff0c;行业内重点网络微短剧上线数量从2021年的58部&#xff0c;飙升到2022年的172部。相比起前几年处于风口时的爆发式增长&#xff0c;“分…