我在运行Docker容器的MySQL时遇到问题。 我的testing图像是从以下Dockerfile构build的:
# See: https://index.docker.io/u/brice/mysql/ FROM ubuntu:12.10 MAINTAINER Joni Kahara <[email protected]> # Because docker replaces /sbin/init: https://github.com/dotcloud/docker/issues/1024 RUN dpkg-divert --local --rename --add /sbin/initctl RUN ln -s /bin/true /sbin/initctl RUN apt-get update RUN apt-get upgrade -y RUN apt-get -y install mysql-server RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf RUN /usr/bin/mysqld_safe & \ sleep 10s && \ mysql -e "GRANT ALL ON *.* to 'root'@'%'; FLUSH PRIVILEGES;" EXPOSE 3306 VOLUME ["/var/lib/mysql", "/var/log/mysql"] CMD ["mysqld_safe"]
从上面的文件构build一个图像后,我运行它:
docker run -p 3306:3306 asyncfi/magento-mysql
之后,所有的东西都膨胀了,我可以从本地机器login到MySQL的这个实例。 不过,我也可以从任何其他机器login。
我设置了防火墙来过滤除了进入特定端口(“隐藏的”SSH,HTTP,HTTPS)的stream量以外的所有内容,而且这种过滤function看起来确实起作用。 如果我例如运行一个Django开发服务器端口1234然后我能够连接从本地机器,但不是从外面。 因此,防火墙似乎在将数据包发送到正在作为“普通”进程运行的服务器上,而不是在服务器在容器内运行时进行过滤。
iptables -L -v – 行号表示如下:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 2265 107K ACCEPT all -- lo any anywhere anywhere 2 240K 319M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED 3 14 1040 ACCEPT tcp -- any any anywhere anywhere tcp dpt:<REDACTED> 4 21 1092 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http 5 6 360 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https 6 538 34656 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables DROP: " 7 551 35424 DROP all -- any any anywhere anywhere Chain FORWARD (policy ACCEPT 5 packets, 296 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- docker0 docker0 anywhere anywhere 2 6752 396K ACCEPT all -- docker0 !docker0 anywhere anywhere 3 125K 188M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT 51148 packets, 14M bytes) num pkts bytes target prot opt in out source destination
Docker版本是:
Client version: 0.7.3 Go version (client): go1.2 Git commit (client): 8502ad4 Server version: 0.7.3 Git commit (server): 8502ad4 Go version (server): go1.2 Last stable version: 0.7.3
为什么MySQL端口暴露在外部?
感谢#docker IRC频道用户Michael Crosby和Paul Czar,我现在能够回答我自己的问题。 问题在于我像这样运行容器:
docker run -p 3306:3306 asyncfi/magento-mysql
这将容器的端口发布到主机的所有接口上,这当然不是我当时想要的。 要仅绑定到本地主机,需要按如下方式运行容器:
docker run -p 127.0.0.1:3306:3306 asyncfi/magento-mysql
此外, EXPOSE
中的EXPOSE
行不是必需的,因为“expose”机制用于链接容器 。