Docker Network sẽ đảm nhiệm nhiệm vụ kết nối mạng giữa các container với nhau, kết nối giữa container với bên ngoài. Với container và service của Docker, bạn có thể kết nối chúng lại với nhau hoặc kết nối chúng với các mạng khác nằm ngoài docker.

1. Định nghĩa và các Default Docker Network

1.1 Định nghĩa về Docker Network

Docker network là nơi sẽ đảm nhiệm nhiệm vụ cho container kết nối vào network

  • Các container cùng một network có thể liên lạc với nhau qua tên của container và cổng (port) được lắng nghe của container trên mạng đó

  • Kết nối trên 1 host hoặc nhiều host,

  • Kết nối giữa các cụm (swarm) docker containers.

  • Kết nối container với các mạng khác nằm ngoài docker.

  • Có thể cung cấp hầu hết các chức năng mà một hệ thống mạng bình thường cần có.

1.2 Default Networks

Có 3 loại networks được tự động tạo ra trong docker là:

  • bridge
  • none
  • host
    Chúng ta có thể xem bằng lệnh:
docker network ls

Output:

 ~  docker network ls                                                       
NETWORK ID     NAME                        DRIVER    SCOPE
e187cc02365d   bridge                      bridge    local
954add77e404   host                        host      local
b2fadf2348a9   none                        null      local
  • bridge đây là driver mạng mặc định của Docker, bridge là driver phù hợp nhất cho việc giao tiếp các containers độc lập. các container trong cùng mạng có thể giao tiếp với nhau qua địa chỉ IP, nếu không chỉ định driver thì bridge sẽ là driver mạng mặc định khi khởi tạo.

  • none driver cung cấp cho một container networking stack và không gian mạng riêng của nó, thường được dùng với mạng tùy chỉnh, driver này không thể dùng trong cụm swarm.

  • host dùng khi container cần giao tiếp với host và sử dụng trực tiếp mạng của máy chủ đang chạy

2. Thực hành tạo và quản lý Network

2.1 Tạo kết nối giữa 2 container

Phần thực hành này chúng ta sẻ tạo ra 2 container và nằm cùng trong một network bridge để cho 2 container này có thể kết nối đến nhau.

  1. Tải image busybox: là 1 công cụ nhỏ gọn chứa sẵn các lệnh ubuntu
docker pull busybox

1kC91HAHEQ1d7ZEZMXN7L2m8Y9EJrrN_C
2. Tạo container C1 từ image busybox

docker run -it --rm --name C1 busybox

Thêm tham số --rm để khi ta dừng container thì sẽ tự động xóa container này

Khi tạo xong container C1 thì ta có thể bật 1 terminal khác để kiểm tra network bridge bằng lệnh

docker network inspect bridge

Ta thấy C1 đã được kết nối vào mạng này.
1CQnUtMRcDrW2pd_r2g6agbINc14vpVlT
Hoặc có thể kiểm tra một container đang kết nối trong mạng nào bằng lệnh:

docker inspect C1
  1. Tạo container C2 từ image busybox tương tự phần tạo container C1
    Sau khi tạo xong container C2 ta chạy lệnh docker network inspect bridge để kiểm tra xem các container nào kết nối vào mạng này, ta thấy cả C2 và C1 đều nằm cùng một lớp mạng.
    14baC-lw-W6SKP2xcAVeqzTucvC3j6ol9
  2. Kiểm tra kết nối giữa C1 và C2
    Ảnh trên ta thấy C1 có IPV4 là : 172.17.0.2 , C2 có IPV4 là: 172.17.0.3.
    Ở terminal nếu đang đứng ngoài C1 thì ta access vào C1 bằng lệnh docker attach C1
    Đứng trong container C1 và ping sang C2 băng lệnh ping 172.17.0.3 , ping thành công vậy là container C1 đã kết nối được với container C2.
    1F4pyouezMdxEmunqmuHr3AgO5GoU-eRM

2.2 Tạo kết nối từ máy host đến container

Phần thực hành này chúng ta sẽ tạo 1 container C3 từ busybox và container này có máy chủ web httpd để chạy file html, container này có cổng ánh xạ với cổng của máy host để từ máy host có thể truy cập vào máy chủ web trên container busybox này

  1. Tạo container C3 và ánh xạ cổng 80 của container này với cổng 8888 của máy host
docker run -it --name C3 -p 8888:80 busybox

Kiểm tra các container đang chạy bằng lệnh docker ps
1yBXdNiJp--AI5sLPCw5V2lycNhti8IMX
2. Quay lại terminal của C2 ta vào thư mục /var/www và bật máy chủ web httpd lên.
Sau đó ta tạo file index.html để hiển thị hé lô guốc. :)

/var/www # httpd
/var/www # vi index.html
  1. Từ máy host vào trình duyệt truy cập vào container qua cổng 8888
    10aNSak0S6AZPAcfmmuq0NKEqA8O4IZTk
    Vậy là đã kết nối thành công từ máy host tới container.

2.3 Tạo docker network

Ngoài việc sử dụng các mạng có sẵn thì ta có thể tạo các mạng riêng để các container có thể sử dụng tách biệt với các container đó

  1. Tạo network
docker network create --driver bridge network1

Lệnh trên tạo ra mạng network1 ta kiểm tra bằng lệnh docker network ls

  1. Xóa network
docker network rm name_network
  1. Tạo container kết nối vào một network được chỉ định
docker run -it --name C4 --network network1 busybox

Lệnh trên ta tạo một container tên là C4 từ image busybox và có kết nối trong mạng network1 mới tạo ở trên.

Kiểm tra bằng lệnh docker network inspect network1 sẽ thấy có container C4 kết nối

  1. Kêt nối một container đang chạy với một mạng khác

Bài toán đặt ra: Chúng ta có 2 network là network1 và network2 có một container C5 đang kết nối với mạng network1 và ta muốn container này kết nối với cả network2 thì ta chạy lệnh.

docker network connect network2 C5

Lệnh trên là kết nối container C5 vào mạng network2

3. Kêt luận

Trên đây chúng ta đã tìm hiểu những kiến thức căn bản về tạo và quản lý và kết nối network trong docker. Phần tiếp đến mình sẽ cùng tìm hiểu về các bài tập thực hành nâng cao hơn docker và network nhé.
Cảm ơn mọi người đã đồng hành!

Tài liệu tham khảo