Начало работы. Запуск первого контейнера Windows
В этой статье объясняется, как запустить первый контейнер Windows после настройки среды, описанной в статье Начало работы. Подготовка Windows для контейнеров. Чтобы запустить контейнер, сначала скачайте (в контейнерах, которые также называются операцией извлечения) базовый образ, который предоставляет базовый уровень служб операционной системы для контейнера. Затем создается и запускается образ контейнера, который основан на базовом образе. Дополнительные сведения см. далее в этой статье.
Извлечение базового образа контейнера
Все контейнеры создаются из образов контейнеров. Корпорация Майкрософт предоставляет для начала работы несколько образов, называемых базовыми образами (дополнительные сведения см. в статье о базовых образах контейнеров). Эти процедуры позволяют получить (скачать и установить) базовый образ Nano Server.
-
Откройте окно командной строки (например, встроенную командную строку, PowerShell или терминал Windows), а затем выполните следующую команду, чтобы скачать и установить базовый образ:
docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022
Если Docker не удается запуститься при попытке извлечь образ, управляющая программа Docker может быть недоступна. Чтобы устранить данную неполадку, попытайтесь перезапустить службу Docker.
Совет Если вы увидите сообщение об ошибке с текстом no matching manifest for linux/amd64 in the manifest list entries , убедитесь, что в Docker не настроен запуск контейнеров Linux. Чтобы переключиться на контейнеры Windows в Docker, щелкните значок Docker правой кнопкой мыши и выберите Переключиться на контейнеры Windows. Чтобы использовать командную строку для переключения между контейнерами, выполните команду & $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .
REPOSITORY TAG IMAGE ID CREATED SIZE microsoft/nanoserver latest 105d76d0f40e 4 days ago 652 MB
Выполнение контейнера Windows
В этом простом примере будет создан и развернут образ контейнера «Hello World». Для вашего удобства лучше выполнять эти команды в окне командной строки с повышенными привилегиями. Не используйте интегрированную среду сценариев Windows PowerShell, так как она не работает для интерактивных сеансов с контейнерами и в результате контейнеры перестают отвечать на запросы.
-
Запустите контейнер с интерактивным сеансом из образа nanoserver . Для этого введите следующую команду в окне командной строки:
docker run -it mcr.microsoft.com/windows/nanoserver:ltsc2022 cmd.exe
echo "Hello World!" > Hello.txt exit
docker ps -a
docker commit helloworld
После завершения вы получите пользовательский образ, содержащий скрипт «Привет мир». Это можно проверить с помощью команды docker images.
docker images
Ниже приведен пример выходных данных.
REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest a1064f2ec798 10 seconds ago 258MB mcr.microsoft.com/windows/nanoserver 2022 2b9c381d0911 3 weeks ago 256MB
docker run --rm helloworld cmd.exe /s /c type Hello.txt
Запуск контейнера Windows с помощью Windows Admin Center
Вы можете использовать Windows Admin Center для локального запуска контейнеров. А именно, вы можете использовать расширение «Контейнеры» своего экземпляра Windows Admin Center для запуска контейнеров. Сначала откройте узел контейнеров, которым требуется управлять, а затем в области «Сервис» выберите расширение Контейнеры. Затем откройте вкладку Образы в расширении «Контейнеры» в разделе Узел контейнеров.

Если базовый образ контейнера отсутствует для узла, выберите вариант Извлечь, чтобы открыть параметры Извлечение образа контейнера:

В разделе Извлечение образа контейнера укажите URL-адрес и тег образа. Если вы не уверены, какой образ нужно извлечь, ознакомьтесь со списком популярных образов от Майкрософт, предоставляемых в Windows Admin Center. Вы также можете указать учетные данные для извлечения образа из частного репозитория. Внеся необходимые сведения, щелкните Извлечь. Windows Admin Center запустит процесс извлечения на узле контейнеров. После завершения скачивания вы увидите новый образ на вкладке Образы.
Выберите образ для запуска и щелкните Запустить.

В меню Запуск настройте конфигурацию для контейнера, например имя контейнера, тип изоляции, порты для публикации, а также выделение памяти и ЦП. Кроме того, вы можете добавить команды запуска Docker, которые недоступны в пользовательском интерфейсе, такие как -v для постоянного тома. Дополнительные сведения о доступных параметрах запуска Docker см. в документации.
Завершив настройку контейнера, щелкните Запустить. Состояние выполняющихся контейнеров можно просмотреть на вкладке Контейнеры:
Запуск — Docker: Основы
Знакомство с Docker лучше всего начать с примеров запуска, которые постепенно будут детализироваться и раскрываться. Начнем с самого простого варианта, запустим с его помощью bash .
# -it означает, что мы запускаемся в интерактивном режиме # это нужно для программ, которые ожидают пользовательский ввод # к таким относится bash docker run -it nginx bash Unable to find image 'nginx:latest' locally 08bc36ad5247: Download complete 1bb5c4b86cb7: Download complete 021283c8eb95: Download complete 91bb7937700d: Download complete 76579e9ed380: Download complete f46d7b05649a: Download complete 103501419a0a: Download complete cf707e233955: Download complete faef57eae888: Download complete 4b962717ba55: Download complete root@a59191412f5c:/#
Этой командой мы говорим запусти bash внутри контейнера используя образ nginx. Что это значит?
- Образ (Image) — это слепок файловой системы, в который «упаковано» что-то, ради чего мы используем Docker — например, PostgreSQL, Nginx или, даже, разрабатываемое нами приложение. В примере выше, мы используем готовый образ с названием nginx , поэтому Docker «знает» про его существование. Сам образ взят просто для примера, в течении курса мы будем использовать разные образы, как готовые, так и созданные нами.
- Контейнер (Container), упрощенно, это процесс операционной системы, подключенный к образу, то есть его файловой системе. Кроме того, контейнер изолирован от внешней среды и живет в своем окружении. В этом смысле, он похож на обычную виртуальную машину, но в отличии от неё гораздо более легковесный и зависимый от основной операционной системы.
При первом вызове данная команда начнет скачивать образ nginx, поэтому придется немного подождать. Когда образ скачается, запустится bash, и вы окажетесь внутри контейнера под суперпользователем (root).
С этого момента вы можете взаимодействовать с содержимым контейнером, так как будто вы работаете в обычном терминале. Технически это обеспечивается комбинацией флагов -it , которые нужны в случае работы с интерактивными приложениями, такими как bash .
pwd / root@a59191412f5c:/# cd /root/ root@a59191412f5c:~# ls -la total 16 drwx------ 2 root root 4096 Jul 3 00:00 . drwxr-xr-x 1 root root 4096 Jul 7 20:35 .. -rw-r--r-- 1 root root 571 Apr 10 2021 .bashrc -rw-r--r-- 1 root root 161 Jul 9 2019 .profile root@a59191412f5c:/# ls -la /home/ total 8 drwxr-xr-x 2 root root 4096 Mar 2 13:55 . drwxr-xr-x 1 root root 4096 Jul 7 20:39 ..
Побродите по файловой системе, посмотрите содержимое директории /home . Как видите, её содержимое не совпадает с тем, что находится у вас на компьютере.
Эта файловая система появилась из образа nginx. Всё, что вы сделаете здесь, никак не затронет вашу основную файловую систему, то есть можно смело удалять любые файлы внутри. После экспериментов не забудьте выйти командой exit , либо сочетанием клавиш Ctrl + D , либо просто закройте вкладку терминала.
exit exit
Теперь посмотрим вариант вызова команды cat , выполненной уже в другом контейнере, но тоже запущенном из образа nginx:
# Общая структура команды # docker run docker run nginx cat /etc/nginx/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; .
Команда выполняется практически мгновенно, так как образ уже загружен. В отличие от предыдущего старта, где запускается баш и начинается интерактивная сессия внутри контейнера, запуск команды cat /etc/nginx/nginx.conf для образа nginx выведет на экран содержимое указанного файла (взяв его из файловой системы запущенного контейнера) и вернет управление в то место, где вы были. Вы не окажетесь внутри контейнера, после завершения команды.
Последний вариант запуска будет таким: docker run -p 8080:80 nginx . Этот запуск отличается тем, что после имени образа не указана никакая команда. Такой подход работает в случае, если команда на запуск прописана в самом образе и Docker подставляет ее во время старта если не указана конкретная команда. В каких случаях так делают? Почти всегда, когда образ строится вокруг конкретной программы, у которой есть стандартный способ запуска, как у веб-серверов, баз данных и так далее. А вот для образа ubuntu, в который упакована только операционная система, такой команды нет, так как тут она не имеет смысла.
# -p — проброс портов, расскажем о нем в следующих уроках docker run -p 8080:80 nginx /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2023/07/07 20:43:10 [notice] 1#1: using the "epoll" event method 2023/07/07 20:43:10 [notice] 1#1: nginx/1.25.1 2023/07/07 20:43:10 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 2023/07/07 20:43:10 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr 2023/07/07 20:43:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2023/07/07 20:43:10 [notice] 1#1: start worker processes 2023/07/07 20:43:10 [notice] 1#1: start worker process 29 2023/07/07 20:43:10 [notice] 1#1: start worker process 30 2023/07/07 20:43:10 [notice] 1#1: start worker process 31 2023/07/07 20:43:10 [notice] 1#1: start worker process 32
Данная команда не возвращает управление терминалу, потому что стартует nginx. Ввод оказывается заблокированным, а на экране выводится процесс запуска Nginx. Откройте браузер и наберите localhost:8080 . Вы увидите как загрузилась страница Welcome to nginx!. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к localhost:8080 . Остановить nginx можно комбинацией Ctrl + C .
[notice] 1#1: signal 2 (SIGINT) received, exiting 2023/07/07 20:43:58 [notice] 30#30: exiting 2023/07/07 20:43:58 [notice] 29#29: exiting 2023/07/07 20:43:58 [notice] 31#31: exiting 2023/07/07 20:43:58 [notice] 30#30: exit 2023/07/07 20:43:58 [notice] 29#29: exit 2023/07/07 20:43:58 [notice] 31#31: exit 2023/07/07 20:43:58 [notice] 32#32: exiting 2023/07/07 20:43:58 [notice] 32#32: exit 2023/07/07 20:43:58 [notice] 1#1: signal 17 (SIGCHLD) received from 31 2023/07/07 20:43:58 [notice] 1#1: worker process 29 exited with code 0 2023/07/07 20:43:58 [notice] 1#1: worker process 30 exited with code 0 2023/07/07 20:43:58 [notice] 1#1: worker process 31 exited with code 0 2023/07/07 20:43:58 [notice] 1#1: signal 29 (SIGIO) received 2023/07/07 20:43:58 [notice] 1#1: signal 17 (SIGCHLD) received from 32 2023/07/07 20:43:58 [notice] 1#1: worker process 32 exited with code 0 2023/07/07 20:43:58 [notice] 1#1: exit
Несмотря на то, что все запуски выполнялись по-разному и приводили к разным результатам, общая схема их работы одна. Docker при необходимости автоматически скачивает образ (первый аргумент после docker run ) и на основе него стартует контейнер с указанной командой.
Попробуйте выполнить команду docker run -it ubuntu bash и наберите ps auxf внутри запущенного контейнера. Вывод будет таким:
Как видно, процесса всего два, и у Bash PID равен 1. Из этого можно сделать несколько выводов:
Как создать и запустить Docker контейнер из образа.

