Классический форум-трекер
canvas not supported
Нас вместе: 4 241 959

Dmdev, Dzianis Matveyenka | Docker (2024) WEB-DL [RU]


Страницы:  1, 2  След. 
 
RSS
Начать новую тему   Ответить на тему    Торрент-трекер NNM-Club -> Обучающие видеоматериалы -> IT, Компьютерные видеокурсы
Автор Сообщение
Nord Freeman ®
RG Книги
Куратор Книг
Стаж: 12 лет 7 мес.
Сообщений: 6459
Ratio: 6943.98
Раздал: 133.8 TB
Поблагодарили: 620070
100%
Откуда: The Pirate Bay
witch.png
Dmdev, Dzianis Matveyenka | Docker (2024) WEB-DL [RU]

Автор: Dzianis Matveyenka
Производство: Dmdev
Жанр: Видеокурс

Описание:
В современном мире разработки ПО распространена микросервисная архитектура и облачные технологии, где давно ушли от разворачивания приложений на одном единственном сервере.
На этом курсе мы поговорим о том, какие проблемы и решения проблем на одном сервере появлялись, как изобрели аппаратную виртуализацию, а затем и виртуализацию на уровне операционной системы благодаря Linux Namespaces, и почему в настоящий момент встречается гибридная форма виртуализации.
Пройдя этот курс, ты уверенно овладеешь Docker и поймешь:
- как создавать свои собственные Docker образы
- как поднимать Docker контейнеры и их жизненный цикл
- различные storage & volumes для хранения информации
- как настраивать networking для общения между контейнерами и пользователями
- как упростить работу с Docker, заменив императивный подход на декларативный с помощью Docker Compose

Продолжительность: 05:41:33
Качество видео: WEB-DL
Язык озвучки: Русский
1. Docker. Введение
На вводном видео курса по Docker мы разберем в двух словах, что такое в принципе Docker, зачем нам его изучать, какие аспекты Docker будут разбираться в данном курсе и конечно необходимый багаж знаний, который нужен для успешного и комфортного прохождения этого курса.

2. История возникновения
Для того, чтобы понимать смысл создания той или иной технологии, очень полезно знать историю ее возникновения. Именно поэтому на этом видео мы разберем с вами, как все начиналось от одного единственного сервера, какие проблемы и решения проблем на нем появлялись, как изобрели аппаратную виртуализацию, а затем и виртуализацию на уровне операционной системы благодаря Linux Namespaces, и почему в настоящий момент встречается гибридная форма виртуализации.

3. Устанока ПО
Для прохождения курса нам необходимо установить соответствующее программное обеспечение. Чтобы понять, почему нам нужно 3 разных приложения (Docker cli, Docker Compose, Docker Server) для работы с Docker, мы вначале видео познакомимся с High-Level Docker Architecture. После успешной установки и запуска Docker Desktop мы проверим корректную работы всех 3 приложений.

4. Особенности Docker на Windows и MacOS
У нас есть возможность установить и затем работать с Docker на любой платформе, хоть мы и знаем, что виртуализация на уровне операционной системы требует именно Linux Namespaces. Поэтому на видео разберемся, как можно воспользоваться комбинацией удачной архитектурой Docker и гибридного варианта виртуализации, чтобы на любой платформе работать с Docker.

5. Image
Для того, чтобы более менее освоиться с Docker, нам необходимо изучить 4 основные темы: Image, Container, Storage & Volumes, Networking. На этом видео мы начнем с самого первого и базового - это Docker Image (образ). Разберем, из каких основных частей он состоит (Metadata & Layers), что такое слои образа, какая польза от разбиения образов на такие слои и т.д. В заключение разберем 2 команды для работы с образами: docker images и docker image inspect.

6. Docker Registry
Всего существует два варианта получения docker образов: создать его вручную и скачать уже готовый, который был сделал кем-то вместо нас. На видео мы продемонстрируем самый простой вариант - это скачивание уже существующего из Docker Hub с помощью команды docker pull. Также рассмотрим в деталях процесс работы команды docker pull и попрактикуемся выполнять ее на практике в терминале.

7. Container
Вот мы и дошли до следующего основного этапа в понимании Docker - это контейнеры. Проще говоря, образ - это шаблон, на основании которого в последующем создается контейнер. Для него Docker Engine выделяет необходимое количество ресурсов, запускает один или более процессов (потому что ни один контейнер не может существовать без запущенного процесса внутри него), и следит за его жизненным циклом, про который мы поговорим уже на следующем занятии.

8. Container Lifecycle. create command
У каждого docker контейнера есть свой жизненный цикл, который состоит из 6 основных состояний: created, running, restarting, paused, exited, removing. Наша задача разобраться с каждым из этих состояний, и начнем мы с самого первого - это created, который позволяет собственно создать контейнер на основании любого docker образа. Для отслеживания состояния всех контейнеров нам необходима команда docker ps -a (либо docker ps для просмотра только запущенных контейнеров). Также на видео почитаем документацию этой команды и на практике опробуем ее.

9. Container Lifecycle. start command
На этом видео мы наконец-то сможем запустить свой первый docker контейнер с помощью специальной команды docker start. Изучим в теории нюансы работы этой команды, обратимся к официальной документации для изучения всевозможных вариантов ее запуска, а также залезим внутрь директории /var/lib/docker, чтобы увидеть как выглядит и что содержит выделяемая директория под каждым docker контейнер.

10. Container Lifecycle. stop & kill commands
На предыдущем занятии мы видели, что контейнер автоматически переходит в состояние Exited, когда процессы внутри него заканчивают свою работу. А все потому, что контейнер не может быть в состоянии Running без как минимум одного работающего процесса внутри него. Поэтому на этом видео мы рассмотрим этот статус более подробно, а также две новые команды stop & kill, с помощью которых мы можем умышленно остановить процессы внутри контейнера и перевести его в статус Exited.

11. Container Lifecycle. rm command
На этом видео мы разберем еще одну команду, которая удалил неиспользуемый контейнер - это docker rm. Во время удаления контейнер уже должен быть в статусе Exited, потому что команда rm просто удаляет writable layer, который использовался для хранения изменений о жизнедеятельности процессов внутри контейнера. Поэтому на практике попробуем удалить запущенный контейнер и посмотрим, что произойдет.

12. Container Lifecycle. pause & unpause commands
Следующее состояние в жизненном цикле docker контейнеров - это Paused. Суть его заключается в том, чтобы временно приостановить все процессы внутри контейнера с помощью freezer cgroup и освободить CPU, которым в свою очередь могут воспользоваться другие контейнеры, выполняющие сложную работу. Для того, чтобы восстановить работу процессов внутри этого контейнера и вернуть CPU - нужно просто выполнить обратную операцию unpause. Для демонстрации этого статуса нам понадобится еще две новые второстепенные команды - это docker logs и docker stats.

13. Container Lifecycle. restart & run commands
На этом видео мы пройдем заключительный статус, в котором может быть контейнер - это Restarting. Для этого мы воспользуемся новой для нас командой restart и в нюансах разберемся, почему мы можем ее использовать из 3-х других статусов: Created, Running, Exited. Также изучим более удобную команду run, которая заменяет собой две другие: docker create & docker start, чтобы ускорить процесс создания и одновременного запуска контейнера.

14. Docker exec command
Docker позволяет выполнять любые команды внутри контейнеров точно так же, как мы это можем делать на своей host машине, т.е. просматривать текущую директорию, создавать файлы, записывать туда информацию и т.д. И для этого мы разберем новую команду - docker exec. Также посмотрим вариант вызова уже изученный команды docker run, которая тоже позволит зайти внутрь контейнера, чтобы вызывать любые bash команды внутри него.

15. Docker cp & diff commands
Как заходить внутрь контейнера и выполнять различные bash команды мы уже прекрасно знаем. Но что, если мы захотим перемещать директории и файлы между контейнерами и нашей host машиной? Для этого и существует специальная команда docker cp, которая позволит выполнять такие перемещения. Более того, есть и другая команда docker diff, которая отображает все изменения внутри контейнера, а точнее - содержит информацию о writable layer, который и нужен для хранения жизнедеятельности контейнера, потому что слои образа изменить невозможно.

16. Storage & Volumes
Как уже было сказано ранее, writable layer не единственный вариант изменения файловой системы внутри docker контейнера. Существуют и другие, которые во многом являются более предпочтительным. Про них мы будем более подробно разбираться на следующих занятиях, а пока наша задача на этом видео: понять, что вся файловая система контейнера - это всего лишь различные проекции на файловую систему внутри нашей host машины.

