服务通过docker部署后,调用确定相互调用的URL

背景:

有两个服务,称之为server-a和server-b吧,a要调用b。主机部署时,b服务的地址通过ip:port的方式给出,通过docker部署后,要验证下a调用b时的地址该如何设置。

我做了一个简单的实验,现在将实验代码贴出来,做个备份记录。

方案:

通过docker-compose + yaml文件方式,指定通过 http://服务名:端口 来访问服务。与主机部署时相比,相当于将主机ip更换成服务名。

yaml文件内容:

version: "3.0"

services:

Java服务(镜像A)

java-service:

image: javalb-a:v2.0 # 如 your-java-service:1.0

ports:

  • "5097:5097" # 暴露Java服务端口

depends_on:

  • service-b # 定义依赖:先启动service-b再启动Java服务

environment:

restart: always # 崩溃自动重启

服务B(镜像B)

service-b:

image: myflash-server-b:v1.0 # 如 your-service-b:1.0

ports:

  • "5000:5000" # 暴露服务B端口(可选,内部调用可省略)暴露容器内部的端口,供其他容器连接

注意:这里没有映射 ports 到宿主机,说明此服务仅供内部访问

restart: always

Dockerfile

使用官方Python运行时作为父镜像

FROM python:3.10

设置工作目录在容器内

WORKDIR /app

将当前目录内容复制到位于容器内的/app目录下

COPY . /app

安装requirements.txt中指定的任何依赖项

RUN pip install flask requests

让容器以非root用户身份运行以增加安全性

RUN adduser --disabled-password --gecos '' dockeruser && chown -R dockeruser /app

USER dockeruser

指定容器启动时运行的命令

CMD ["python", "app.py"]

app.py代码

python 复制代码
from flask import Flask
import requests
import os

app = Flask(__name__)

# 从环境变量中读取 SERVICE_B_URL,如果不存在则使用默认值(可选)
SERVICE_B_URL = os.environ.get('SERVICE_B_URL', 'http://default-server:port')

@app.route('/')
def hello_world():
    print(f"SERVICE_B_URL is = : {SERVICE_B_URL}")
    # 发送GET请求
    response = requests.get(SERVICE_B_URL)
    
    # 打印响应的状态码和内容
    print(f"Status Code: {response.status_code}")
    print(f"Response Content: {response.text}")
    return f'Hello, World!\n this is server a.\n and get response content = {response.text}'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5097)

服务B的代码:

python 复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

流程:

1.在yaml文件的目录下执行 docker-compose up -d

2.进行服务a的容器,然后执行 curl http://127.0.0.1:5097/

执行的打印结果如下截图。

需要强调的是:必须要从环境变量中获取 SERVICE_B_URL 变量的值!

相关推荐
施努卡机器视觉6 小时前
SNK施努卡铜箔包装线:从拔轴到入库,全流程自动化怎么实现?
运维·自动化
treesforest6 小时前
2026年,IP地理位置精准查询的几个硬核技术变化
运维·网络·网络协议·tcp/ip·ip
工业机器人销售服务6 小时前
在珠宝首饰加工中,遨博协作机器人配合微力控技术,实现宝石的自动化镶嵌
运维·机器人·自动化
JuiceFS6 小时前
降低数据存储成本:JuiceFS v1.4 分层存储设计解析
运维·后端
红茶要加冰6 小时前
linux的例行性工作——计划任务
linux·运维·服务器
byxdaz6 小时前
Linux中查看硬件信息
linux·运维
darkdragonking7 小时前
由一次构建 OpenEuler 22.03 dnf源所了解到的
linux·运维·服务器
米高梅狮子7 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
WUYOUGYLU7 小时前
云服务器怎么选、怎么用,才不花冤枉钱
运维·服务器
曹牧7 小时前
Nginx 504
运维·nginx