Ghi chép lại quá trình tìm hiểu 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.
.
Docker có sẵn một số built-in driver. Trên Linux gồm: bridge
, overlay
và macvlan
. Trên Window gồm, nat
, overlay
, transparent
và l2bridge
.
Bên thứ 3 cũng có thể viết driver cho Docker. Chúng được gọi là remote driver
ví dụ calico
, contiv
, kuryr
, and weave
.
Mỗi driver chịu trách nhiệm tạo và quản lý các tài nguyên mạng mà nó chịu trách nhiệm.
bridge
driver trên Linux hoặc nat
trên Window, chúng làm việc tương tự nhau.--network
.docker network ls
```
NETWORK ID NAME DRIVER SCOPE 782c60977d9c bridge bridge local
- Kiểm tra thông tin chi tiết về mạng.
docker network inspect
[ { “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.
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
.
Khám phá dịch vụ cho phép các container hay service định vị nhau thông qua tên trong cùng một network.
c1
thực hiện ping request đến container c2
.ping c2
gọi đến DNS resolver nội bộ để phân giải c2
thành địa chỉ IP.--name
hay --net-alias
. Nên nó biết địa chỉ của container c2
c2
cho DNS resolve nội bộ trên c1
. Việc này chỉ xảy ra khi các container cùng một mạng.c2
.Chú ý: DNS chỉ phân giải giữa các container hay các dịch vụ trong cùng một network.
--dns
cho container để nếu Docker DNS server không phân giải được dns thì nó sẽ yêu cầu đến dns server tùy chọn này.end.