Файл: Отчет по практической работе 3 по дисциплине Технологии разработки программных приложений.docx
Добавлен: 09.11.2023
Просмотров: 175
Скачиваний: 16
| | | |
| МИНОБРНАУКИ РОССИИ | ||
| Федеральное государственное бюджетное образовательное учреждение высшего образования «МИРЭА – Российский технологический университет» РТУ МИРЭА | ||
| Выполнил: Студент группы ИНБО-10-21 | Дубровский В.Ф. |
| Проверил: | кандидат технических наук, доцент Жматов Д.В. |
, будет разный hostname. Так происходит, потому что из одного образа ubuntu были запущены два изолированных контейнера, поэтому у них и был разный hostname.
Заново выполните docker ps -a — там должны появиться запущенные ранее контейнеры.
Запуск контейнеров производится командой:
docker run --флаги --докера имя_контейнера команда для запуска -и --флаги --запуска --программы.
Запустите bash в контейнере: docker run ubuntu bash. Ничего не произошло. Это не баг. Интерак- тивные оболочки выйдут после выполнения любых скриптовых команд, если только они не будут
запущены в интерактивном терминале — поэтому для того, чтобы этот пример не завершился, вам нужно добавить флаги -i -t или сгруппированно -it: docker run -it ubuntu bash.
Выполняя запуск контейнера, указывая образ ubuntu, неявно указывался образ ubuntu:latest. Сле- довательно, следующие команды равнозначны:
• docker run ubuntu hostname
• docker run ubuntu:latest hostname
Если бы мы хотели запустить ubuntu:12.04, то нужно было бы выполнить команду docker run ubuntu:12.04 hostname
3 Работа с портами
Для начала, загрузите образ python командой docker pull python.
В качестве примера, запустите встроенный в Python модуль веб-сервера из корня контейнера, чтобы
отобразить содержание контейнера. docker run -it python python -m http.server
При запуске пишется, что сервер доступен по адресу http://0.0.0.0:8000/. Однако, если открыть этот адрес, то ничего не будет видно, потому что порты не проброшены. Завершите работу веб-сервера, нажав комбинацию клавиш Ctrl+C.
Для проброса портов используется флаг -p hostPort:containerPort
Добавьте его, чтобы пробросить порт 8000:
docker run -it -p8000:8000 python python -m http.server — теперь по адресу http://0.0.0.0: 8000/ (если не открывается на Windows, то вместо 0.0.0.0 нужно указать localhost) открывается содержимое корневой директории в контейнере.
Для того, чтобы доступный в контейнере на порту 8000 веб-сайт в хостовой системе открывался на порту 8888, необходимо указать флаг -p 8888:8000:
docker run -it -p8888:8000 python python -m http.server.
Завершите работу веб-сервера, нажав комбинацию клавиш Ctrl+C.
2
4 Именованные контейнеры, остановка и удаление
Запуститеконтейнер:docker run -it -p8000:8000 python python -m http.server.НажмитеCtrl+C
— выполнение завершится. Для того, чтобы запустить контейнер в фоне, нужно добавить флаг -d/--detach. Также определим имя контейнеру, добавив флаг --name.
docker run -p8000:8000 --name pyserver -d python python -m http.server
Убедитесь, что контейнер всё ещё запущен: docker ps | grep pyserver — вывод команды не должен
быть пустым. Для просмотра логов контейнера, воспользуйтесь командой docker logs pyserver. Для того, чтобы остановить выполнение контейнера, существует команда docker stop pyserver. Од- нако, если снова попробовать запустить командойdocker run -it -p8000:8000 --name pyserver -d python python -m http.server,товозникнетошиб- ка: контейнер с таким именем существует. Его нужно удалить docker rm pyserver. Для остановки и удаления контейнера можно воспользоваться командой docker rm -f pyserver вме- сто выполнения двух отдельных команд stop и rm. После удаления контейнер с таким именем можно будет создать заново. Для того, чтобы контейнер удалялся после завершения работы, нужно указать флаг --rm при его запуске — далее в работе мы будем использовать данный флаг:docker run --rm -p8000:8000 --name pyserver -d python python -m http.server 5 Постоянное хранение данных Запустите контейнер, в котором веб-сервер будет отдавать содержимое директории /mnt:docker run -p8000:8000 --name pyserver --rm -d python python -m http.server -d /mnt,где -d /mnt указывает модулю http.server какая директория будет корневой для отображения. Вопрос: Что значат остальные флаги запуска? Где здесь команда, которая выполнится в контейне- ре? Длятого,чтобыпопастьвужезапущенныйконтейнер,существуеткомандаdocker exec -it pyserver bash — вы попадёте в оболочку bash в контейнере. Попав в контейнер, выполните командуcd mnt && echo "hello world" > hi.txt, а затем выйдите из контейнера, введя команду exit или нажав комбинацию клавиш Ctrl+D. Если открыть http://0.0.0.0:8000/, там будет доступен файл hi.txt. Остановим контейнер: docker stop pyserver, а затем снова запустим: docker run -p8000:8000 --name pyserver --rm -d python python -m http.server -d /mnt.Как мы видим, файл hi.txt пропал — это неудивительно, ведь мы запустили другой контейнер, а ста- рый был удалён после завершения работы (флаг --rm). Остановим контейнер: docker stop pyserver. Для того, чтобы не терялись какие-то данные (например, если запущен контейнер с СУБД, то чтобы не терялись данные из неё) существует механизм монтирования. 3 5.1 Тома Первый способ — это создать отдельный том с помощью ключа -v myvolume:/mnt, где myvolume — название тома, /mnt — директория в контейнере, где будут доступны данные. Попробуйте снова создать контейнер, но уже с примонтированным томом: docker run -p8000:8000 --rm --name pyserver -d \-v $(pwd)/myfiles:/mnt python python -m http.server -d /mnt Затем, если создать файл (выполнить docker exec -it pyserver bash и внутри контейнера выпол- нить cd mnt && echo "hello world" > hi.txt), то даже после удаления контейнера данные в этом томе будут сохранены. Чтобы узнать где хранятся данные, выполните команду
docker inspect -f "{{json .Mounts }}" pyserver, в поле Source будет храниться путь до тома на хостовой машине. Для управления томами существует команда docker volume, ознакомиться с которой предлагается самостоятельно. 5.2 Монтирование директорий и файлов Сперва, остановите контейнер, созданный на предыдущем шаге: docker stop pyserver.Иногда требуется пробросить в контейнер конфигурационный файл или отдельную директорию. Для этого используется монтирование директорий и файлов.Создадим директорию и файлы, которые будем монтировать. Часть из них нам понадобится дальше: создайте директорию: mkdir myfiles, в ней создайте файл host.txt: touch myfiles/host.txt Запустте контейнер: docker run -p8000:8000 --rm --name pyserver -d -v $(pwd)/myfiles:/mnt python \python -m http.server -d /mntКоманда pwd — выведет текущую директорию, например: /home/user/dome-directory, в итоге полу- чился абсолютный путь до файла: /home/user/dome-directory/myfiles.Обратный слеш (\) перед переводом строки экранирует символ перевода строки и позволяет написать одну команду в несколько строк. Затем, зайдите в контейнер: docker exec -it pyserver bash, перейдите в директорию /mnt командой cd /mnt. Если вывести список файлов командой ls, то там будет файл host.txt, примонтированный вместе с директорией myfiles Создайте файл echo "hello world" > hi.txt, а затем выйдите из контейнера: exit. Теперь на хосто- вой машине в директории myfiles/ появится файл hi.txt. Проверить можно командой ls myfiles. Остановите контейнер: docker stop pyserver.Для того, чтобы примонтировать один файл, нужно указать ключ -v, например: 4 -v $(pwd)/myfiles/host.txt:/mnt/new-name-of-host.txt – файлу в контейнере присвоится другое имя: new-name-of-host.txt. Если на Windows возникают ошибки при монтировании, убедитесь, что вы используете bash , а не cmd.exe. 6 Переменные окружения Для передачи переменных окружения внутрь контейнера используется ключ -e. Например, чтобы передать в контейнер переменную окружения MIREA во значением «ONE LOVE», нужно добавить ключ -e MIREA="ONE LOVE". Проверьте, выведя все переменные окружения, определённые в контейнере с помощью утилиты env: docker run -it --rm -e MIREA="ONE LOVE" ubuntu env. Среди списка переменных будет и MIREA 7 Dockerfile Соберите образ, в который будут установлены дополнительные пакеты, примонтируйте директорию и установите команду запуска. Для этого создаётся файл Dockerfile (без расширения).
-
1 FROM -
2 RUN
-
6 RUN -
7 ADD -
8 EXPOSE 80 -
9 CMD ["python", "-m", "http.server", "-d", "/mnt/", "80"]