Поиск…


Синтаксис

  • docker run [ОПЦИИ] ИЗОБРАЖЕНИЕ [КОМАНДА] [ARG ...]

Запуск контейнера

docker run hello-world

Это позволит получить последнее изображение приветствия из Docker Hub (если у вас его еще нет), создать новый контейнер и запустить его. Вы должны увидеть сообщение о том, что ваша установка работает правильно.

Выполнение другой команды в контейнере

docker run docker/whalesay cowsay 'Hello, StackExchange!'

Эта команда сообщает Docker о создании контейнера из образа docker/whalesay и запускает команду cowsay 'Hello, StackExchange!' в этом. Он должен напечатать фотографию кита, говорящего « Hello, StackExchange! к вашему терминалу.

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

docker run docker/whalesay ls /

Если он был изменен во время сборки изображения, вам нужно отменить его обратно по умолчанию

docker run --entrypoint=/bin/bash docker/whalesay -c ls /

Автоматически удалять контейнер после его запуска

Обычно контейнер Docker сохраняется после его выхода. Это позволяет снова запустить контейнер, проверить его файловую систему и т. Д. Однако иногда вы хотите запустить контейнер и удалить его сразу же после его выхода. Например, чтобы выполнить команду или показать файл из файловой системы. Docker предоставляет --rm командной строки --rm для этой цели:

docker run --rm ubuntu cat /etc/hosts

Это создаст контейнер из образа «ubuntu», покажет содержимое файла / etc / hosts, а затем удалит контейнер сразу после его выхода. Это помогает предотвратить очистку контейнеров после того, как вы закончите экспериментировать.

Примечание. Флаг --rm не работает в сочетании с флагом -d ( --detach ) в докере <1.13.0.

Когда --rm флаг --rm , Docker также удаляет тома, связанные с контейнером, когда контейнер удален. Это похоже на запуск docker rm -v my-container . Удаляются только тома, которые указаны без имени .

Например, при docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs , объем /etc будет удален, но объем /var/log не будет. Объемы, унаследованные через --volumes-from, будут удалены с той же логикой - если исходный том был указан с именем, он не будет удален.

Указание имени

По умолчанию контейнерам, созданным с помощью docker run , присваивается случайное имя, например small_roentgen или modest_dubinsky . Эти имена не особенно полезны при определении цели контейнера. Можно указать имя для контейнера, передав параметр командной строки --name :

docker run --name my-ubuntu ubuntu:14.04

Имена должны быть уникальными; если вы передадите имя, которое уже использует другой контейнер, Docker напечатает ошибку и новый контейнер не будет создан.

Указание имени будет полезно при обращении к контейнеру в сети Docker. Это работает как для фоновых, так и для передних контейнеров Docker.

Контейнеры в сети моста по умолчанию должны быть связаны для связи по имени.

Связывание порта контейнера с хостом

docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp

Чтобы использовать порты на хосте, были выставлены в изображении (через директиву EXPOSE Dockerfile или --expose командной строки --expose для docker run ), эти порты должны быть привязаны к хосту с помощью команды -p или -P лайн. Использование -p требует -p конкретного порта (и дополнительного интерфейса хоста). Использование опции командной строки верхнего регистра -P заставит Docker связывать все открытые порты в изображении контейнера с хостом.

Политика перезагрузки контейнера (запуск контейнера при загрузке)

docker run --restart=always -d <container>

По умолчанию Docker не перезапускает контейнеры, когда демон Docker перезапускается, например, после перезагрузки системы хоста. Docker предоставляет политику перезагрузки для ваших контейнеров, предоставляя --restart командной строки --restart . Поставка --restart=always всегда вызывает перезапуск контейнера после перезапуска Docker-демона. Однако, когда этот контейнер вручную остановлен (например, с помощью docker stop <container> ), политика перезагрузки не будет применяться к контейнеру.

Можно указать несколько опций для опции --restart на основе требования ( --restart=[policy] ). Эти параметры влияют на то, как контейнер запускается при загрузке.

политика Результат
нет Значение по умолчанию . Не будет перезагружать контейнер автоматически, когда контейнер остановлен.
на провал [: макс-повторов] Перезагрузитесь, только если контейнер выходит с ошибкой ( non-zero exit status ). Чтобы не перезапускать его неограниченно (в случае какой-либо проблемы), можно ограничить количество повторных попыток повторения попыток демона Docker.
всегда Всегда перезапускайте контейнер независимо от состояния выхода. Когда вы укажете always , демон Docker попытается перезапустить контейнер на неопределенный срок. Контейнер также всегда запускается при запуске демона, независимо от текущего состояния контейнера.
если не-остановлен Всегда перезагружайте контейнер независимо от его статуса выхода, но не запускайте его при запуске демона, если контейнер ранее был остановлен.

Запуск контейнера в фоновом режиме

Чтобы контейнер работал в фоновом режиме, -d командной строки -d во время запуска контейнера:

docker run -d busybox top

Опция -d запускает контейнер в отдельном режиме. Это также эквивалентно -d=true .

Контейнер в отдельном режиме не может быть удален автоматически при его остановке, это означает, что нельзя использовать параметр -rm в сочетании с опцией -d.

Назначение тома контейнеру

Том Docker - это файл или каталог, который сохраняется за пределами срока действия контейнера. Можно монтировать файл или каталог хоста в контейнер в виде тома (в обход UnionFS).

Добавьте том с -v командной строки -v :

docker run -d -v "/data" awesome/app bootstrap.sh

Это создаст том и подключит его к пути /data внутри контейнера.

  • Примечание. Вы можете использовать флаг --rm для автоматического удаления тома при удалении контейнера.

Установка каталогов хоста

Чтобы монтировать файл или каталог хоста в контейнер:

docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
  • При указании каталога хоста должен быть указан абсолютный путь.

Это приведет к установке каталога хоста /home/foo/data в /data внутри контейнера. Этот том «bind-installed host directory» - это то же самое, что и Linux mount --bind и поэтому временно монтирует каталог хоста по указанному пути контейнера в течение всего срока службы контейнера. Изменения объема из хоста или контейнера немедленно отражаются в другом, поскольку они являются одним и тем же местом назначения на диске.

Пример UNIX: установка относительной папки

docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh

Объемы именования

Том может быть назван путем подачи строки вместо пути к каталогу хоста, докер будет создавать тома с использованием этого имени.

docker run -d -v "my-volume:/data" awesome/app bootstrap.sh

После создания именованного тома тома затем можно будет использовать совместно с другими контейнерами, используя это имя.

Настройка переменных среды

$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash

Оба -e и --env могут использоваться для определения переменных среды внутри контейнера. Можно указать множество переменных среды, используя текстовый файл:

$ docker run --env-file ./env.list ubuntu /bin/bash

Пример файла переменной окружения:

# This is a comment
TEST_HOST=10.10.0.127

Флаг --env-file принимает имя файла в качестве аргумента и ожидает, что каждая строка будет в формате VARIABLE=VALUE , имитируя аргумент, переданный в --env . Строки комментариев должны иметь только префикс # .

Независимо от порядка этих трех флагов сначала обрабатывается --env-file , а затем -e / --env flags. Таким образом, любые переменные среды, поставляемые отдельно с -e или --env будут переопределять переменные, --env-var текстовый файл --env-var .

Указание имени хоста

По умолчанию контейнерам, созданным при запуске docker, присваивается произвольное имя хоста. Вы можете предоставить контейнеру другое имя хоста, передав флаг -hostname:

docker run --hostname redbox -d ubuntu:14.04

Запуск контейнера в интерактивном режиме

Чтобы запустить контейнер в интерактивном режиме, перейдите в опции -it :

$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#

-i держит STDIN открытым, а -t выделяет псевдотематику.

Запуск контейнера с ограничениями памяти / свопа

Установите ограничение памяти и отключите ограничение подкачки

docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash

Установите как ограничение памяти, так и своп. В этом случае контейнер может использовать 300M памяти и 700M swap.

docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash

Получение оболочки в работающий (отсоединенный) контейнер

Вход в рабочий контейнер

Пользователь может ввести запущенный контейнер в новую интерактивную оболочку bash с командой exec .

Скажем, что контейнер называется jovial_morse тогда вы можете получить интерактивную оболочку bash pseudo-TTY, запустив:

docker exec -it jovial_morse bash

Вход в рабочий контейнер с конкретным пользователем

Если вы хотите ввести контейнер в качестве конкретного пользователя, вы можете установить его с параметром -u или --user . Имя пользователя должно существовать в контейнере.

-u, --user Имя пользователя или UID (формат: <name|uid>[:<group|gid>] )

Эта команда войдет в jovial_morse с пользователем dockeruser

docker exec -it -u dockeruser jovial_morse bash

Войдите в запущенный контейнер как root

Если вы хотите войти в систему под именем root, просто используйте параметр -u root . Корневой пользователь всегда существует.

docker exec -it -u root jovial_morse bash

Вход в изображение

Вы также можете войти в образ с помощью команды run , но для этого требуется имя изображения вместо имени контейнера.

docker run -it dockerimage bash

Вход в промежуточное изображение (отладка)

Вы также можете войти в промежуточное изображение, которое создается во время сборки Dockerfile.

Вывод docker build .

$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
 ---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
 ---> Running in 9c9e81692ae9
