Docker
Запуск контейнеров
Поиск…
Синтаксис
- 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