8.1 Основні кроки діагностики мережевих проблем
Мережеві проблеми у Docker можуть виникати з різних причин, включаючи неправильну конфігурацію мереж, проблеми з DNS, конфлікти IP-адрес та інші. У цій лекції ми розглянемо основні методи діагностики та вирішення мережевих проблем у Docker.
Якщо виникли мережеві проблеми, потрібно виконати наступні кроки:
- Перевірка стану контейнерів та мереж
- Використання мережевих утиліт всередині контейнерів
- Перевірка конфігурації Docker та мережевих файлів
- Перевірка системних журналів Docker
- Використання мережевих команд Docker
8.2 Перевірка стану контейнерів та мереж
Перший крок у діагностиці мережевих проблем — перевірка стану контейнерів та мереж.
Перевірка стану контейнерів
Спочатку відобразимо всі запущені контейнери. Для цього використовуємо команду docker ps:
docker ps
Якщо контейнери не запущені, це може свідчити про проблеми з самим Docker або конфігурацією контейнерів.
Перевірка мереж
Команда docker network ls відображає всі мережі, створені в Docker:
docker network ls
Переконайтеся, що потрібна мережа існує, і контейнери підключені до неї.
8.3 Використання мережевих утиліт всередині контейнерів
Мережеві утиліти, такі як ping, curl, netcat (або nc), і nslookup, можуть допомогти діагностувати проблеми всередині контейнерів. Кожна з цих утиліт виконує свою специфічну задачу:
ping— утиліта для перевірки доступності віддалених хостів у мережі, відправляючи їм ICMP-запити.curl— інструмент для передачі даних за різними протоколами, часто використовується для перевірки доступності веб-сервісів.netcat (nc)— універсальний інструмент для роботи з мережевими підключеннями, дозволяє створювати TCP/UDP з'єднання і діагностувати доступність портів.nslookup— утиліта для пошуку інформації про DNS-записи, наприклад, для перевірки резолюції імен контейнерів.
Приклад використання ping
Підключіться до контейнера і перевірте зв'язок з іншим контейнером або сервісом, використовуючи утиліту ping для відправки ICMP-запитів:
docker exec -it <container_name> ping <target_container_name_or_ip>
Приклад використання curl
Перевірте доступність вебсервісу всередині контейнера за допомогою утиліти curl:
docker exec -it <container_name> curl http://<target_service>
Приклад використання nslookup
Використовуйте nslookup для перевірки резолюції DNS імен контейнерів, що корисно для діагностики проблем з мережевими сервісами:
docker exec -it <container_name> nslookup <target_container_name>
Приклад використання nc host port
Утиліта nc використовується для налагодження і діагностики мережевих підключень. За допомогою команди nc host port можна встановити з'єднання із заданим хостом і портом, перевіряючи доступність порту на цільовому хості:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Перевірка конфігурації Docker та мережевих файлів
Некоректні конфігурації Docker та мережевих файлів можуть викликати мережеві проблеми.
Перевірка файлу docker-compose.yml
Переконайтесь, що файл docker-compose.yml налаштований коректно, і всі мережі, сервіси та порти вказані правильно.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- webnet
db:
image: postgres:latest
ports:
- "5432:5432"
networks:
- webnet
networks:
webnet:
driver: bridge
Перевірка файлу /etc/docker/daemon.json
Перевірте конфігурацію Docker Daemon, якщо вона була змінена:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Перевірка системних журналів Docker
Системні журнали Docker можуть містити корисну інформацію про мережеві помилки та проблеми.
Перегляд журналів Docker
Використовуйте команду journalctl для перегляду журналів Docker на системах з systemd:
journalctl -u docker.service
Перегляд логів контейнерів
Логи контейнерів також можуть допомогти в діагностиці мережевих проблем:
docker logs <container_name>
8.6: Використання мережевих команд Docker
Docker надає команди для діагностики та управління мережами, такі як docker network inspect та docker network connect.
Команда docker network inspect
Ця команда дає змогу отримати детальну інформацію про мережу, включно зі списком підключених контейнерів та налаштуваннями IPAM.
docker network inspect <network_name>
Приклад виводу команди docker network inspect
[
{
"Name": "webnet",
"Id": "e5e5e1b1a3e5",
"Created": "2021-01-01T00:00:00.000000000Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"container_id": {
"Name": "web",
"EndpointID": "6c52f8c75c1e",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Команда docker network connect
Якщо контейнер був неправильно підключений до мережі, ти можеш вручну підключити його:
docker network connect <network_name> <container_name>
8.7 Приклади діагностики та вирішення проблем
Приклад 1: Проблеми з DNS перетворенням імені домену в IP
Якщо контейнери не можуть перетворити імена хостів інших контейнерів, перевірте налаштування DNS:
Перевірка налаштувань DNS в docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
Перевірка DNS всередині контейнера:
docker exec -it <container_name> cat /etc/resolv.conf
Приклад 2: Проблеми з доступом до сервісів
Якщо контейнери не можуть отримати доступ до сервісів на інших хостах:
Перевірка опублікованих портів:
docker ps
Перевірка правил брандмауера:
Переконайтеся, що правила брандмауера не блокують потрібні порти.
Приклад 3: Конфлікт IP-адрес
Якщо у вас є конфлікт IP-адрес між контейнерами або з хостом:
Перевірка підмережі мережі:
docker network inspect <network_name>
Зміна підмережі:
docker network create --subnet=192.168.2.0/24 my_network
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