Network trong Docker, liên kết mạng các container
Docker cho phép bạn tạo ra một network (giao tiếp mạng), sau đó các container kết nối vào network. Khi các container cùng một network thì chúng có thể liên lạc với nhau nhanh chóng qua tên của container và cổng (port) được lắng nghe của container trên mạng đó.
Giới thiệu về Busybox:
Busybox là một software, nó tập hợp nhiều UNIX utilities (các câu lệnh) thành một file duy nhất. Các câu lệnh cung cấp bởi busybox thường tương đương với các câu lệnh cung cấp bởi GNU nhưng có ít option hơn. Đầu tiên, chúng ta cùng pull image busybox về bằng lệnh
docker pull busybox. Nói qua về image tên busybox, nó là một image rất nhỏ gọn, chỉ hơn 1MB, nhưng nó chứa nhiều thứ rất hữu ích
root@docker:~# docker pull busybox
root@docker:~# docker run -it --rm busybox
--rm : tham số này sẽ cho container chạy và khi kết thúc thì docker sẽ tự xóa container này khỏi hệ thống, tham số này thích hợp để chạy container đúng 1 lần
Để liệt kê các network đang có:
root@docker:~#
docker network ls
Ở hình trên là 3 network mặc định khi cài đặt Docker, mạng
bridge là mặc định khi tạo container kết nối vào nếu chúng ta ko chỉ định một mạng nào khác
Để tra cứu thông tin về mạng network nào, cũng như kiểm tra xem network đó đang kết nối với container nào
root@docker:~# docker network inspect bridge
Hình trên thấy tên network là bridge, các container kết nối vào gồm có Nginx01, Nginx02, Php74
Kiểm tra container đang kết nối vào network nào
root@docker:~# docker container inspect Nginx01
Kết quả phần Network cho thấy container đang kết nối vào mạng có tên là
Bridge nhận được ip là
172.17.0.2, Gateway là
172.17.0.1, subnet mask
255.255.0.0 (IPPrefixLen": 16) và địa chỉ MAC là
02:42:ac:11:00:02
Các network được tạo ra theo một
driver nào đó như
bridge, none, overlay, macvlan. Trong phần này sẽ sử dụng đến
bridge network: nó cho phép các container cùng network này liên lạc với nhau, cho phép gửi gói tin ra ngoài, tại thời điểm ban đầu này, các container này có thể truy cập được ra ngoài nhưng ở ngoài chưa thể truy cập vào trong
Tạo một bridge network với tên
network là
network1.
root@docker:~# docker network create --driver bridge network1
Kiểm tra lại các network
root@docker:~# docker network ls
Khi tạo một container, ấn định nó nối vào network có tên là
network1 thì thêm vào tham số
--network network1 trong lệnh
docker run.
root@docker:~# docker run -it --name B1 -h B1 --network network1 busybox
Khi một container có tên
web-test đã được tạo, để thiết lập nó nối vào network có tên
network1.
root@docker:~# docker network connect network1 web-test
Gỡ bỏ containẻ khỏi network đã được gán ở trên
root@docker:~# docker network disconnect network1 web-test
Xóa network đã tạo. Để xóa được network đã tạo thì network đó ko có kết nối đến container nào khác
root@docker:~# docker network inspect network1
root@docker:~# docker network rm network1
Lưu ý : Các network này không thông với nhau
Cổng - Port
Các kết nối mạng thông qua các cộng, để thiết lập cấu hình các cổng của container chú ý: có cổng bên trong container, có cổng mở ra bên ngoài (public), có giao thức của cổng (tpc, udp). Khi chạy container (tạo) cần thiết lập cổng thì đưa vào lệnh
docker run tham số dạng sau:
docker run -p public-port:target-port/protocol ...
- public-port : cổng public ra ngoài (ví dụ 80, 8080 ...), các kết nối không cùng network đến container phải thông qua cổng này.
- target-port : cổng bên trong container, cổng public-port sẽ ánh xạ vào cổng này. Nếu các container cùng network có thể kết nối với nhau thông qua cổng này.
Ví dụ : Tạo 1 container với tên là webtest, đặt hostname là web-test port của host là 8888 port của container là 80
root@docker:~# docker run -it --name web-test -h web-test -p 8888:80 busybox
root@docker:~# docker ps
Nhìn vào mục PORTS chúng ta thấy máy host port 8888 sẽ forward vào port 80 của Container Web-test
Vào lại Docker web-test, chạy dịch vụ web và test thử dịch vụ
root@docker:~# docker attach web-test
/ # cd /var/www/
/var/www # httpd
/var/www # echo "website is running......" > index.html
/var/www #
Từ ở ngoài truy cập vào ip của máy host theo port 8888