【问题标题】:install mysql in docker and expose mysql service to outside在 docker 中安装 mysql 并将 mysql 服务暴露给外部
【发布时间】:2014-07-28 05:35:18
【问题描述】:

这些天我正在学习 docker。我想在 docker 容器中安装 mysql。

这是我的 Dockerfile

FROM ubuntu:14.04

ADD ./setup_mysql.sh /setup_mysql.sh
RUN chmod 755 /setup_mysql.sh
RUN /setup_mysql.sh

EXPOSE 3306

CMD ["/usr/sbin/mysqld"]

和shell脚本setup_mysql.sh

apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server

sed -i -e "s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

service mysql start &
sleep 5

echo "UPDATE mysql.user SET password=PASSWORD('rootpass') WHERE user='root'" | mysql
echo "CREATE DATABASE devdb" | mysql
echo "GRANT ALL ON devdb.* TO devuser @'%' IDENTIFIED BY 'devpass'" | mysql

sleep 5
service mysql stop

运行sudo docker build -t test/devenv .时发生错误

Setting up mysql-server-5.5 (5.5.38-0ubuntu0.14.04.1) ...
invoke-rc.d: policy-rc.d denied execution of stop.
invoke-rc.d: policy-rc.d denied execution of start.

如果我删除第二个sleep 5,命令service mysql stop 将抛出

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

为什么会这样?

谢谢!

【问题讨论】:

  • 在容器启动过程中安装 mysql 是不好的。国际海事组织。将安装放在 DOCKERFILE 中。
  • 在官方 Debian 镜像中/usr/sbin/policy-rc.d 有一条评论解释了这种行为。解决方法是simple,但this answer 可以更好地解释问题和解决方案。
  • 谢谢!抱歉迟到了

标签: mysql docker


【解决方案1】:

我强烈建议利用他人的工作。例如,从 docker 注册表中检出 Mysql 映像:

这是相关的 git 存储库文件:

如果您查看 Dockerfile,您会发现软件正在按预期安装:

.. apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}"* ..

诀窍是要意识到数据库instance 与数据库software 不同,只有后者随图像一起提供。创建数据库并用数据加载它们是在运行时完成的。所以这项工作是由一个额外的脚本完成的,在你运行容器时拉入镜像并设置要执行:

COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

希望这会有所帮助。

【讨论】:

  • 谢谢马克。你说的对。但是我只是想通过一个小例子来尝试学习docker:)
  • @SanLee 当然可以。我的观点是,有很多例子可以效仿。在前台运行服务的需要是一个常见的 docker “gotcha” :-)
  • 是的。现在我可以连接到 mysql 服务。但是还有两个问题……
  • @Mark 如果您能解释错误消息的来源(我怀疑 apt-get install 正在尝试启动服务并且不允许这样做?)以及您的解决方案如何更正,那将非常有帮助问题(我怀疑它不能防止错误,但确保服务作为前台任务而不是守护进程运行)
  • @TheTrav 重构了我的答案。 Docker github 链接已更改。对不起,如果我误导了你。我意识到您无法连接实际上是在构建过程中,而不是运行时错误。
【解决方案2】:

将此添加到您的 dockerfile:

RUN su
RUN echo exit 0 > /usr/sbin/policy-rc.d

我也面临同样的问题。这段代码修复了它。

【讨论】:

    【解决方案3】:

    Here 是一篇很好的帖子,它试图从根本上解决您面临的问题。

    短途

    1. RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d 应该可以解决您的问题 或者

    2. 如果这不能解决问题,请尝试使用 privileged 选项运行 docker 容器。像这样,docker run --privileged -d -ti DOCKER_IMAGE:TAG

    理想情况下,我不建议使用 privileged 选项运行容器,除非它是一个测试台容器。运行具有特权的 docker 容器的原因为容器提供了所有功能,并且还解除了所有强制执行的限制。换句话说,容器几乎可以做主机可以做的所有事情。但这不是一个好习惯。这违背了 docker 与主机隔离的目的。

    执行此操作的理想方法是根据您想要实现的目标set capabilities 的 docker 容器。谷歌搜索这应该可以帮助您为您的 docker 容器提供适当的capability

    【讨论】:

      猜你喜欢
      • 2021-08-30
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多