我是 docker 的新手,我正在努力使以下场景正常工作:我有一个工作 webapp 映像,它使用 alpine 和 tomcat 9 作为基础映像,并添加了我的 web 应用程序以及一系列用户库。
然后我有一个以 mysql 为基础的数据库映像,我将我的 web 应用程序运行所需的数据库导入其中。
如果我单独运行这些图像,它们可以正常工作,我可以从主机系统 100% 访问它们,完全没有问题。
现在,我需要他们之间进行沟通,在我看来这听起来是比较容易的部分,但我却无法让它发挥作用。
这是我的 composer.yml:
version: "3"
networks:
uno:
services:
mysql:
image: mysql
ports:
- "3307:3306"
networks:
- uno
web:
image: unoerp9
ports:
- "8888:8080"
depends_on:
- mysql
links:
- mysql
networks:
- uno
容器启动正常: 点击此处查看图片
但几秒钟后,日志中出现一些错误,并且 mysql 容器停止:
mysql_1 | /usr/local/bin/docker-entrypoint.sh:运行/docker-entrypoint-initdb.d/bck.sql
mysql_1 | mysql:[警告] 在命令行界面上使用密码可能不安全。
mysql_1 | mbind:操作不允许
mysql_1 | mbind:操作不允许
mysql_1 | 错误 1822 (HY000) 位于第 17806 行:无法添加外键约束。引用表“vd_grupo_colaborador”中缺少约束“fn_comissao_pagto_grupo_ibfk_1”的索引
db_mysql_1 退出,代码为 1
由于 mysql 容器存在错误,webapp 容器触发与无法连接到数据库相关的错误,这是完全可以预料到的,因此我省略了这些错误。
此外,由于图像单独工作正常,我不认为这是与我构建它们的方式相关的错误,一定是我的 composer 文件中缺少了某些内容。预期结果是两个图像都运行并进行通信,同时我能够通过浏览器 (localhost:8888/) 和数据库 (localhost:3307) 访问 Web 图像。
有什么帮助吗?
答案1
您可以大大简化您的撰写文件:
version: "3"
services:
mysql:
image: mysql:5.7
volumes:
- mysql-data:/var/lib/mysql
web:
image: unoerp9
ports:
- "8888:8080"
每个 Compose 文件都会自动创建一个网络,所有容器都是该网络的一部分。在此网络中,容器的所有端口都暴露在外。这意味着您可以从 tomcat 连接数据库mysql/my_database_name
,您也可以省略那里的端口,因为它是默认的 3306。
我认为您的 MySQL 错误是因为默认映像 mysql:latest 是版本 8,这可能与生产系统不同。上面我选择了标签 5.7,因为它在某种程度上指定了版本,因此您不会遇到兼容性问题,但仍然可以利用安全更新,例如从 5.7.22(@Mohsen 建议的)到 5.7.23(这是目前的最新版本)。
我还添加了一个卷来存储数据库数据(如果有帮助的话),因此docker-compose down
当删除容器时,对数据库所做的更改会在重新启动()之间保留。
答案2
您需要通过添加以下行在 mysql 映像上添加 web 映像的依赖项
depends_on: - mysql
您可以使用以下方法将网络图像与数据库图像链接起来:
links: - mysql
因此您可以用它mysql
作为主机名来连接数据库。
尝试使用特定的 mysql 镜像,例如mysql:5.7.22
此错误mysql_1 | ERROR 1822 (HY000) at line 17806: Failed to add the foreign key constraint. Missing index for constraint 'fn_comissao_pagto_grupo_ibfk_1' in the referenced table 'vd_grupo_colaborador'
与您的 mysql 模式有关,如果不向我们展示源代码,我们就无法帮助您解决该问题,如果您可以分享它那就太好了。