如何通过Docker网络从其他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启动新容器并和它们互通:
- 编写
docker-compose.yml文件:
version: '3.8' services: new-drupal: image: drupal:latest ports: - "8081:80" networks: - netw # 声明使用已存在的外部网络 networks: netw: external: true
- 执行
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




