Гибридный гипервизор состоит из двух частей: из тонкого гипервизора, контролирующего процессор и память, а также специальной служебной ОС, работающей под его управлением в кольце пониженного уровня. Через служебную ОС гостевые ОС получают доступ к физическому оборудованию.
Гибридный гипервизор состоит из двух частей: из тонкого гипервизора, контролирующего процессор и память, а также специальной служебной ОС, работающей под его управлением в кольце пониженного уровня. Через служебную ОС гостевые ОС получают доступ к физическому оборудованию.
Примеры: Microsoft Virtual Server[en], Sun Logical Domains, Xen, Citrix XenServer, Microsoft Hyper-V, VMware Workstation, OVirt.
Примеры: Microsoft Virtual Server, Sun Logical Domains, Xen, Citrix XenServer, Microsoft Hyper-V, VMware Workstation, OVirt.
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
```
Проверьте, что в файле `/etc/apt/sources.list.d/docker.list` строка репозитория правильная
```
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable
```
Установите Docker
Установите Docker
```
```
sudo apt-get update
sudo apt-get update
@ -44,7 +49,7 @@ $ docker pull busybox
**Внимание.** В зависимости от того, как вы установили Docker, вы можете увидеть сообщение permission denied (доступ запрещён) в ответ на вызов выше приведённой команды. Если вы на Mac, убедитесь, что Docker движок запущен. Если на Линукс, вам может потребоваться повысить права доступа с помощью команды `sudo`. В качестве альтернативного варианта вы можете добавить пользователя в Docker группу для решения этой проблемы.
**Внимание.** В зависимости от того, как вы установили Docker, вы можете увидеть сообщение permission denied (доступ запрещён) в ответ на вызов выше приведённой команды. Если вы на Mac, убедитесь, что Docker движок запущен. Если на Линукс, вам может потребоваться повысить права доступа с помощью команды `sudo`. В качестве альтернативного варианта вы можете добавить пользователя в Docker группу для решения этой проблемы.
Команда `pull` скачивает образ `busybox` из Docker реестра и сохраняет его в систему. Вы можете использовать команду docker images для вывода в консоль списка образов находящихся в вашей системе.
Команда `pull` скачивает образ `busybox` из Docker реестра и сохраняет его в систему. Вы можете использовать команду `docker images` для вывода в консоль списка образов находящихся в вашей системе.
```
```
# docker images
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
REPOSITORY TAG IMAGE ID CREATED SIZE
@ -55,7 +60,7 @@ hello-world latest 48b5124b2768 2 months ago
### 1.1 Запуск Docker
### 1.1 Запуск Docker
Великолепно! Теперь перейдём к запуску контейнера на основе этого образа. Для этого мы воспользуемся всемогущей командой docker run.
Великолепно! Теперь перейдём к запуску контейнера на основе этого образа. Для этого мы воспользуемся всемогущей командой `docker run`.
Давайте начнем с малого. Вначале рассмотрим самый простой статический веб-сайт на nginx. Скачаем образ из Docker Hub, запустим контейнер и посмотрим, насколько легко будет запустить веб-сервер.
Давайте начнем с малого. Вначале рассмотрим самый простой статический веб-сайт на nginx. Скачаем образ из Docker Hub, запустим контейнер и посмотрим, насколько легко будет запустить веб-сервер.
Поехали. Для одностраничного сайта нам понадобится заранее созданный образ и размещённый в реестре - nginx:latest. Можно запустить образ напрямую командой `docker run`.
Поехали. Для одностраничного сайта нам понадобится заранее созданный образ и размещённый в реестре - `nginx:latest`. Можно запустить образ напрямую командой `docker run`.
```
```
$ docker run nginx:latest
$ docker run nginx:latest
```
```
@ -269,11 +274,11 @@ EXPOSE 5000
CMD ["python", "./app.py"]
CMD ["python", "./app.py"]
```
```
Теперь можно создать образ. Команда `docker build` занимается сложной задачей создания образа на основе Dockerfile.
Теперь можно создать образ. Команда `docker build` занимается сложной задачей создания образа на основе `Dockerfile`.
Листинг ниже демонстрирует процесс. Перед тем, как запустите команду сами (не забудьте точку в конце), проверьте, чтобы там был ваш username. Username должен соответствовать тому, что использовался при регистрации на Docker hub. Если вы еще не регистрировались, то сделайте это до выполнения команды.
Листинг ниже демонстрирует процесс. Перед тем, как запустите команду сами (не забудьте точку в конце), проверьте, чтобы там был ваш username. Username должен соответствовать тому, что использовался при регистрации на Docker hub. Если вы еще не регистрировались, то сделайте это до выполнения команды.
Команда `docker build` довольно проста: она принимает опциональный тег с флагом `-t имя_пользователя/имя_образа` и путь до директории, в которой лежит Dockerfile.
Команда `docker build` довольно проста: она принимает опциональный тег с флагом `-t имя_пользователя/имя_образа` и путь до директории, в которой лежит `Dockerfile`.
```
```
$ docker build -t имя_пользователя/имя_образа ./
$ docker build -t имя_пользователя/имя_образа ./
Sending build context to Docker daemon 8.704 kB
Sending build context to Docker daemon 8.704 kB
@ -447,7 +452,11 @@ c31bf3beb299 elasticsearch "/docker-entrypoin..." 2 hours ago
Итак, у нас есть контейнер ES по любому локальному адресу (0.0.0.0) и порту 9200, и мы можем напрямую обращаться к нему. Если можно было бы сообщить нашему приложению подключаться к этому адресу, то оно сможет общаться с ES, верно? Давайте взглянем на код на Питоне, туда, где описано подключение.
Итак, у нас есть контейнер ES по любому локальному адресу (0.0.0.0) и порту 9200, и мы можем напрямую обращаться к нему. Если можно было бы сообщить нашему приложению подключаться к этому адресу, то оно сможет общаться с ES, верно? Давайте взглянем на код на Питоне, туда, где описано подключение.
```
```
es = Elasticsearch(host='es')
es = Elasticsearch(
f"{es_scheme}://{es_host}:{es_port}",
basic_auth=(es_user, es_password),
verify_certs=False
)
```
```
Для того, чтобы это заработало, нужно запустить Flask контейнер на том же хосте, что и контейнер ES, и всё заработает, да? К сожалению, нет, потому что контейнер ES доступен по адресу хост-машины только с хост-машины. Другой контейнер не сможет обратиться по этому адресу. Ладно, если не этот адрес, то какой тогда адрес нужно использовать для работы с контейнером ES? Рады, что вы спросили.
Для того, чтобы это заработало, нужно запустить Flask контейнер на том же хосте, что и контейнер ES, и всё заработает, да? К сожалению, нет, потому что контейнер ES доступен по адресу хост-машины только с хост-машины. Другой контейнер не сможет обратиться по этому адресу. Ладно, если не этот адрес, то какой тогда адрес нужно использовать для работы с контейнером ES? Рады, что вы спросили.