You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Docker网络从其他Docker容器连接MySQL容器及解决相关报错问题

解决Docker容器间MySQL连接问题及相关疑问

先从你遇到的最直接的报错说起:bash: mysql: command not found

1. 为什么Drupal容器里没有mysql命令?

官方Drupal镜像默认没有预装MySQL客户端工具,所以你在容器里执行mysql命令时会提示找不到。解决起来很简单,进入Drupal容器后执行以下命令安装客户端:

apt-get update && apt-get install -y mysql-client

安装完成后,你就可以正常使用mysql命令了。

另外要注意:容器在同一个自定义网络(你创建的netw)里通信时,不需要用宿主机映射的端口3307,直接用MySQL容器的内部端口3306就行——端口映射是给宿主机外部访问用的。所以正确的连接命令应该是:

mysql -h oates -u root -p

输入密码localdb就能连接,不需要额外加--port参数,因为MySQL默认端口就是3306。

2. 关于MySQL容器IP输出的疑问

你执行docker inspect oates | grep IP得到的输出里出现了两个IPAddress字段,这是正常现象:

  • 第一个空的IPAddress来自NetworkSettings节点,对应容器在默认bridge网络的IP,但你创建MySQL容器时指定了--net=netw,它并没有加入默认bridge网络,所以这个字段是空的;
  • 第二个IPAddress: "172.18.0.2"来自Networks.netw节点,这才是容器在你自定义的netw网络中的真实IP。

而且在同一个自定义网络里,用容器名oates直接访问比用IP更靠谱——容器重启后IP可能会变,但容器名是固定的。

3. Docker Compose如何连接现有容器?

作为Docker新手,你可以通过外部网络的方式让Compose创建的容器连接到现有容器,步骤如下:

假设你已经有了现有的netw网络和oates容器,现在想通过Compose启动新容器并和它们互通:

  1. 编写docker-compose.yml文件:
version: '3.8'
services:
  new-drupal:
    image: drupal:latest
    ports:
      - "8081:80"
    networks:
      - netw
# 声明使用已存在的外部网络
networks:
  netw:
    external: true
  1. 执行docker-compose up -d启动服务,新创建的new-drupal容器就会加入netw网络,直接用容器名oates就能访问MySQL容器。

如果你想把现有容器加入Compose创建的新网络,也可以先让Compose创建网络(不指定external: true),然后用docker network connect <compose-network-name> <existing-container-name>命令把现有容器加进去。

内容的提问来源于stack exchange,提问作者arnoldbird

火山引擎 最新活动