Skip to content

Latest commit

 

History

History
251 lines (156 loc) · 8.78 KB

8. docker-network.md

File metadata and controls

251 lines (156 loc) · 8.78 KB

Network trong Docker

  1. Networking Overview
  2. Use bridge networks
  3. Use host networking
  4. Use Macvlan networks
  5. Disable networking for a container

1. Networking Overview

Các loại Network driver

  • Default bridge network là driver mặc định được gán cho container khi nó được tạo ra. Nó thường được sử dụng khi app của bạn chạy trong containers độc lâp nhưng cần kết nối.
  • User-defined bridge networks là sự lựa chọn tốt nhất khi bạn cần nhiều container trên cùng một docker host kết nối với nhau.
  • Host Networks dùng cho các container độc lập, loại bỏ sự cách ly mạng giữa các container và docker host, sử dụng mạng trực tiếp của host. Sử dụng tốt nhất khi các lớp mạng không nên bị cô lập khỏi docker host, nhưng lại muốn các khía cạnh khác của container bị cô lập.
  • Macvlan networks cho phép bạn chỉ định địa chỉ MAC cho container, làm cho nó xuất hiện như một physical device trên network của bạn. Khi đó docker deamon sẽ định tuyến các traffic tới các container bằng địa chỉ MAC. Sử dụng tốt nhất khi bạn migrate các setup hoặc muốn container của bạn giống như một physical hots trong network của bạn với một địa chỉ MAC duy nhất cho mỗi máy.

Khi cài đặt Docker, mặc định sẽ tạo ra 3 network driver là bridge, host, only, và một virtual bridge là docker0. Docker sẽ tự động tim một subnet chưa được dùng trên host gán cho docker0.

Sau đó, khi chúng ta khởi động một container (với bridge network), một veth (Virtual Ethernet) sẽ được tạo ra nối 1 đầu với docker0 và một đầu sẽ được nối với interface eth0 trên container.

So sánh sự tương đương giữa các chế độ card mạng với các nền tảng ảo hóa khác:

General Virtualization Term Docker Network Driver
NAT Network bridge
Bridged macvlan, ipvlan (experimental since Docker 1.11)
Private / Host-only bridge
Overlay Network / VXLAN overlay

2. Use bridge networks

Khi bắt đầu với docker, một Default bridge network tự động đươc tạo ra gọi lại bridge, và bạn cũng có thể tự định nghĩa một User-defined bridge networks, nó vẫn sử dụng bridge driver nhưng do mình tự định nghĩa.

Differences between user-defined bridges and the default bridge

  • User-defined bridge networks cung cấp sự cô lập và khả năng tương tác tốt hơn giữa các ứng dụng containers. Các container sử dụng chung mạng này sẽ tự động phơi ra tất các các port với nhau nhưng không phơi ra bên ngoài. Điều này cho phép các container giao tiếp với nhau dễ dàng mà không cần lo lắng về sự tấn công từ bên ngoài.

  • User-defined bridge networks cung cấp việc tự động phân giải tên miền giữa các container, các container có thể giao tiếp và liên lạc với nhau bằng tên hoặc alias của nó.

  • Các container có thể được gắn vào hoặc tách ra khỏi mạng một cách nhanh chóng.

  • Mỗi một User-defined bridge networks được định nghĩa sẽ tạo ra một bridge có thể custom

  • Các container được liên kết trong default bridge network có thể chia sẻ biến môi trường.

Manage a user-defined bridge

Tạo một user-defined bridge network:

$ docker network create <net-name>

Xóa network:

$ docker network rm <net-name>

Xem danh sách các mạng đã có:

$ docker network ls

Xem chi tiết một mạng cụ thể:

$ docker network inspect <net-name>

Connect a container to a user-defined bridge

Tạo một container mới kết nối tới network đã được định nghĩa sẵn

$ docker create --name my-nginx \
  --network <net-name> \
  --publish 8080:80 \
  nginx:latest

Kết nối tới mạng đã có sẵn:

$ docker network connect my-net my-nginx

Disconnect a container from a user-defined bridge

$ docker network disconnect my-net my-nginx

Enable forwarding from Docker containers to the outside world

