Tại sao một container Docker chạy một máy chủ để lộ cổng ra thế giới bên ngoài mặc dù cổng cho biết bị chặn bởi iptables?


24

Tôi đang gặp vấn đề với MySQL chạy bên trong Docker container. Hình ảnh thử nghiệm của tôi được xây dựng từ Dockerfile sau:

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

Sau khi xây dựng một hình ảnh từ tập tin trên, tôi chạy nó với:

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

Sau đó mọi thứ đều phình ra và tôi có thể đăng nhập vào phiên bản MySQL này từ máy cục bộ. Tuy nhiên, tôi cũng có thể đăng nhập từ bất kỳ máy nào khác.

Tôi đã thiết lập tường lửa của mình để lọc mọi thứ trừ lưu lượng truy cập đến các cổng cụ thể ("ẩn" SSH, HTTP, HTTPS) và tính năng lọc này thực tế có vẻ hoạt động; ví dụ nếu tôi chạy một máy chủ phát triển Django trên cổng 1234 thì tôi có thể kết nối từ máy cục bộ, nhưng không phải từ bên ngoài. Vì vậy, tường lửa dường như đang lọc các gói khi chúng được chuyển đến một máy chủ đang chạy như một quy trình "đơn giản", nhưng không phải khi máy chủ đang chạy bên trong một container.

iptables -L -v - số dòng cho biết như sau:

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

Phiên bản Docker là:

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

Tại sao cổng MySQL tiếp xúc với thế giới bên ngoài?

Câu trả lời:


28

Nhờ #docker người dùng kênh IRC Michael Crosby và Paul Czar bây giờ tôi có thể trả lời câu hỏi của riêng tôi. Vấn đề nằm ở chỗ tôi chạy container như thế này:

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

Điều này xuất bản cổng chứa cho tất cả các giao diện của máy chủ, đây chắc chắn không phải là thứ tôi đang tìm kiếm tại thời điểm này. Để chỉ liên kết với localhost, cần phải chạy container như sau:

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

Ngoài ra, EXPOSEdòng trong Dockerfile là không cần thiết vì cơ chế "phơi bày" được sử dụng để liên kết các container .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.