在 Docker 中,容器间的网络通信可通过多种方式实现,具体取决于容器的网络配置。以下是详细的解决方案:
Docker 容器的网络通信方式取决于其网络模式:
- 默认 bridge 网络:容器通过私有 IP 通信(如
172.17.x.x
),需确保容器在同一网络中。
- 自定义网络:推荐创建自定义桥接网络,容器可通过容器名直接通信(无需记住 IP)。
- host 模式:容器共享宿主机网络,可通过
localhost
或宿主机 IP 通信。
docker network create my-network
# 启动MySQL容器
docker run -d --name mysql-container \
--network my-network \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.0
# 启动应用容器(如Node.js应用)
docker run -d --name app-container \
--network my-network \
-p 3000:3000 \
my-app-image
在app-container
中,可直接使用mysql-container
作为主机名连接 MySQL:
// Node.js示例:连接MySQL
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'mysql-container', // 直接使用容器名作为主机名
port: 3306,
user: 'root',
password: 'password',
database: 'mydb'
});
# 查看MySQL容器的IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-container
# 输出类似:172.17.0.2
在其他容器中使用该 IP 连接:
// Node.js示例:连接MySQL
const connection = mysql.createConnection({
host: '172.17.0.2', // 使用实际IP地址
port: 3306,
// 其他配置...
});
注意:默认 bridge 网络中容器 IP 可能变化(如容器重启后),因此推荐使用自定义网络 + 容器名通信。
若容器使用host
网络模式,可通过localhost
或宿主机 IP 通信:
# 启动MySQL容器(host模式)
docker run -d --name mysql-container \
--network host \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.0
# 应用容器中连接MySQL
const connection = mysql.createConnection({
host: 'localhost', // 或宿主机IP
port: 3306,
// 其他配置...
});
若容器分布在不同宿主机,可使用以下方案:
- Docker Swarm:Docker 内置的集群方案,自动创建覆盖网络。
- Kubernetes:通过 Service 实现容器间负载均衡和通信。
- 第三方网络插件:如 Calico、Flannel 等。
-
容器是否在同一网络?
-
端口是否正确暴露?
- 确保容器内部服务监听的端口与外部访问端口一致(如 MySQL 默认监听 3306)。
-
防火墙是否放行?
# 开放端口(CentOS示例)
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload