Bài 6 - Mạng network bridge trong Docker kết nối các container với nhau

Cách tạo một network trong Docker, thực hành cài đặt Apache, PHP, MySQL và kết nối chúng vào mạng, cài đặt WordPress trên Docker
Bài 6 - Mạng network bridge trong Docker kết nối các container với nhau

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 networknetwork1.
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