如何在一个MySQL docker容器中启动多个实例

时间:2018-07-27 12:33:48

标签: mysql docker

我想通过中间件将数据槽部署到分布式mysql数据库,需要一个mysql docker容器,该容器运行两个具有不同端口的实例,例如。 3306和3316。

尝试了多种方式,例如:

  1. 添加 mysql_3316.sh

    #!/bin/bash /entrypoint.sh --defaults-file=/etc/mysql/my_3316.cnf

    rc.local 中:

    #!/bin/sh -e /usr/local/bin/mysql_3316.sh || exit 1 exit 0

    并按如下所示修改 Dockerfile

    RUN touch /etc/mysql/my_3316.cnf COPY mysql_3316.sh /usr/local/bin/mysql_3316.sh RUN chmod +x /usr/local/bin/mysql_3316.sh COPY rc.local /etc/rc.local RUN chmod +x /etc/rc.local RUN chown root:root /etc/rc.local ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 3316 CMD ["mysqld"]

    在mysql容器启动时它不起作用,但是3316 mysql 端口实例通过手动运行/entrypoint.sh --defaults-file=/etc/mysql/my_3316.cnf shell行来工作。

  2. 尝试了 init.d

    RUN touch /etc/mysql/my_3316.cnf COPY mysql_3316.sh /etc/init.d/mysql_3316 RUN chmod +x /etc/init.d/mysql_3316 RUN update-rc.d mysql_3316 defaults 99 ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 3316 CMD ["mysqld"]

    也不起作用。

  3. 尝试了 crontab

    @reboot /usr/local/bin/mysql_3316.sh #Don't remove the empty line at the end of this file. It is required to run the cron job

    Dockerfile

    COPY mysql_3316.sh /usr/local/bin/mysql_3316.sh RUN chmod +x /usr/local/bin/mysql_3316.sh ADD crontab /etc/cron.d/docker-cron RUN chmod +x /etc/cron.d/docker-cron RUN crontab /etc/cron.d/docker-cron ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 3316 CMD ["mysqld"]

    没有第三名。

在此键上花了很多钱,几乎放弃了...

任何好意的建议都欢迎。

mysql的docker-compose.yml就在这里:

services:
 mysql:
 image: mysql:latest
 container_name: mysql
 hostname: mysql
 restart: unless-stopped
 networks:
   dockernet:
     ipv4_address: 172.18.0.5
 ports:
   - 3306:3306
   - 3316:3316
 volumes:
   - /Docker/mysql/:/var/lib/mysql/
   - ./docker/mysql/mysql/my.cnf:/etc/mysql/my.cnf
   - ./docker/mysql/mysql/my_3316.cnf:/etc/mysql/my_3316.cnf
   - ./docker/mysql/mysql/logs/:/var/log/mysql/
   - ./docker/mysql/mysql/init/:/docker-entrypoint-initdb.d/
 entrypoint: ['/entrypoint.sh', '--default-authentication-plugin=mysql_native_password']

2 个答案:

答案 0 :(得分:1)

通常,您不想在同一容器中运行多个进程。尽管您有自己的头衔,但我确实认为您正在寻找的是从MySQL映像启动两个容器。

您无需更改任何启动脚本,Dockerfile或其他任何内容即可启动绑定到不同端口的相似容器。

请记住,EXPOSE命令仅将端口暴露给不同的容器,而不暴露给外界。

要访问端口,您需要在-p中使用docker run标志:https://docs.docker.com/engine/reference/run/#expose-incoming-ports

您可以使用来自相同Dockerfile的相同docker映像。运行时只需提供不同的-p参数即可。

编辑: 您在我的最初回复后添加了docker-compose.yml。使用docker-compose将使我对-p的建议过时,您应该使用docker-compose.yml的ports:部分来更改端口号。

但是,此答案可能不是您要查找的,因为根据您的评论,我认为我不太了解您的用例。

答案 1 :(得分:0)

使用库存mysql容器并运行:

docker run -p3306:3306 --name mysql1 mysql
docker run -p3316:3306 --name mysql2 mysql
# plus appropriate -d -e ... -v ... as needed on both commands

请勿尝试构建自己的映像,也绝对不要尝试在单个容器中运行预期寿命不同的两台服务器。