我想通过中间件将数据槽部署到分布式mysql数据库,需要一个mysql docker容器,该容器运行两个具有不同端口的实例,例如。 3306和3316。
尝试了多种方式,例如:
添加 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行来工作。
尝试了 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"]
也不起作用。
尝试了 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']
答案 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
请勿尝试构建自己的映像,也绝对不要尝试在单个容器中运行预期寿命不同的两台服务器。