Đặt docker sử dụng IPv4 để ràng buộc cổng


97

Tôi có máy chủ docker và bên trong tôi có một container.

Máy chủ docker chỉ liên kết cổng trên giao diện IPv6, không phải trên IPv4.

Đây là đầu ra

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:55082           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::40280                :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -
tcp6       0      0 :::40122                :::*                    LISTEN      -
tcp6       0      0 :::36378                :::*                    LISTEN      -
tcp6       0      0 :::40543                :::*                    LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -

Bây giờ tôi có cổng 40122 trên máy chủ để liên kết với cổng 22 trên container.

Tôi muốn SSH vào vùng chứa đó nhưng tôi không thể vì nó bị ràng buộc duy nhất với IPv6

Đây là phiên bản docker của tôi Docker version 1.5.0, build a8a31ef

docker ps

201bde6c839a        myapp:latest   "supervisord -n"    3 weeks ago         Up 2 hours          0.0.0.0:40122->22/tcp, 0.0.0.0:40280->80/tcp, 0.0.0.0:40543->443/tcp   myapp

Tôi đã chạy bằng cách sử dụng docker run -d -P -p 40122:22

netstat -tlna

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3031          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::6379                 :::*                    LISTEN

ps aux

root         1  0.0  0.8  52440 16668 ?        Ss   00:53   0:03 /usr/bin/python /usr/bin/supervisord -n
root        49  0.0  0.1  17980  3048 ?        S    01:32   0:00 bash
root        64  0.0  0.1  46632  2712 ?        S    01:32   0:00 su -l vagrant
vagrant     65  0.0  0.1  21308  3760 ?        S    01:32   0:00 -su
root       288  0.0  0.1  17980  3088 ?        S    02:01   0:00 bash
root       304  0.0  0.1  46632  2720 ?        S    02:01   0:00 su -l vagrant
vagrant    305  0.0  0.1  21304  3804 ?        S    02:01   0:00 -su
vagrant    308  0.0  3.7 429616 75840 ?        Sl+  02:01   0:05 python ./manage.py shell_plus
root       654  0.0  0.4  47596  9848 ?        S    03:12   0:01 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       655  0.0  0.3  90280  7732 ?        S    03:12   0:00 nginx: master process /usr/sbin/nginx
www-data   656  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   657  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   658  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   659  0.0  0.2  90940  4500 ?        S    03:12   0:00 nginx: worker process
root       660  0.0  0.2  61372  5332 ?        S    03:12   0:00 /usr/sbin/sshd -D
root       669  0.0  0.4  37004  8892 ?        Sl   03:12   0:01 redis-server *:6379
root       856  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       857  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       858  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       859  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
vagrant    889  0.0  0.1  18692  2508 ?        R+   04:11   0:00 ps aux

Bạn đã sử dụng lệnh nào để khởi động vùng chứa? Đồng thời đăng kết quả đầu ra docker pskhi vùng chứa đang chạy.
Daniel t.

Bạn có thể xác nhận sshd thực sự đang chạy trên vùng chứa không? Chạy docker exec -ti 201bde6c839a /bin/bash, khi bạn đã ở trong, hãy đăng đầu ra của ps aux netstat -taln
Daniel t.

Trong máy chủ lưu trữ Docker của tôi, tất cả các cổng docker đang lắng nghe trên IPv6 và không có vấn đề gì khi kết nối với ssh trên vùng chứa.
Daniel t.

@ Danielt. tôi đã thêm thông tin. Tôi có thể ssh sử dụng exec nhưng tôi không thể ssh vào container trực tiếp từ bên ngoài sử dụng máy chủ cổng 40.122 từ mac
user3214546

Bạn có thể gặp phải vấn đề này github.com/docker/docker/issues/2174 , tôi không chắc liệu nó có được giải quyết hay không. Bạn cũng có thể chia sẻ cách bạn đang cố gắng kết nối thông qua ssh và lỗi bạn đang gặp phải?
Daniel t.

Câu trả lời:


72