total 24
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 bin
drwxr-xr-x    5 root     root        4.0K Oct 19 00:19 dev
drwxr-xr-x    2 root     root        4.0K Oct 19 00:19 etc
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 lib
lrwxrwxrwx    1 root     root           3 Mar 12  2013 lib64 -> lib
dr-xr-xr-x  116 root     root           0 Nov 15 23:34 proc
lrwxrwxrwx    1 root     root           3 Mar 12  2013 sbin -> bin
dr-xr-xr-x   13 root     root           0 Nov 15 23:34 sys
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 tmp
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 usr
 ---> b35f4035db3f
Step 3 : CMD echo Hello world
 ---> Running in 02071fceb21b
 ---> f52f38b7823e

Обратите внимание, что ---> Running in 02071fceb21b выход, вы можете войти в эти изображения:

docker run -it 02071fceb21b bash

Передача stdin в контейнер

В таких случаях, как восстановление дампа базы данных или иное желание отправить некоторую информацию через канал с хоста, вы можете использовать флаг -i в качестве аргумента для docker run docker exec или docker exec .

Например, если вы хотите поставить контейнеризованному клиенту mariadb дамп базы данных, который у вас есть на хосте, в локальном файле dump.sql вы можете выполнить следующую команду:

docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql

В общем,

docker exec -i container command < file.stdin

Или же

docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF

Отсоединение от контейнера

При подключении к работающему контейнеру с назначенным pty ( docker run -it ... ), вы можете нажать Control P - Control Q, чтобы отсоединиться.

Переопределение директивы точки входа изображения

docker run --name="test-app" --entrypoint="/bin/bash" example-app

Эта команда будет переопределять директиву ENTRYPOINT образа example-app при создании test-app контейнера. Директива CMD изображения останется неизменной, если не указано иное:

docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh

В приведенном выше примере как ENTRYPOINT и CMD изображения были переопределены. Этот процесс контейнера становится /bin/bash /app/test.sh .

Добавить запись узла в контейнер

docker run --add-host="app-backend:10.15.1.24" awesome-app

Эта команда добавляет запись в файл /etc/hosts контейнера, который следует за форматом --add-host <name>:<address> . В этом примере имя app-backend будет 10.15.1.24 до 10.15.1.24 . Это особенно полезно для связывания разрозненных компонентов приложения вместе программным путем.

Запретить остановке контейнера, если команды не запущены

Контейнер остановится, если на переднем плане не выполняется команда. Использование опции -t предотвратит остановку контейнера даже при отсоединении с опцией -d .

docker run -t -d debian bash

Остановка контейнера

docker stop mynginx

Кроме того, идентификатор контейнера также можно использовать для остановки контейнера вместо его имени.

Это остановит запуск контейнера, посылая сигнал SIGTERM, а затем сигнал SIGKILL, если это необходимо.

Кроме того, команда kill может быть использована для немедленной отправки SIGKILL или любого другого заданного сигнала с использованием опции -s .

docker kill mynginx

Указанный сигнал:

docker kill -s SIGINT mynginx

Остановка контейнера не удаляет его. Используйте docker ps -a чтобы увидеть ваш остановленный контейнер.

Выполните еще одну команду в запущенном контейнере

При необходимости вы можете сообщить Docker о выполнении дополнительных команд в уже запущенном контейнере с помощью команды exec . Вам нужен идентификатор контейнера, который вы можете получить с помощью docker ps .

docker exec 294fbc4c24b3 echo "Hello World"

Вы можете приложить интерактивную оболочку, если вы используете опцию -it .

docker exec -it 294fbc4c24b3 bash

Запуск приложений GUI в контейнере Linux

По умолчанию контейнер Docker не сможет запускать приложение GUI.

До этого гнездо X11 должно быть отправлено первым в контейнер, поэтому его можно использовать напрямую. Переменная среды DISPLAY также должна быть переадресована:

docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>

Сначала это не сработает, поскольку мы не установили разрешения для хоста X-сервера:

cannot connect to X server unix:0

Самый быстрый (но не самый безопасный) способ - разрешить доступ напрямую:

xhost +local:root

После окончания работы с контейнером мы можем вернуться в исходное состояние с:

xhost -local:root

Другой (более безопасный) способ - подготовить Dockerfile, который будет создавать новое изображение, которое будет использовать наши учетные данные для доступа к X-серверу:

FROM <iamge-name>
MAINTAINER <you>

# Arguments picked from the command line!
ARG user
ARG uid
ARG gid

#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
        echo "$USERNAME:$USERNAME" | chpasswd && \
        usermod --shell /bin/bash $USERNAME && \
        usermod  --uid ${uid} $USERNAME && \
        groupmod --gid ${gid} $USERNAME

USER ${user}

WORKDIR /home/${user}

Когда вы вызываете docker build из командной строки, мы должны передавать переменные ARG, которые появляются в файле Docker:

docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .

Теперь перед созданием нового контейнера нам нужно создать файл xauth с правами доступа:

xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -

Этот файл должен быть установлен в контейнер при его создании / запуске:

docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow