tailieu-Docker

Ghi chép lại quá trình tìm hiểu Docker

View the Project on GitHub lamth/tailieu-Docker

Tìm hiểu mạng trong Docker

Docker cung cấp nhiều giải pháp mạng để kết nối container với container và với mạng ngoài. Mạng trong Docker dựa theo kiến trúc plugable mã nguồn mở được gọi là Mô hình mạng container (Container Network Model- CNM) Libnetwork cung cấp một giải pháp khám phá dịch vụ và cân bằng tải cơ bản.

Tổng quan

Container network model - CNM

Libnetwork.

.

Single-host bridge network.

- Kiểm tra thông tin chi tiết về mạng.

docker network inspect

docker network inspect bridge

[ { “Name”: “bridge”, “Id”: “2aa395d3804b55f8dc7afb77f1bce41ff017e24fcd740eb16bcad558b6f866ba”, “Created”: “2019-11-11T10:49:24.2189012Z”, “Scope”: “local”, “Driver”: “bridge”, “EnableIPv6”: false, “IPAM”: { “Driver”: “default”, “Options”: null, “Config”: [ { “Subnet”: “172.17.0.0/16”, “Gateway”: “172.17.0.1” } ] }, “Internal”: false, “Attachable”: false, “Ingress”: false, “ConfigFrom”: { “Network”: “” }, “ConfigOnly”: false, “Containers”: {}, “Options”: { “com.docker.network.bridge.default_bridge”: “true”, “com.docker.network.bridge.enable_icc”: “true”, “com.docker.network.bridge.enable_ip_masquerade”: “true”, “com.docker.network.bridge.host_binding_ipv4”: “0.0.0.0”, “com.docker.network.bridge.name”: “docker0”, “com.docker.network.driver.mtu”: “1500” }, “Labels”: {} } ]

- Mạng xây dựng bằng driver `bridge` được dựa theo công nghệ **Linux bridge** trong nhân linux. Giúp có hiệu năng cao và ổn định.

brctl show

bridge name bridge id STP enabled interfaces docker0 8000.02427ebbb138 no veth54e59c3 veth685f9d7 vethr549586583f

- Tạo mạng mới:

docker network create -d bridge

- Các container trong mạng bridge có thể phân giải địa chỉ ip của nhau thông qua tên của container đó.
> Mạng `bridge` mặc định không hỗ trợ phân giải tên thông qua Docker DNS service. tất cả mạng user-define khác đêu hỗ trợ.

- *Port mapping* là chức năng cho phép ánh xạ một port của container lên một port của host. Bất cứ lưu lượng truy cập nào đến host theo port cấu hình sẽ được chuyển hướng đến port được cấu hình của container.

![](https://i.imgur.com/EPN8ZUX.png)

- Cấu hình port mapping:

docker run -p|–publish hostport:containerport image

ví dụ sau sẽ map port 8080 trên host với port 80 của container:

docker run –publish 8080:80 –name web nginx


## Mạng overlay nhiều host.
- Bài sau nói rõ hơn về phần này 

- Mạng overlay là mạng có nhiều host. Cho phép một mạng trải trên nhiều máy chủ do đó container ở các host khác nhau có thể giao tiếp ở layer 2, ý tưởng là tạo kết nối container-container.
- Docker có sẵn driver nội bộ để có thể tạo mạng overlay(`-d overlay`)

## Kết nối với một mạng có sẵn.
- Khả năng kết nối trực tiếp với mạng ngoài của các container là rất quan trọng, Docker sử dụng built-in driver `MACVLAN`(hay `transparent` trên Window) để có thể làm được điều đó.

- MACVLAN giúp container tham gia mạng như một host vật lý với địa chỉ MAC và IP riêng.

![](https://i.imgur.com/TNQaSgG.png)

- Để sử dụng được chức năng này thì interface mạng của host phải bật ở chế độ **promiscuous mode**.

- Nếu host NIC kết nối với mạng có nhiều vlan, và muốn kết nối container với vlan, có thể sử dụng macvlan với **sub-interface** của host NIC.
Ví dụ:

![](https://i.imgur.com/5LNfEaM.png)
- Tạo mạng macvlan100 với sub-interface eth0.100 

docker network create -d macvlan
–subnet=10.0.0.0/24
–ip-range=10.0.00/25
–gateway=10.0.0.1
-o parent=eth0.100
macvlan100

- Sau đó gán container vào mạng này.
- Có thể sử dụng MACVLAN với Vlan trunking để có thể tạo ra các network của từng vlan như hình sau:

![](https://i.imgur.com/Kifb0Nt.png)

## Container và service log cho việc sử lý xự cố.
- Việc kiểm tra log khi xử lý sự cố là rất quan trọng. Tiến hành kiểm tra log của docker:
- Trên Window:

∼AppData\Local\Docker

- Trên linux:
    - Với init là systemd:
    ```
    journalctl -u docker.service
    ```
    - Với init khác systemd:
        - Ubuntu systems running upstart: /var/log/upstart/docker.log
        - RHEL-based systems: /var/log/messages
        - Debian: /var/log/daemon.log
        - Docker for Mac: ∼/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring
- Có thể thiết lập mức độ chi tiết của log trong file config của docker daemon(daemon.json). Giá trị `debug` thiết lập là `true` và giá trị `log-level` thiết lập là một trong những mức độ từ nhiều nhất xuống là `debug`, `info`, `warn`, `error`, `fatal`.

- Xem log của container:

docker container logs

- Xem log của service trong swarm:

docker service logs

- Ngoài ra có thể lưu container log đến các logging driver:
    - json-file (default)
    - journald (only works on Linux hosts running systemd)
    - syslog
    - splunk
    - gelf
bằng cách cấu hình trong file daemon.json:

{ “log-driver”: “syslog” } ``` hoặc cấu hình cho từng container với tùy chọn --log-driver.

Service discovery

Chú ý: DNS chỉ phân giải giữa các container hay các dịch vụ trong cùng một network.

end.