如何在 docker 个容器之间连接到 oracle 数据库?
How can i connect to the oracle database between docker containers?
我有两个容器是从 docker-compose 创建的,一个有 api 和 springboot 和另一个 oracle 数据库,但是它没有将 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"]
aplication.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 种方式都是正确的:
- db
- 数据库主机
- 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
端口,容器内的服务器绑定到该端口。
我有两个容器是从 docker-compose 创建的,一个有 api 和 springboot 和另一个 oracle 数据库,但是它没有将 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"]
aplication.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 种方式都是正确的:
- db
- 数据库主机
- 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
端口,容器内的服务器绑定到该端口。