Như @ daniel-t đã chỉ ra trong nhận xét: github.com/docker/docker/issues/2174 là về việc chỉ hiển thị ràng buộc với IPv6 trong netstat, nhưng đó không phải là vấn đề. Khi vấn đề github nói rằng:

Khi thiết lập proxy, Docker yêu cầu địa chỉ loopback '127.0.0.1', Linux nhận ra đây là địa chỉ tồn tại trong IPv6 (as :: 0) và mở trên cả hai (nhưng chính thức là ổ cắm IPv6). Khi bạn chạy netstat, nó sẽ thấy thông báo này và cho bạn biết đó là IPv6 - nhưng nó vẫn đang nghe trên IPv4. Nếu bạn đã chơi với cài đặt của mình một chút, bạn có thể đã vô hiệu hóa thủ thuật này mà Linux thực hiện - bằng cách đặt net.ipv6.bindv6only = 1.

Nói cách khác, chỉ vì bạn chỉ thấy nó là IPv6, nó vẫn có thể giao tiếp trên IPv4 trừ khi bạn đã đặt IPv6 thành chỉ ràng buộc trên IPv6 với cài đặt chỉ net.ipv6.bindv6. Để rõ ràng, net.ipv6.bindv6 chỉ nên là 0 - bạn có thể chạy sysctl net.ipv6.bindv6onlyđể xác minh.


4
Đây thực sự là một vấn đề lớn. Đám mây công cộng như Azure, không nói IPV6 tốt lắm, chẳng hạn như trình cân bằng tải Azure công cộng đang cố gắng sử dụng IPV4 làm phụ trợ.
Thomas Decaux

1
Có vẻ như bạn có thể cần cài đặt "Docker VM Extension" trong Azure và sử dụng Ubuntu 14.04 LTS. Tuy nhiên, tôi không nghĩ rằng có vấn đề với ipv6 vì điều này chỉ xảy ra trên máy chủ cục bộ, không phải mạng.
Michael

Bạn nói đúng, vấn đề là do cấu hình của tôi (tắt IPV6 không phải là một ý kiến ​​hay ^^)
Thomas Decaux

1
@bigdong bạn muốn bật ipv6.
Michael

1
@Michael Bạn là người tiết kiệm thời gian của tôi. :)
lv0gun9

6

Cài đặt net.ipv6.conf.all.forwarding=1sẽ khắc phục sự cố.

Điều này có thể được thực hiện trên một hệ thống trực tiếp bằng cách sử dụng sudo sysctl -w net.ipv6.conf.all.forwarding=1


Câu trả lời này có một lợi thế: nó cho phép bạn "khắc phục" sự cố mà không cần phải khởi động lại trình nền docker (câu trả lời với việc thay đổi cấu hình docker bên dưới). Về đầu trang, câu trả lời đã chọn: Tôi thực sự đã có sysctl net.ipv6.bindv6only=0nên việc thay đổi cấu hình này không giúp được gì.
pkoperek


0

Nếu bạn muốn các cổng vùng chứa của mình liên kết với địa chỉ ipv4, chỉ cần:

  • tìm tệp cài đặt
    • / etc / sysconfig / docker-network trên RedHat như nhau
    • / etc / default / docker-network trên Debian cũng không giống nhau
  • chỉnh sửa cài đặt mạng
    • thêm DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx là ipv4 thực của bạn (chứ không phải là 0.0.0.0)
  • khởi động lại docker ngừng hoạt động

hoạt động cho tôi trên docker 1.9.1


1
cái này có hoạt động trên debian không? không phải là / etc / default / docker?
Dimitri Kopriwa

1
@BigDong cảm ơn cho bình luận, tôi đang trên RedHat như hệ điều hành nên con đường là một chút khác biệt so với một hệ điều hành với tôi khác cố gắng để phản ánh bình luận của bạn trong câu trả lời
Sylvain

-1

Tôi đã có thể truy cập vùng chứa docker sau khi tắt SELinux

Để tắt SELinux tạm thời #sudo setenforce 0

Bộ chứa docker của tôi đang chạy trên Centos-7

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.