Предположим, что вы нашли в Docker репозитории какой-то образ. Первый вопрос, который возникает, как создать и запустить Docker контейнер из этого образа?
В этой статье я хотел бы обзорно рассмотреть этот вопрос и дать несколько рекомендаций, где можно найти более подробную информацию. Дело в том, что процесс создания Docker контейнера из образа имеет очень много особенностей.
Если вы только начинаете знакомиться с докер, рекомендую посмотреть мой курс «Основы Docker для веб-программистов.»
Там есть объяснение многих базовых понятий, которые нужно знать прежде чем приступать работать с Docker.
Существует несколько способов создания контейнера. Чтобы во всем этом разобраться, нам нужно понять как происходит весь процесс.

Для того, чтобы запустить какой-либо контейнер, мы должны сначала скачать его образ с репозитория Docker на свой локальный компьютер и затем уже происходит процесс запуска.
Здесь нужно учитывать такой момент, что не все образы после их запуска оставляют после себя запущенный в системе контейнер. Некоторые запускаются, выполняют какую-то работу и закрываются.
Например, так происходит с образом hello-world.
Когда мы выполним команду
docker run hello-world
Эта команда автоматически скачает образ из репозитория Docker на ваш локальный компьютер (вручную скачать его можно с помощью docker pull hello-world) и запустит его в контейнере и автоматически закроет и удалит этот контейнер.
Пожалуй, команда «docker run имя_образа» является одним из самых простых способов как можно создать и запустить контейнер Docker на вашем компьютере.
В зависимости от образа, с которым мы работаем, в этой команде можно указывать дополнительные аргументы и настройки, которые позволят запустить Docker контейнер каким-то определенным способом с какими-то определенными настройками.
Например, чтобы запустить контейнер базы данных mysql мы можем воспользоваться командой.
docker run --name ms -p 3307:3306 -e MYSQL_ROOT_PASSWORD=12345 mysql
Это команда скачает образ mysql на наш локальный компьютер, присвоит имя для нового создаваемого контейнера как «ms», назначит порт 3307 на нашем локальном компьютере для работы сервера баз данных, назначит пароль 12345 для пользователя root.
О том, какие аргументы мы можем передавать в команду docker run можно почитать в документации того образа, с которым вы работаете.
После выполнения этой команды вы должны увидеть созданный и запущенный контейнер, который будет работать в вашей операционной системе.

