Java 中 Docker 怎么在没有 Compose 时通过手工 link 机制在两个独立启动的隔离容器间构筑内联网路

舞夢輝影

舞夢輝影

2026-08-04

695人浏览

原创

docker --link 是早期单向容器互联机制,通过在接收容器 /etc/hosts 中注入别名解析及环境变量实现通信,要求源容器必须运行;现代推荐使用自定义 bridge 网络替代,支持双向通信、内置 dns 解析和跨容器扩展。

java 中 docker 怎么在没有 compose 时通过手工 link 机制在两个独立启动的隔离容器间构筑内联网路

Docker 的 --link 是一种早期的手动容器互联方式,适用于没有 Docker Compose、不使用自定义网络、又需要快速让两个已存在容器建立可通信别名的场景。它不是现代推荐做法,但对老项目维护或临时调试仍具实用价值。

核心前提必须满足
源容器(被链接的那个)必须已处于 running 状态;目标容器(执行 --link 的那个)在启动时才动态获取其 IP 和环境变量。


怎么让 Java 应用容器连上 MySQL 容器(无 Compose)

假设你已有运行中的 MySQL 容器:

docker run -d \
  --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=pass123 \
  -p 3306:3306 \
  mysql:8.0

再启动你的 Java 应用容器,并 link 到它:

docker run -d \
  --name my-java-app \
  --link mysql-db:db \
  -p 8080:8080 \
  -v $(pwd)/app.jar:/app.jar \
  openjdk:17-jre-slim \
  java -jar /app.jar

注意 --link mysql-db:db

  • mysql-db 是源容器名(必须正在运行)
  • db 是你在 Java 容器里用来访问它的主机名别名

Java 应用内部怎么用这个 link

在 Java 应用中,数据库连接 URL 不再写死 172.17.0.x 这类浮动 IP,而是直接用别名:

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载
jdbc:mysql://db:3306/myapp?useSSL=false&serverTimezone=UTC

Docker 会自动完成两件事:

  • my-java-app 容器的 /etc/hosts 中添加一行:
    172.17.0.3 db mysql-db(IP 随每次启动变化,但别名始终有效)
  • 注入环境变量,例如:
    DB_PORT_3306_TCP=tcp://172.17.0.3:3306
    DB_PORT_3306_TCP_ADDR=172.17.0.3
    DB_PORT_3306_TCP_PORT=3306

你也可以在 Java 启动脚本里读取这些变量做动态拼接,比如:

java -Ddb.host=$DB_PORT_3306_TCP_ADDR -Ddb.port=$DB_PORT_3306_TCP_PORT -jar /app.jar

常见问题与绕过技巧

  • Link 是单向的my-java-appping db,但 mysql-db 无法 ping my-java-app。如需双向,得反向再启一个带 --link 的容器,或改用自定义 bridge 网络。
  • 容器重启后 IP 变了?没关系--link 每次启动新容器时都会重新查源容器当前 IP 并更新 /etc/hosts,所以别名始终可用。
  • Java 连不上?检查三件事
    • docker ps 确认 mysql-db 确实在 Up 状态
    • 进入 my-java-app 容器:docker exec -it my-java-app sh,执行 ping dbnslookup db 看是否解析成功
    • MySQL 是否监听 0.0.0.0:3306(默认只监听 127.0.0.1,需加配置 bind-address = 0.0.0.0

为什么不建议长期用 link

  • 官方自 Docker 1.10 起标记为 deprecated,19.03 仍保留但明确提示“will be removed in a future release”
  • 无法跨主机,无法配合 Swarm 或 Kubernetes
  • 所有 link 关系必须在启动时声明,运行中不能追加
  • 大量容器时 /etc/hosts 膨胀、管理混乱

替代方案很简单:

docker network create mynet  
docker run --network mynet --name mysql-db ...  
docker run --network mynet --name my-java-app ...

然后 Java 直接用 jdbc:mysql://mysql-db:3306/... —— 更干净、双向、可扩展。

不复杂但容易忽略。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3837

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2838

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2852

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

637

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

705

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1314

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18844

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

646

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 127人学习