Docker Composer - 无法运行我的 webapp 和 mysql 镜像

Docker Composer - 无法运行我的 webapp 和 mysql 镜像

我是 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 模式有关,如果不向我们展示源代码,我们就无法帮助您解决该问题,如果您可以分享它那就太好了。

相关内容