服务通过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 变量的值!

相关推荐
大树886 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn867 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智8 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉9 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦9 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_9618752410 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant