ô kê mình trở lại rồi đây, dù thật ra chả ai có vẻ sẽ quan tâm đâu.
Rồi, để hiểu rõ docker dưới góc độ một lập trình viên chúng ta không thể bỏ qua phần docker networking. Về cơ bản nó không khó, vì sau đây mình sẽ nói qua một số kiến thức nền về network áp dụng thẳng vào đây là môi trường linux. Vì docker chạy trên linux. Dĩ nhiên rồi.
Đầu tiên nói qua một chút, networking là một mảng tổng quan khá lớn và khá quan trọng, mình trân thành khuyên anh em học qua networking vì nó tối cần thiết cho một người muốn làm chủ hệ thống.
bachvodungluoivlkhonglamangidamotthangnay!! quote 19/10/2020
Đầu tiên, các hệ thống máy tính cá nhân của các bạn. Windows, linux distro cơ bản đều đã thiết lập sẵn một số thông số cho việc truy cập mạng vì vậy user bình thường về cơ bản không cần quan tâm quá nhiều tới networking. Hồi bé mình biết set ip tĩnh với dns thôi mà mình đã gáy vang cả tiểu khu rồi. Tất nhiên là ở đây chúng ta sẽ nói tới nó ở một tầng cao hơn một chút.
Rồi. Các đối tượng chính (dưới dạng networking linux command đại khái là lệnh trong linux).
- Client
- Switching
- Routing
- DNS
Đối tượng command
- Ip-link – network device configuration
Về cơ bản các mô hình dưới đây là mô hình tối giản và thiếu rất nhiều module mạng.
I. Client
Rồi, đầu tiên là client chính là các máy cá nhân của các bạn. Hãy hiểu rõ client ở đây là cả ở dạng thực và ảo, một máy nguyên bộ Dell hay Hp của các bạn bản thân là một môi trường đầy đủ. Tất nhiên nếu bạn tạo máy ảo bên trong nó thì máy ảo cũng tính là một client và đầy đủ điều kiện của một thiết bị mạng.
- network interface: máy của các bạn phải có một định danh mạng, ở thời trước đây chính là các card mạng các bạn phải mua riêng để cắm dây adsl ấy và tất nhiên đấy là một dạng vật lý của nó. Trong linux các bạn có thể dùng lệnh ifconfig hoặc ip link để xem các thông tin về network interface :
- tất cả các thao tác mạng chúng ta sẽ định hình là những chiếc máy tính chạy linux như các nút mạng. Vì như cũ docker chạy linux chúng ta đang dùng môi trường đa máy tính thật để diễn tả mạng docker chạy trong cùng một máy. Chỉ để làm rõ mọi chuyện thôi. Dưới dây là một interface tên fastenthernet0 và các thông số của nó:
II. Switching
Vậy câu hỏi là nếu 2 máy muốn giao tiếp với nhau thì làm thế nào. Ở đây chúng ta sẽ bỏ qua một số loại thiết bị khác mà chỉ chú trọng vào switch và switch trong linux. Chúng ta dùng switch để giao tiếp, tất nhiên rồi.
Dưới dây là một network gồm 2 máy nối với nhau bởi switch, ip của 2 máy gán tĩnh dải 10.1.1.x . khi và chỉ khi cùng dải thì chúng ta mới giao tiếp qua đơn đối tượng switch. Đây là concept network switch cơ bản!
–
OK. Trong trường hợp cụ thể này, vật đảm nhiệm làm switch trực tiếp chính là một máy linux nên chúng ta sẽ dùng bộ lệnh ip-link.
Giả định net-interface tên là : eth0
Vậy lệnh chúng ta cần phải dùng là : ip addr add 10.1.1.1/24 dev eth0
vậy là chúng ta đã khai báo thiết bị ip : 10.1.1.1 dải mạng subnet 24 với tên interface là eth0 vào thiết bị.
Tiếp tục khai báo thiết bị thứ 2 với các thông số gần như tương đương.
Vậy lệnh chúng ta cần phải dùng là : ip addr add 10.1.1.2/24 dev eth0
Sau khi hoàn thành các bước trên máy của bạn có thể giao tiếp với nhau với một switch linux.
–
III. Routing
Bài toán mở rộng hơn chút. Thế nếu máy chúng ta giao tiếp ở khác dải mạng thì sao??
Lúc này thứ chúng ta cần là một Router.
Như cũ đây là một mô hình mạng có router
Về cơ bản config của một router bao gồm việc join vào tất cả các network .
Với rất nhiều interface mỗi cái tương ứng với một cổng mạng riêng biệt và setip join vào đúng với set mạng cổng đó kết nối.
–
Như cũ đảm nhiệm router ở đây là linux.
khi này bạn dùng lệnh route để kiểm tra các kết nối router.
Ok, bây giờ làm thế nào để router kết nối với mạng switch đã tạo. Giả định ta có 2 mạng switch 1.1.1.0/24 và 1.1.2.0/24.
Ta cho cổng 1 router ip:1.1.1.3 – cổng 2 router ip:1.1.2.3
Để mạng từ khu vực switch 2 kết nối sang khu vực switch 1.
ip route add 1.1.2.0/24 via 1.1.1.3
Như vậy mạng từ khu 2 có thể kết nối khu 1. Tương tự.
ip route add 1.1.1.0/24 via 1.1.2.3
–
Vậy gateway 0.0.0.0 là gì? 0.0.0.0 là default hay nói cách khác là all các ip kết nối. Đây là lý do tại sao trong các thiết lập cơ bản chúng ta chỉ trỏ về default-gateway và không cần quan tâm thêm về network. Đơn giản là bạn đã mở cổng với mọi mạng trong lưới router.
Lưu ý: cần phải set ip-forwarding linux để dùng làm cổng trung chuyển mạng. Cái này cần lưu ý vì sau khi tới các mạng lớn như k8s bạn có thể gặp phải.
IV. DNS
DNS ai cũng biết rồi. Đại khái là Linux có hệ thống file host riêng để gán domain name cho ip cũng tương tự như các bạn sửa file host máy windows thôi.
Docker cũng có một hệ thống dns build-in gán bằng name của các container khởi chạy. Cái này sẽ biểu hiện rõ ràng nhất khi chạy các môi trường microservices. Thôi để sau triển khai docker-compose nhìn cho nó rõ.