多个Docker MYSQL容器

17

我是一名 Docker 新手。

我想要做的是在 Docker Compose 中运行多个 MySQL 容器,除此之外还有一个 Nginx、一个 PHP 和一个 PhpMyAdmin 容器。

这是我的 docker-compose.yml 文件:

version: '3'
services:
    server:
        build:
            context: ./
            dockerfile: server.docker
        volumes:
            - ./:/var/www
        ports:
            - "8080:80"
        links:
            - app
    app:
        build:
            context: ./
            dockerfile: app.docker
        volumes:
            - ./:/var/www
        links:
            - db_callcenter
            - db_forecast
            - db_logistics
            - db_products
            - db_rm
            - db_rma
            - db_settings
            - db_tasks
            - db_users
    db_callcenter:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_callcenter"
        ports:
            - "33061:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_forecast:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_forecast"
        ports:
            - "33062:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_logistics:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_logistics"
        ports:
            - "33063:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_products:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_products"
        ports:
            - "33064:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_rm:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_rm"
        ports:
            - "33065:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_rma:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_rma"
        ports:
            - "33066:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_settings:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_settings"
        ports:
            - "33067:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_tasks:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_tasks"
        ports:
            - "33068:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    db_users:
        image: mysql:5.7
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=prj_users"
        ports:
            - "33069:3306"
        volumes:
            - mysql_bkp:/var/lib/mysql
    pma:
        image: phpmyadmin/phpmyadmin
        environment:
            - "PMA_USER=root"
            - "PMA_PASSWORD=secret"
        ports:
            - "8001:80"
        links:
            - db_callcenter
            - db_forecast
            - db_logistics
            - db_products
            - db_rm
            - db_rma
            - db_settings
            - db_tasks
            - db_users
volumes:
    mysql_bkp:

但是没有任何MySQL容器被创建。当我运行docker ps时,我会得到:

CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS                  NAMES
0228e9c8a267        phpmyadmin/phpmyadmin   "/run.sh phpmyadmin"     About a minute ago   Up 30 seconds       0.0.0.0:8001->80/tcp   prj_pma_1
e6c6b11905f1        prj_server             "nginx -g 'daemon ..."   22 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   prj_server_1
2e7dd484c6e5        prj_app                "docker-php-entryp..."   24 minutes ago       Up 2 minutes        9000/tcp               prj_app_1

更新:

Docker日志显示:

Unable to lock ./ibdata1 error: 11
或者
InnoDB: Unsupported redo log format.

我不知道我做错了什么,或者应该如何开始调试。任何帮助都将非常感激。


1
docker ps -a 会显示什么? - frennky
你是否在使用docker-compose up命令来启动所有服务?你能否将每个links实例改为depends_on,以便首先启动数据库容器?https://docs.docker.com/compose/compose-file/#depends_on - Jay Dorsey
docker ps -a 显示已退出状态(1)的数据库容器,时间为15小时。 - Illes Peter
1
“docker logs <db container id>”会显示什么信息?你能将其中的一条日志添加到你原来的问题中吗? - frennky
它会有所不同,但通常是:InnoDB:无法锁定./ibdata1 错误:11 或者 InnoDB:不支持的重做日志格式。(...) - Illes Peter
1个回答

23

如果您的compose文件中有多个数据库容器使用同一个mysql_bkp卷,则无法共享相同的数据目录。您需要为每个容器创建一个单独的卷,或将mysql配置为使用/var/lib/mysql的唯一子目录来存储数据。

如果您只是从每个数据库服务中删除volumes:键,则它们都将获得一个唯一的匿名卷(因为这是mysql镜像的配置方式)。

另外,您可以为每个服务声明和挂载单独的卷:

services:
    db_logistics:
        image: mysql:5.7
        volumes:
            - mysql_bkp_logistics:/var/lib/mysql
    db_products:
        image: mysql:5.7
        volumes:
            - mysql_bkp_products:/var/lib/mysql

volumes:
    mysql_bkp_logistics:
    mysql_bkp_products:

太棒了!搞定了。我之前尝试了不用卷,但没起作用,但挂载一个单独的卷就行了。现在我只需要找出为什么我的phpMyAdmin无法连接(它可以连接一个单独的数据库)。 - Illes Peter
我建议保留单独的卷。假设您以后需要该数据库数据。或者您想将其移动到另一个容器中。'docker volume ls' 或 'ls -lah /var/lib/docker/volumes/' - arikin
对我来说,那个设置导致了 InnoDB: Unable to lock ./ibdata1, error: 11 的错误。(docker-compose 3.8) - Cpt. Senkfuss
我和 OP 有相同的问题。多个 MySQL 容器,不同的主机端口和不同的卷。PMA 只连接到第一个容器。 - Kreker
@Kreker 你可能想要开一个新的问题,并提供关于你特定配置的详细信息。 - larsks
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接