您的当前位置:首页>全部文章>文章详情

【Docker】Docker本地一个容器怎样访问另一个容器

CrazyPanda发表于:2025-07-08 12:20:27浏览:5次TAG: #docker
在 Docker 中,容器间的网络通信可通过多种方式实现,具体取决于容器的网络配置。以下是详细的解决方案:

一、容器间通信的基本原理

Docker 容器的网络通信方式取决于其网络模式:
  • 默认 bridge 网络:容器通过私有 IP 通信(如172.17.x.x),需确保容器在同一网络中。
  • 自定义网络:推荐创建自定义桥接网络,容器可通过容器名直接通信(无需记住 IP)。
  • host 模式:容器共享宿主机网络,可通过localhost或宿主机 IP 通信。

二、使用自定义网络(推荐方式)

1. 创建自定义桥接网络

docker network create my-network

2. 启动容器并加入网络

# 启动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

3. 容器间通过容器名通信

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'
});

三、使用默认 bridge 网络

1. 获取容器 IP 地址

# 查看MySQL容器的IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-container
# 输出类似:172.17.0.2

2. 通过 IP 地址通信

在其他容器中使用该 IP 连接:
// Node.js示例:连接MySQL
const connection = mysql.createConnection({
  host: '172.17.0.2',  // 使用实际IP地址
  port: 3306,
  // 其他配置...
});
注意:默认 bridge 网络中容器 IP 可能变化(如容器重启后),因此推荐使用自定义网络 + 容器名通信。

四、使用 host 模式

若容器使用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,
  // 其他配置...
});

五、跨主机容器通信

若容器分布在不同宿主机,可使用以下方案:
  1. Docker Swarm:Docker 内置的集群方案,自动创建覆盖网络。
  2. Kubernetes:通过 Service 实现容器间负载均衡和通信。
  3. 第三方网络插件:如 Calico、Flannel 等。

六、常见问题排查

  1. 容器是否在同一网络?
  2. 端口是否正确暴露?
    • 确保容器内部服务监听的端口与外部访问端口一致(如 MySQL 默认监听 3306)。
  3. 防火墙是否放行?
    # 开放端口(CentOS示例)
    sudo firewall-cmd --add-port=3306/tcp --permanent
    sudo firewall-cmd --reload