java - 如何在docker容器之间连接oracle数据库?

标签 java oracle docker docker-compose

我有两个从 docker-compose 创建的容器,一个具有 apispringboot,另一个具有 oracle strong> 数据库,但是它不会将 api 连接到数据库,而且我已经用完了选项,我尝试在 aplication.properties 中配置连接>docker-compose.yml

这是docker-compose.yml

version: "3.7"
services:
  app:
    image: "bm_spring_boot:latest"
    build:
      context: ./BmApiRestV2/
      dockerfile: Dockerfile
    container_name: api_spring
    depends_on:
      - db
    ports:
      - 8888:8080
    environment:
      - SPRING_DATASOURCE_URL=jdbc:oracle:thin:@//db:49161/xe
      - SPRING_DATASOURCE_USERNAME=system
      - SPRING_DATASOURCE_PASSWORD=oracle
    networks:
      spring-net:
        aliases:
          - spring-host

  db:
    image: oracleinanutshell/oracle-xe-11g:latest
    container_name: oracle_db
    ports:
      - 49161:1521
      - 5500:5500
    environment:
      - ORACLE_ALLOW_REMOTE=true
    networks:
      spring-net:
        aliases:
          - db-host
networks:
  spring-net:
    driver: bridge
    ipam:
      driver: default

Dockerfile

ARG VERSION=8-jdk-slim
FROM openjdk:${VERSION}
ARG JAR_FILE=BmApiRestV2
COPY "./target/${JAR_FILE}.jar" "app.jar"
EXPOSE 8080
ENTRYPOINT [ "java","-jar","app.jar"]

application.properties

#spring.datasource.username=system
#spring.datasource.password=oracle
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#DOCKER
#spring.datasource.url=jdbc:oracle:thin:@ (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = db)(PORT = 49161))    )    (CONNECT_DATA =      (SID = xe)    )  )

(该连接已被注释,因为在 docker-compose 中已对其进行了配置)

非常感谢您的帮助(我对我的英语表示歉意)

-------------- 更新 --------------

连接测试

 ping db
PING db (172.20.0.2) 56(84) bytes of data.
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=1 ttl=64 time=0.221 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=3 ttl=64 time=0.072 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=4 ttl=64 time=0.072 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=5 ttl=64 time=0.144 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=6 ttl=64 time=0.071 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=7 ttl=64 time=0.161 ms
64 bytes from oracle_db.imagenspring_spring-net (172.20.0.2): icmp_seq=8 ttl=64 time=0.063 ms
^C
--- db ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7090ms
rtt min/avg/max/mdev = 0.063/0.109/0.221/0.054 ms
root@2254b03a8ef4:/#

最佳答案

TLDR

将连接字符串中的端口更改为 1521。

扩展版本

您的服务和网络配置正确。两个容器都位于同一个 docker 网络中,这使得它们可以相互通信。

此外,与某些评论相反,调用容器的所有 3 种方式都是正确的:

  • 数据库
  • 数据库主机
  • oracle_db。

这可以使用简化的docker-compose.yml轻松验证,只是为了测试连接性:

version: "3.7"
services:
  app:
    image: busybox
    command: "sh -c 'sleep 3600;'"
    networks:
      spring-net:
        aliases:
          - app-host
  db:
    image: busybox
    command: "sh -c 'sleep 3600;'"
    container_name: oracle_db
    networks:
      spring-net:
        aliases:
          - db-host
networks:
  spring-net:
    driver: bridge
    ipam:
      driver: default

如果您尝试解析名称 - 它们都指向同一个容器:

/ # ping db
PING db (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.593 ms
^C
--- db ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.593/0.593/0.593 ms
/ # ping oracle_db
PING oracle_db (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.213 ms
^C
--- oracle_db ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.213/0.213/0.213 ms
/ # ping db-host
PING db-host (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.334 ms
^C
--- db-host ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.334/0.334/0.334 ms

事实上,问题似乎出在您的连接字符串上:

- SPRING_DATASOURCE_URL=jdbc:oracle:thin:@//db:49161/xe

端口49161是主机端口,而您连接到容器(db)。在这种情况下,您应该使用 1521 端口,容器内的服务器绑定(bind)到该端口。

关于java - 如何在docker容器之间连接oracle数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70405638/

相关文章:

java - BigInt 相乘

oracle - 无法导入 Oracle 转储 : IMP-00033: Warning: Table not found in export file

sql - 通过删除 'exists' 和 'not exists' 优化 Oracle 查询

docker - 在运行的 docker 容器中安装包

docker - Docker seccomp 配置文件的默认位置是什么?

java - 保护 Flex-BlazeDS 应用程序的最佳方法是什么?

java - 如何在 wso2cep 4.0.0 中添加自定义输入事件接收器?

docker - 无法通过 Kubernetes 从 GitHub 拉取公共(public) docker 镜像包

java - Pivotal TC Server 启动,但使用 Spring 构建的网站未加载(之前是)

Oracle直接路径插入问题