서버를 실행하는 Docker 컨테이너가 포트가 iptables에 의해 차단되었지만 포트를 외부 세계에 노출시키는 이유는 무엇입니까?


24

Docker 컨테이너 내에서 MySQL을 실행하는 데 문제가 있습니다. 내 테스트 이미지는 다음 Dockerfile에서 빌드됩니다.

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

위 파일에서 이미지를 빌드 한 후 다음과 같이 실행합니다.

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

그 후 모든 것이 팽창하여 로컬 컴퓨터 에서이 MySQL 인스턴스에 로그인 할 수 있습니다. 그러나 다른 컴퓨터에서도 로그인 할 수 있습니다.

특정 포트 ( "숨겨진"SSH, HTTP, HTTPS)로 들어오는 트래픽을 제외한 모든 것을 필터링하도록 방화벽을 설정했으며이 필터링은 실제로 작동하는 것 같습니다. 예를 들어 포트 1234에서 Django 개발 서버를 실행하면 로컬 컴퓨터에서는 연결할 수 있지만 외부에서는 연결할 수 없습니다. 따라서 방화벽은 패킷이 "일반"프로세스로 실행되는 서버로 향할 때 패킷을 필터링하지만 서버가 컨테이너 내부에서 실행되는 경우에는 필터링하지 않는 것 같습니다.

iptables -L -v --line-numbers는 다음과 같이 말합니다.

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

도커 버전은 다음과 같습니다.

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 포트가 외부 세계에 노출됩니까?

답변:


28

#docker IRC 채널 사용자 인 Michael Crosby와 Paul Czar 덕분에 이제 내 질문에 대답 할 수 있습니다. 문제는 내가 컨테이너를 다음과 같이 실행했다는 사실에 있습니다.

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

이것은 컨테이너의 포트를 호스트 컴퓨터의 모든 인터페이스 에 게시합니다 .이 시점에서 내가 원하는 것은 아닙니다. localhost에만 바인딩하려면 다음과 같이 컨테이너를 실행해야합니다.

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

또한 EXPOSE"노출"메커니즘이 컨테이너연결 하는 데 사용되므로 Dockerfile 의 행은 필요하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.