Sau khi cài đặt docker, bạn có 3 mạng theo mặc định:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
Tôi đang cố gắng giữ cho điều này đơn giản. Vì vậy, nếu bạn khởi động một vùng chứa theo mặc định, nó sẽ được tạo bên trong mạng cầu nối (docker0).
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
Trong dockerfile của jenkins các cổng 8080
và 50000
được hiển thị. Các cổng này được mở cho container trên mạng cầu của nó. Vì vậy, mọi thứ bên trong mạng cầu nối đó có thể truy cập vùng chứa trên cảng 8080
và 50000
. Mọi thứ trong mạng cầu đều nằm trong phạm vi riêng tư của "Subnet": "172.17.0.0/16",
Nếu bạn muốn truy cập chúng từ bên ngoài, bạn phải lập bản đồ các cổng -p 8080:8080
. Điều này sẽ ánh xạ cổng của vùng chứa của bạn với cổng của máy chủ thực của bạn (mạng máy chủ). Vì vậy, việc truy cập vào máy chủ của bạn trên 8080
sẽ định tuyến đến mạng lưới cầu nối của bạn trên cổng 8080
.
Bây giờ bạn cũng có mạng máy chủ của mình. Điều này không làm cho kết nối mạng container. Vì vậy, nếu bạn bắt đầu một vùng chứa trong mạng máy chủ, nó sẽ giống như thế này (đó là vùng đầu tiên):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
Sự khác biệt là với các cổng. Vùng chứa của bạn hiện nằm trong mạng máy chủ của bạn. Vì vậy, nếu bạn mở cổng 8080
trên máy chủ của mình, bạn sẽ tích lũy vùng chứa ngay lập tức.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Tôi đã mở cổng 8080
trong tường lửa của mình và khi tôi đang kết nối máy chủ của mình trên cổng, 8080
tôi đang truy cập jenkins của mình. Tôi nghĩ rằng blog này cũng hữu ích để hiểu nó tốt hơn.
--net=host
bên trong Dockerfile không?