Альтернативой команде docker run является специальный инструмент для Docker, который называется Docker Compose. По сути, это отдельная утилита для докер, которая позволяет собирать контейнера сразу из множества образов и настраивать взаимодействие между ними.
Например, для того, чтобы создать и запустить контейнер Docker с образом языка программирования php и веб-сервером apache, нужно создать специальный файл, который будет называться docker-composer.yaml в нашем проекте. Подробнее об этом файле вы можете посмотреть в этом моем курсе.
И добавить в этот файл следующее содержимое:
version: "3" services: myproject: image: php:7.4-apache volumes: - D:\Sites\tmp6:/var/www/html ports: - "8080:80"
Теперь нужно дать команду утилите docker compose, чтобы она создала и запустила на основе этого образа новый контейнер. Сделать это можно с помощью команды
docker-compose up --build
Это основные способы, как можно создать и запустить Docker контейнер. Конечно, здесь есть много моментов и тонкостей, с которыми нужно разбираться отдельно. Но, надеюсь, что общий смысл для вас стал понятен и изучая дополнительные материалы вы сможете разобраться в своей конкретной ситуации.
Чтобы оставить сообщение, зарегистрируйтесь/войдите на сайт через:
Как запустить контейнер в Docker
Контейнер Docker — легковесная и изолированная среда, которая содержит все необходимое для запуска приложения, включая код, зависимости, библиотеки и настройки. Он использует контейнеризацию для упаковки и доставки приложений с помощью стандартизированных процессов.
Что такое контейнеры в Docker?
Работают они на основе Docker-образов, которые содержат все компоненты приложения и его зависимости. Образы создаются на основе файлов Dockerfile, которые содержат инструкции для сборки образа. Когда образ создан, он может быть запущен в виде контейнера.
Контейнеры Docker обеспечивают изоляцию приложений друг от друга и от хостовой системы. Они используют ядро операционной системы хоста, но имеют свое собственное окружение, включая файловую систему, переменные окружения, сетевые интерфейсы и процессы. Это позволяет им работать независимо от других контейнеров и обеспечивает повторяемость и надежность запуска приложений в различных средах.
Также обладают масштабируемостью и портативностью. Они могут быть легко перенесены с одной системы на другую без изменения кода или настроек. Контейнеры Docker также интегрируются с оркестраторами, такими как Docker Swarm или Kubernetes, для управления и развертывания контейнеризованных приложений в кластерной среде.
Как запустить контейнеры?
Для запуска контейнера в Docker вам понадобится выполнить следующие шаги:
1. Установите Docker на свою машину, если вы еще не сделали этого. Вы можете найти инструкции по установке Docker на официальном сайте Docker:
2. Подготовьте файл Dockerfile, который определяет настройки и инструкции для создания контейнера. Dockerfile — это текстовый файл, обычно без расширения, который содержит команды для сборки образа контейнера. Пример простого Dockerfile может выглядеть так:
Используем базовый образ