17. bind mount type
Первый из трех mount types, который мы будем разбирать в видео - это bind mount. Он является проекцией файловой системы host машины. Поэтому из docker контейнера можно получить к ним read & write доступ. Предпочтительным флагом для настройки mount types является --mount, потому что как показала практика - он более удобен как универсальный флаг для всех mount types, и легче запоминается человеком. К сожалению, bind mount имеет некоторые недостатки, из-за чего его не следует использовать в production. Например, производительность довольно низкая на операции read & write, а также большая зависимость от операционной системы host машины, что усложняет в дальнейшем миграцию docker контейнера на другие машины.

18. tmpfs mount type
Второй из трех mount types, который мы будем разбирать в видео - это tmpfs mount. Он использует memory host машины, поэтому является самым быстрым из всех mount types, но не оставляет информации на жестком диске после остановки контейнера. К сожалению, tmpfs mount имеет некоторые ограничения, из-за чего его не получится использовать на операционных системах отличных от linux. Также попробуем запустить контейнер с несколькими сконфигурированными mount types одновременно.

19. volume mount type
Заключительных третий mount types, который мы будем разбирать в видео - это volume mount. Он является самым распространенным ввиду его очевидных достоинств, таких как: отличная производительность (поэтому и является предпочтительным для контейнеров баз данных), долговременное хранение информации на жестком диске, последующая простая миграция на другую host машину при необходимости, и другие. Конечно, придется отдельно управлять созданием/удалением volumes, потому что они отделены от жизненного цикла контейнера. Поэтому их также можно использовать между несколькими контейнерами.

20. Networking
Networking - это одна из 4-х основных тем, чтобы понимать Docker и все его последующие более сложные темы, такие как создание своих собственных docker images, как работать с docker compose и другое. Т.е. все то, что мы будем проходить в последующем на этом курсе. И конечно, без настройки сети все еще не получится добиться полной изолированности контейнера, поэтому нам и приходит на помощь следующий Linux Namespace - NET. На видео разберем суть Docker Networking и вкратце пройдемся по всем 4-м основным Network Drivers, которые более подробно будем разбирать в последующих видео.

21. Bridge Driver
Первый и самый распространенный Network Driver, с которого мы начнем разбираться - это Bridge Driver. Он используется по умолчанию, когда мы стартуем любые контейнеры на нашей локальной машине, если мы явно не указываем другую сеть через параметр --network. На видео создадим 2 контейнера, привяжем их к сети bridge, которая использует Bridge Driver, и зайдем внутрь одного из контейнеров, чтобы проверить доступ к сторонним ресурсам и контейнерам внутри той же сети.

22. User-defined bridge network
bridge network, которая используется по умолчанию в Docker - считается legacy и не рекомендуется к использованию в production. Поэтому наша задача пойти по принятому пути - это создание своей собственной сети, используя Bridge Driver. Такая сеть будет иметь несколько преимуществ над bridge network по умолчанию, например, лучшая изолированность, возможность использовать имена контейнеров внутри этой сети как dns, вместо ip адресов, и другие. На видео попробуем создать две user-defined bridge networks и 4 контейнера в них, чтобы продемонстрировать все возможности.

23. Port forwarding
Чтобы подключиться и работать с приложением, которое находится в изолированном контейнере внутри bridge network, нам необходимо сделать еще один важный пункт: пробросить порт этого приложения во внешний мир. Для этого Docker предоставляет специальный функционал, который называется Port forwarding. Поэтому обычно, когда идет разговор о Port forwarding - имеется в виду именно контейнеры внутри сетей с bridge driver. На видео мы продемонстрируем Port forwarding на примере postgres image. Также обсудим нюансы Port forwarding при работы с Docker на операционных системах MacOS/Windows. И в конце наглядно проверим как происходит проксирование трафика из изолированного контейнера во внешний мир, проходя через gateway bridge network, далее gateway вирутальной машины на Linux OS, и далее к host машине (в нашем случае это MacOS).

24. Host Driver
Второй и менее распространенный Network Driver, который мы будем разбирать - это Host Driver. Суть его в том, что нам не нужно создавать и дополнительно конфигурировать новую подсеть. Все контейнеры host network будут автоматически подключены к сетевому интерфейсу Linux OS (в случае MacOS/Windows - это будет виртуальная машина на Linux OS). Отсюда можно сделать вывод, что Host Driver имеет свои плюсы и очевидные минусы, которые мы и продемонстрируем на видео.

25. None Driver
Третий и наименее распространенный Network Driver, который мы будем разбирать - это None Driver. Суть его в том, что мы полностью изолируем контейнер по сети, тем самым запрещая как входящий, так и исходящий трафик для него. На видео продемонстрируем его работу и обговорим несколько кейсов, где такой тип драйвера был бы полезен на практике.

26. Create your own image
Наконец-то мы дошли до изучения более продвинутой темы, потому что знаем основы Docker: как создавать свои собственные Docker образы. На видео вспомним, что из себя представляют Docker образы, ибо мы до текущего момента использовали их много раз, просто создавали эти образы другие разработчики, а не мы. Затем плавно перейдем к 3 основных пунктам, чтобы понять как собственно создавать свои собственные Docker образы: Dockerfile, Build context, build command. В заключении обсудим как Docker выполняет все эти вещи одновременно для достижения одной единственной цели - созданный Docker образ, который в последующем можно легко переиспользовать.

27. Dockerfile. FROM & ARG instructions
На текущем занятии мы создадим свой первый Dockerfile, узнаем формат написания его, как писать инструкции, как оставлять комментарии, и попрактикуемся с двумя базовыми инструкциями, такими как FROM и ARG. Чтобы создать свой собственный Docker образ на основании написанного нами Dockerfile, мы изучим новую команду - это docker build.

28. Dockerfile. WORKDIR & RUN instructions
Мы продолжаем разбираться с написанием Dockerfile и на очереди у нас следующие самые распространенные инструкции - это WORKDIR и RUN. Первая устанавливает рабочую директорию, в которой в последующем по умолчанию будут выполняться все другие инструкции, такие как RUN, ENTRYPOINT, CMD и т.д. Также если мы попробуем зайти внутрь запущенного docker контейнера, то мы окажемся именно в последней установленной WORKDIR. Вторая же инструкция чаще всего используется для вызова shell команд, а значит - на практике будет встречаться больше всего. Поэтому с ней мы поэкспериментируем большую часть видео.

29. Dockerfile. ADD & COPY instructions
Следующие на очереди самые распространенные инструкции при написании Dockerfile - это COPY и ADD. Обе позволяют копировать директории и файлы внутрь docker образа. Только COPY копирует все из build контекста, а потому без него является бесполезной. В свою очередь ADD может копировать из удаленных серверов (по ссылке), тем самым отсутсвует ограничение build контекста. Тем не менее, на практике нужно предпочитать именно инструкцию COPY, потому что ADD можно легко заменить на RUN, что мы и продемонстрировали на предыдущем занятии. Более того RUN позволяет выполнять любые shell команды, тем самым предоставляя нам больше гибкости (например, удалить распакованный архив за собой и т.д.).

30. Dockerfile. CMD & ENTRYPOINT & EXPOSE instructions
Следующие основные инструкции при написании Dockerfile - это CMD, ENTRYPOINT и EXPOSE. Именно они позволяют нам запускать приложения внутри запущенных docker контейнеров, а также пробрасывать порты, чтобы в последующем мы могли извне подключиться к этим приложениям. На видео также разберем разницу между ENTRYPOINT и CMD, и как переписать их при необходимости во время запуска docker контейнера.

31. Build cache
Чтобы ускорить сборку docker образов, docker использует так называемый cache, который позволяет переиспользовать слои, что уже были выполнены раньше. Кэш срабатывает автоматически, его не нужно подключать отдельно, но можно отключить при необходимости, воспользовавшись специальный аргументом --no-cache. Также разберемся, почему так важно соблюдать правильный порядок следования инструкций в Dockerfile, чтобы получить максимальную эффективность docker cache.

32. Multi-stage builds
Для того, чтобы еще больше улучшить наши финальный образы, уменьшив из размер, количество слоев, и сделать Dockerfile более читабильным - Docker предоставляет механизм, который называется Multi-stage builds. Суть его в том, чтобы разбивать создание образа на шаги (stages). На видео разберем все нюансы его работы и на практике закрепим на примере Dockerfile с предыдущих занятий.

33. Build context
На текущий момент мы использовали только локальный build context для создания docker images. Но теперь давайте разберемся со всеми 3 возможными вариантами: локальный, удаленный и отсутствие build context вообще. Каждый из них имеет свои нюансы и варианты использования. Поэтому попробуем пройтись по каждому и закрепить на практике.

34. Image tagging
Каждый раз, когда мы создаем docker image - ему присваивается уникальный идентификатор. Но с ним работать не удобно: его сложно запомнить, приходится копировать для всех других docker команд, и он имеет множество ограничений, связанные с загрузкой и скачиванием образов из docker registry. Поэтому на этом видео мы разберем 2 возможных варианта добавления тэгов для любых docker images, которые решают все эти сложности для нас.

35. Push docker images
После того, как мы изучили команду docker tag и знаем, как присваивать собранным образам сколько угодно различных тэгов, мы можем использовать эту возможность, чтобы дополнительно добавить к имени тэга host, port и repository. Это позволит нам в дальнейшим выполнить команду docker push и загрузить образ на удаленный репозиторий. Для примера мы залогинимся в Docker hub, создадим там свой репозиторий, и попробуем загрузить сюда свой собственный образ. Для этого нам придется изучить еще несколько команд для прохождения аутентификации - это docker login and docker logout.

36. Local Registry
На предыдущем занятии мы попрактиковались с удаленным Docker Registry, увидели как пушить туда свои собственные docker образы, предварительно добавив соответствующий tag. Потому что ключевой момент при работе с Docker Registry - это tag докер образов. И сейчас мы попробуем установить локально Docker Registry, чтобы продемонстрировать возможность работы c абсолютно любым registry.

37. Dockerfile. Best Practices
Мы уже много говорили про best practices на протяжении предыдущих видео этого курса, когда создавали свои собственные docker images. Теперь давайте остановимся и резюмируем все сказанное в одном видео, чтобы на следующем практическом занятии еще раз закрепить их у себя в памяти.

38. Практика
На текущем практическом занятии наша задача создать Dockerfile, в котором мы сможем установить необходимое программное обеспечение, скачать исходный код java приложение из GitHub, собрать его с помощью Gradle, запустить с помощью инструкций ENTRYPOINT и CMD, подключившись к предварительно запущенному контейнеру PostgreSQL базы данных, и открыть на локальной машине в браузере стартовую страницу приложения. Также в заключении поговорим о том, как мы могли бы улучшить уже написанный Dockerfile. Особенно важно - это то, что каждый проделанный шаг будет включать объяснение и использование best practices, которые мы уже знаем из предыдущих видео курса Docker.

39. Docker Compose
После предыдущего практического занятия мы увидели, как много различных команд нужно знать и выполнить для того, чтобы поддерживать работу между двумя взаимосвязанными контейнерами. А теперь давайте представим, что таких контейнеров будет 5 или 10! Сложность работы с ними возрастает даже не по линейной зависимости. Именно поэтому к нам на помощь приходит утилита Docker Compose, которая поможет упростить работу с контейнерами, заменив императивный подхода команды docker на декларативный - команды docker compose.

40. Docker Compose. Services. Part 1
41. Docker Compose. Services. Part 2
42. Docker Compose. Networks
43. Docker Compose. Volumes
44. Docker Compose. Secrets
45. Заключение. Путь развития
29.04.2024 - исправлены проблемы со звуком, добавлены уроки 38 и 39
Скриншоты:


Время раздачи: с 09.00 до 21.00 [GMT+2] (до появления первых 3-5 скачавших)
[NNMClub.to]_Docker (dmdev).torrent
 Торрент: Платиновая раздача  Зарегистрирован
 
Скачать


Примагнититься
 Зарегистрирован:   29 Апр 2024 07:32:41
 Размер:   1.1 GB  (
 Рейтинг:   4.9 (Голосов: 76)
 Поблагодарили:   303
 Проверка:   Оформление проверено модератором 29 Апр 2024 07:36:16
Отправить донат USDT TRC 20 - TKbPZHQPzxKJi2DJLkxEibAfveQgbSBejJ
Если Вы хотите поддержать торрент-трекер NNM-Club, то можете сделать это перейдя по ссылке.
Как cкачать  ·  Как раздать  ·  Правильно оформить  ·  Поднять ратио!  
charli-chaplin
Стаж: 12 лет 8 мес.
Сообщений: 99
Ratio: 2.457
100%
pirates.png
Программа курса
alexdao
Стаж: 8 лет 2 мес.
Сообщений: 39
Ratio: 20.195
0%
Откуда: Ванавара
russia.gif
В файле Docker.35. Push docker image.mp4 половина звука отсутствует.
nnmtrn
Стаж: 13 лет 9 мес.
Сообщений: 6
Ratio: 46.737
100%
Подтверждаю, во многих файлах отсутствует звук.
Irbis_
Стаж: 3 года 9 мес.
Сообщений: 75
Ratio: 7.332
3.19%
Скажу так, я не нашел ни одно не битого файла, в разных частях фалов есть проблемы со звуком

Если у автора раздачи есть возможность пофиксить и перезалить это было бы лучшее решение этой проблемы
baleiro
Стаж: 15 лет 6 мес.
Сообщений: 9
Ratio: 2.423
Поблагодарили: 8
3.04%
Нашел в Ютьюб
https://www.youtube.com/watch?v=RvprAOm0mwQ&list=PLnh8EajVFTl7oqQGrnobnlKghaUQ6IOva
Upd: доступен после подключения спонсорства
gravitonikus
Стаж: 9 лет
Сообщений: 2
Ratio: 1.941
0%
Доброго всем дня!

Вопрос к раздающему (создателю топика), есть ли возможность выложить все 45 видео блоков с нормальным звуком (именно 45, а не 37), как я понял во многих видео блоках звуковая дорожка чиста с половины файла, т.е. звука вообще нет, судя по программе видеомонтажа.

Заранее спасибо.
Всех Благ!
Nord Freeman ®
RG Книги
Куратор Книг
Стаж: 12 лет 7 мес.
Сообщений: 6459
Ratio: 6943.98
Раздал: 133.8 TB
Поблагодарили: 620070
100%
Откуда: The Pirate Bay
witch.png
29.04.2024 - исправлены проблемы со звуком, добавлены уроки 38 и 39
aot2003
Стаж: 9 лет
Сообщений: 28
Ratio: 3.961
66.58%
Nord Freeman писал(а): Перейти к сообщению
29.04.2024 - исправлены проблемы со звуком, добавлены уроки 38 и 39

Урок №9, с 06:13 и до конца. Нет звука...
nickname2017
Стаж: 7 лет 11 мес.
Сообщений: 6
Ratio: 5.496
0.03%
aot2003 писал(а): Перейти к сообщению
Nord Freeman писал(а): Перейти к сообщению
29.04.2024 - исправлены проблемы со звуком, добавлены уроки 38 и 39

Урок №9, с 06:13 и до конца. Нет звука...


Вроде есть звук
dauster
Стаж: 1 год 11 мес.
Сообщений: 37
Ratio: 17.609
0%
Проверил на 9 уроке - также звука нет после 6:13.
zapzapravka
Стаж: 13 лет
Сообщений: 129
Ratio: 14.201
100%
kazakhstan.gif
Кто-то может подсказать, сейчас исправлены все ошибки со звуком или нет еще?
ganduraso
Стаж: 9 лет 2 мес.
Сообщений: 81
Ratio: 2.361
1.26%
zapzapravka писал(а): Перейти к сообщению
Кто-то может подсказать, сейчас исправлены все ошибки со звуком или нет еще?

Звук есть во всех видео, кроме как писали тут "Урок №9, с 06:13 и до конца. Нет звука..." это да на момент 15.05.2024 звука нет, все остольные видео со звуком, в целом в 9 видео звука нет под конец, можно сказать не критично для курса.

А вообще вот видео на ютубе можно взять подписку и поддержать автора:
https://www.youtube.com/playlist?list=PLnh8EajVFTl7oqQGrnobnlKghaUQ6IOva
gravitonikus
Стаж: 9 лет
Сообщений: 2
Ratio: 1.941
0%
Мастера, мастера!!!!
Выложите остальное!!!!
androsor
Стаж: 2 года 2 мес.
Сообщений: 1
Ratio: 1.15
2.94%
Уважаемый!
Запили, пожалуйста, оставшиеся уроки!
Показать сообщения:   
Начать новую тему   Ответить на тему    Торрент-трекер NNM-Club -> Обучающие видеоматериалы -> IT, Компьютерные видеокурсы Часовой пояс: GMT + 3
Страницы:  1, 2  След.
Страница 1 из 2