Mặc định, traffic từ container kết nối tới default bridge network sẽ không được forword ra ngoài mạng. Để cho phép forwarding, cấu hình như sau:

  • Configure the Linux kernel to allow IP forwarding:

      $ sysctl net.ipv4.conf.all.forwarding=1
    
  • Change the policy for the iptables FORWARD policy from DROP to ACCEPT.

      $ sudo iptables -P FORWARD ACCEPT
    

Use the default bridge network

Connect a container to the default bridge network

Khi tạo container, nếu không sử dụng option --network thì mặc định container sẽ được kết nối với mạng này

Configure the default bridge network

Để config default bridge network, bạn cần chỉ định các tùy chọn trong deamon.json.

{
  "bip": "192.168.1.5/24",
  "fixed-cidr": "192.168.1.5/25",
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "10.20.1.1",
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": ["10.20.1.2","10.20.1.3"]
}

Restart lại docker để apply các thay đổi

3. Use host networking

Nếu bạn sử dụng host driver cho container, mạng của container sẽ không được cô lập với Docker host. Ví dụ:

  • Tạo và chạy một container như một tiến trình riêng biệt với các tùy chọn --rm nghĩa là tự động xóa khi stop/exit container.

      $ docker run --rm -d --network host --name my_nginx nginx
    
  • Giờ ta có thể truy cập ngnix bằng browser qua http://localhost:80/.

  • Kiểm tra:

    • Liệt kê tất cả các network interface và xác định xem đã tạo được mạng mới vừa rồi chưa

      $ ip addr show

    • Kiểm tra port 80 của ngnix

      $ sudo netstat -tulpn | grep :80

  • Stop the container. Nếu khi tạo không có tùy chọn --rm để tự động xóa, thì sử dụng command sau:

      docker container stop my_nginx	
    

4. Use Macvlan networks

Create a macvlan network

Bridge mode

Sử dụng tùy chọn --driver macvlan, và cần chỉ ra parent là một interface mà các traffic sẽ đi qua trên docker host

$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1  \
  -o parent=eth0 pub_net

802.1q trunk bridge mode

If you specify a parent interface name with a dot included, such as eth0.50, Docker interprets that as a sub-interface of eth0 and creates the sub-interface automatically.

$ docker network  create  -d macvlan \
    --subnet=192.168.50.0/24 \
    --gateway=192.168.50.1 \
    -o parent=eth0.50 macvlan50

Use an ipvlan instead of macvlan

Trong ví dụ bên trên, bạn đang sử dụng L3 bridge, nếu muốn sử dụng L2 bridge thì sử dụng ipvlan thay vì macvlan. Sử dụng -o ipvlan_mode=l2

$ docker network create -d ipvlan \
    --subnet=192.168.210.0/24 \
    --subnet=192.168.212.0/24 \
    --gateway=192.168.210.254  \
    --gateway=192.168.212.254  \
     -o ipvlan_mode=l2 ipvlan210

Use IPv6

Nếu muốn config IPv6 thì cần sử dụng dual-stack IPv4/IPv6 Macvlan networks.

$ docker network  create  -d macvlan \
    --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
    --gateway=192.168.216.1  --gateway=192.168.218.1 \
    --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
     -o parent=eth0.218 \
     -o macvlan_mode=bridge macvlan216

5. Disable networking for a container

Bạn có thể sử dụng --network none khi start container. Ví dụ:

  • Tạo một container
$ docker run --rm -dit \
  --network none \
  --name no-net-alpine \
  alpine:latest \
  ash
  • Check the container’s network stack, chú ý là eth0 không được tạo ra

      ~# docker exec no-net-alpine ip link show
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    

Và sẽ không có routing table, lệnh sau sẽ trả về none

	$ docker exec no-net-alpine ip route
  • Stop container

      $ docker container rm no-net-alpine 
    

Container có thể sẽ tự động được xóa bởi vì nó được tạo với flag --rm

	$ docker stop no-net-alpine

Stop and remove all container and network

$ docker container stop <container-name>
$ docker container rm <container-name>
$ docker network rm <network-name>

Thao khảo

https://docs.docker.com/network/