在Docker容器上安装MySQL

6

我正在尝试使用以下Docker文件将MySQL运行到修改过的Ubuntu镜像中,其中包括安装Node.js和基本的MySQL安装。

# Memcached

# use the ubuntu base image provided by dotCloud
FROM ubuntu/mysqlbase
MAINTAINER Hitesh

# make sure the package repository is up to dat//e
#RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
#RUN apt-get update

#RUN apt-get install -y mysql-client
#ENTRYPOINT ["wc", "-l"]
#ENTRYPOINT ["echo", "running"]
ENTRYPOINT mysqld_safe & sleep 10
#RUN mysql
RUN echo "[mysqld]"                       >/etc/mysql/conf.d/docker.cnf
RUN echo "bind-address   = 0.0.0.0"      >>/etc/mysql/conf.d/docker.cnf
RUN echo "innodb_flush_method = O_DSYNC" >>/etc/mysql/conf.d/docker.cnf
RUN echo "skip-name-resolve"             >>/etc/mysql/conf.d/docker.cnf
RUN echo "init_file = /etc/mysql/init"   >>/etc/mysql/conf.d/docker.cnf
RUN echo "GRANT ALL ON *.* TO root@'%'" >/etc/mysql/init

USER root

EXPOSE 3306

使用以下命令运行此服务器

sudo docker run -p 3306:13306 mysql/dockerfiletest

遇到以下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

有人能否建议一下这里需要做什么更改。我想使用这个容器与另一个容器链接,该容器实际上正在运行我的node.js应用程序。


我认为你需要添加“-d”以使其在守护进程模式下运行?不过我不确定。 - Gohn67
添加“-d”选项后,成功打开了11211端口,但是在10秒后就关闭了。有什么想法为什么会这样? - Hitesh
我不确定你如何使用这个容器 - 你正在暴露memcached端口,运行mysql服务器并安装mysql客户端?你想从外部/主机连接到你的mysql服务器(在docker容器中)吗?那么你应该暴露mysql端口。 - Jiri
搞混了端口,现在已经更正。 - Hitesh
@Jiri:当我更正了端口时,它实际上起作用了。如果您能发布答案,我很乐意接受它。谢谢! - Hitesh
@Hitesh - 谢谢!我稍微更新了答案,所以你可以接受它 - 但现在它没有太多意义 - 因为你现在的问题已经有可用的代码了 :) - Jiri
2个回答

2

答案已经被接受,但我认为如果你将“&”更改为“&&”,则可以在入口点中保留睡眠。不确定Docker是否对入口点进行任何解析或仅执行它,但Bash对“&”和“&&”的处理方式非常不同。

ENTRYPOINT mysqld_safe && sleep 10

有几件事情需要说明:首先是“竞态条件”,其次我并不是在说让程序休眠可以解决问题。我只是指出(正确的)&很可能不是 OP 想要的,他应该使用 && - j-mo
同意这个:OK - Melroy van den Berg

2

更新:您应该检查暴露的端口号-在您的示例中是(曾经是)memcached的端口(11211),而不是mysql的端口(3306)。


无论如何,我认为您可能需要修改Dockerfile-删除entrypoint中不必要的睡眠时间:

ENTRYPOINT ["/usr/bin/mysqld_safe"]

那么您应该这样启动容器(守护进程模式):
root@machine:/# docker run -d -p 3306:<host port> <image id>

无论如何,我尝试了不休眠的修改构建Docker镜像,它运行良好。我可以在主机上连接到mysqld而没有任何问题。 - Jiri
感谢Jiri指出这一点,这里的Sleep只是确保mysqld_safe完成了,但正如你所指出的那样,这可能并不必要。我的问题是由于memcache和mysql端口混乱造成的,现在已经解决了。 - Hitesh
1
我有点困惑,这个命令不是会将本地主机的3306端口暴露给容器中的<host port>端口吗?如果要通过本地主机连接运行在容器中的MySQL,难道不应该将容器中的3306端口转发到主机上的某个端口吗? - Mark
@Mark,是的,你说得对,第一个端口是主机端口,第二个端口是容器端口。 - Jiri

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