Bir sunucuyu çalıştıran bir Docker kabı, söz konusu bağlantı noktası iptables tarafından engellenmiş olsa bile, bağlantı noktasını dış dünyaya maruz bırakıyor?


24

Bir Docker konteynerinin içinde çalışan MySQL ile ilgili bir sorun yaşıyorum. Test resmim aşağıdaki Docker dosyasının oluşturduğu içerik:

# See: https://index.docker.io/u/brice/mysql/

FROM ubuntu:12.10
MAINTAINER Joni Kahara <joni.kahara@async.fi> 

# 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"]

Yukarıdaki dosyadan bir resim oluşturduktan sonra, şunu çalıştırıyorum:

docker run -p 3306:3306 asyncfi/magento-mysql

Bundan sonra her şey şişer ve yerel makineden MySQL'in bu örneğine giriş yapabilirim. Ancak, başka herhangi bir makineden de giriş yapabilirim.

Güvenlik duvarımı belirli bağlantı noktalarına ("gizli" SSH, HTTP, HTTPS) gelen trafik dışındaki her şeyi filtrelemek üzere ayarladım ve bu filtreleme aslında işe yarıyor; Örneğin, 1234 numaralı bağlantı noktasında bir Django geliştirme sunucusu çalıştırdığımda yerel makineden bağlanabiliyorum, ancak dışarıdan bağlanamıyorum. Bu nedenle, güvenlik duvarı, paketleri "düz" bir işlem olarak çalışan bir sunucuya yönlendirildiğinde, ancak sunucu bir kap içinde çalışırken değil, paketleri filtreliyor gibi görünüyor.

iptables -L -v --line-numbers şöyle diyor:

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 sürümü:

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 portu neden dış dünyaya maruz kalıyor?

Yanıtlar:


28

#Docker IRC kanalı kullanıcıları sayesinde Michael Crosby ve Paul Czar Artık kendi sorumu cevaplayabiliyorum. Sorun şu ki, konteyneri şöyle koştum.

docker run -p 3306:3306 asyncfi/magento-mysql

Bu, konteynerin portunu host makinenin tüm arayüzlerine yayınlar , bu kesinlikle şu anda aradığım şey değildi. Yalnızca localhost'a bağlanmak için, kabı aşağıdaki gibi çalıştırmak gerekliydi:

docker run -p 127.0.0.1:3306:3306 asyncfi/magento-mysql

Ayrıca EXPOSE"açığa" mekanizması için kullanılır olarak Dockerfile çizgi gerekli değildir bağlantı kaplarda .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.