Docker
Управление контейнерами
Поиск…
Синтаксис
- docker rm [ОПЦИИ] КОНТЕЙНЕР [КОНТЕЙНЕР ...]
- прикрепление докеров [ОПЦИИ] КОНТЕЙНЕР
- docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]
- docker ps [ОПЦИИ]
- докерные журналы [ОПЦИИ] КОНТЕЙНЕР
- докер проверяет [ОПЦИИ] КОНТЕЙНЕР | ИЗОБРАЖЕНИЕ [КОНТЕЙНЕР | ИЗОБРАЖЕНИЕ ...]
замечания
- В приведенных выше примерах каждый раз, когда контейнер является параметром команды docker, он упоминается как
<container>
илиcontainer id
или<CONTAINER_NAME>
. Во всех этих местах вы можете либо передать имя контейнера, либо идентификатор контейнера, чтобы указать контейнер.
Листинг контейнеров
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bc9b1988080 redis "docker-entrypoint.sh" 2 weeks ago Up 2 hours 0.0.0.0:6379->6379/tcp elephant-redis
817879be2230 postgres "/docker-entrypoint.s" 2 weeks ago Up 2 hours 0.0.0.0:65432->5432/tcp pt-postgres
docker ps
по себе печатает только текущие контейнеры. Чтобы просмотреть все контейнеры (включая остановленные), используйте флаг -a
:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cc69f11a0f7 docker/whalesay "ls /" 26 hours ago Exited (0) 26 hours ago berserk_wozniak
2bc9b1988080 redis "docker-entrypoint.sh" 2 weeks ago Up 2 hours 0.0.0.0:6379->6379/tcp elephant-redis
817879be2230 postgres "/docker-entrypoint.s" 2 weeks ago Up 2 hours 0.0.0.0:65432->5432/tcp pt-postgres
Чтобы отобразить контейнеры с определенным статусом, используйте параметр командной строки -f
для фильтрации результатов. Ниже приведен пример перечисления всех завершенных контейнеров:
$ docker ps -a -f status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cc69f11a0f7 docker/whalesay "ls /" 26 hours ago Exited (0) 26 hours ago
Также можно указать только идентификаторы контейнера с ключом -q
. Это позволяет легко работать с результатом с другими утилитами Unix (такими как grep
и awk
):
$ docker ps -aq
9cc69f11a0f7
2bc9b1988080
817879be2230
При запуске контейнера с docker run --name mycontainer1
вы docker run --name mycontainer1
конкретное имя, а не произвольное имя (в форме mood_famous, например nostalgic_stallman), и их легко найти с такой командой
docker ps -f name=mycontainer1
Ссылка на контейнеры
Команды докеров, которые принимают имя контейнера, принимают три разных формы:
Тип | пример |
---|---|
Полный UUID | 9cc69f11a0f76073e87f25cb6eaf0e079fbfbd1bc47c063bcd25ed3722a8cc4a |
Короткая UUID | 9cc69f11a0f7 |
название | berserk_wozniak |
Используйте docker ps
для просмотра этих значений для контейнеров в вашей системе.
UUID генерируется Docker и не может быть изменен. Вы можете указать имя контейнера при запуске docker run --name <given name> <image>
. Docker генерирует случайное имя в контейнер, если вы не укажете его во время запуска контейнера.
ПРИМЕЧАНИЕ . Значение UUID (или «короткого» UUID) может быть любой длины, пока данное значение уникально для одного контейнера
Запуск и остановка контейнеров
Чтобы остановить запущенный контейнер:
docker stop <container> [<container>...]
Это отправит основной процесс в контейнер SIGTERM, а затем SIGKILL, если он не остановится в течение льготного периода. Название каждого контейнера печатается по мере его прекращения.
Чтобы запустить контейнер, который остановлен:
docker start <container> [<container>...]
Это запустит каждый контейнер, переданный в фоновом режиме; имя каждого контейнера печатается при его запуске. Чтобы запустить контейнер на переднем плане, передайте флаг -a
( --attach
).
Список контейнеров с пользовательским форматом
docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}'
Поиск конкретного контейнера
docker ps --filter name=myapp_1
Найти контейнерный IP-адрес
Чтобы узнать IP-адрес вашего контейнера, используйте:
docker inspect <container id> | grep IPAddress
или использовать докер-инспекцию
docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}
Перезапуск контейнера докеров
docker restart <container> [<container>...]
Вариант --time: Секунды ждать остановки перед умерщвлением контейнера ( по умолчанию 10)
docker restart <container> --time 10
Удаление, удаление и очистка контейнеров
docker rm
можно использовать для удаления определенных контейнеров следующим образом:
docker rm <container name or id>
Чтобы удалить все контейнеры, вы можете использовать это выражение:
docker rm $(docker ps -qa)
По умолчанию докер не удаляет контейнер, который запущен. Любой запущенный контейнер выдаст предупреждающее сообщение и не будет удален. Все остальные контейнеры будут удалены.
В качестве альтернативы вы можете использовать xargs
:
docker ps -aq -f status=exited | xargs -r docker rm
Если docker ps -aq -f status=exited
вернет список идентификаторов контейнеров контейнеров, имеющих статус «Выход».
Внимание: все приведенные выше примеры удаляют только контейнеры «остановлены».
Чтобы удалить контейнер, независимо от того, остановлен он или нет, вы можете использовать флаг силы -f
:
docker rm -f <container name or id>
Чтобы удалить все контейнеры, независимо от состояния:
docker rm -f $(docker ps -qa)
Если вы хотите удалить только контейнеры с dead
статусом:
docker rm $(docker ps --all -q -f status=dead)
Если вы хотите удалить только контейнеры с exited
статусом:
docker rm $(docker ps --all -q -f status=exited)
Это все перестановки фильтров, используемых при перечислении контейнеров .
Чтобы удалить как нежелательные контейнеры, так и оборванные изображения, использующие пространство после версии 1.3 , используйте следующее (похожее на Unix-инструмент df
):
$ docker system df
Чтобы удалить все неиспользуемые данные:
$ docker system prune
Запустить команду на уже существующий контейнер докеров
docker exec -it <container id> /bin/bash
Обычно для входа в уже запущенный контейнер можно выполнить несколько быстрых тестов или посмотреть, что делает приложение. Часто это означает плохую практику использования контейнеров из-за журналов, а измененные файлы должны размещаться в томах. Этот пример позволяет нам войти в контейнер. Это предполагает, что / bin / bash доступен в контейнере, это может быть / bin / sh или что-то еще.
docker exec <container id> tar -czvf /tmp/backup.tgz /data
docker cp <container id>:/tmp/backup.tgz .
Этот пример архивирует содержимое каталога данных в tar. Затем с помощью docker cp
вы можете получить его.
Контейнерные журналы
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
-f, --follow=false Follow log output
--help=false Print usage
--since= Show logs since timestamp
-t, --timestamps=false Show timestamps
--tail=all Number of lines to show from the end of the logs
Например:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
ff9716dda6cb nginx "nginx -g 'daemon off" 8 days ago Up 22 hours 443/tcp, 0.0.0.0:8080->80/tcp
$ docker logs ff9716dda6cb
xx.xx.xx.xx - - [15/Jul/2016:14:03:44 +0000] "GET /index.html HTTP/1.1" 200 511 "https://google.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36"
xx.xx.xx.xx - - [15/Jul/2016:14:03:44 +0000] "GET /index.html HTTP/1.1" 200 511 "https://google.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36"
Подключиться к экземпляру, запущенному как демон
Существует два способа достижения этого, первый и наиболее известный:
docker attach --sig-proxy=false <container>
Это буквально прикрепляет ваш bash к контейнеру bash, а это означает, что если у вас запущенный скрипт, вы увидите результат.
Чтобы отсоединить, просто введите: Ctl-P Ctl-Q
Но если вам нужен более дружеский способ и чтобы создавать новые экземпляры bash, просто выполните следующую команду:
docker exec -it <container> bash
Копирование файла из / в контейнеры
от контейнера до принимающего
docker cp CONTAINER_NAME:PATH_IN_CONTAINER PATH_IN_HOST
от хоста до контейнера
docker cp PATH_IN_HOST CONTAINER_NAME:PATH_IN_CONTAINER
Если я использую jess / transmission из
https://hub.docker.com/r/jess/transmission/builds/bsn7eqxrkzrhxazcuytbmzp/
, файлы в контейнере находятся в / передаче / загрузке
и мой текущий каталог на хосте - / home / $ USER / abc, после
docker cp transmission_id_or_name:/transmission/download .
У меня будут файлы, скопированные в
/home/$USER/abc/transmission/download
вы не можете, используя docker cp
копировать только один файл, вы копируете дерево каталогов и файлы
Удаление, удаление и очистка докеров
Объемы докеров не удаляются автоматически, когда контейнер остановлен. Чтобы удалить связанные тома при остановке контейнера:
docker rm -v <container id or name>
Если флаг -v
не указан, то объем остается на диске как «оборванный том». Чтобы удалить все оборванные тома:
docker volume rm $(docker volume ls -qf dangling=true)
Объем docker volume ls -qf dangling=true
filter возвращает список имен docker volume ls -qf dangling=true
, включая немаркированные, которые не привязаны к контейнеру.
Кроме того, вы можете использовать xargs
:
docker volume ls -f dangling=true -q | xargs --no-run-if-empty docker volume rm
Экспорт и импорт файловых систем Docker container
Можно сохранить содержимое файловой системы контейнера Docker в архив архива tarball. Это полезно в том, что касается перемещения файловых систем контейнеров на разные хосты, например, если в контейнере базы данных есть важные изменения, и в противном случае невозможно повторить эти изменения в другом месте. Обратите внимание, что предпочтительно создавать совершенно новый контейнер из обновленного изображения с помощью команды docker run
docker-compose.yml
или файла docker-compose.yml
вместо экспорта и перемещения файловой системы контейнера. Частью мощности Docker является проверяемость и отчетность его декларативного стиля создания изображений и контейнеров. Используя docker import
docker export
и docker import
, эта мощность подавляется из-за обфускации изменений, сделанных внутри файловой системы контейнера из исходного состояния.
docker export -o redis.tar redis
Вышеупомянутая команда создаст пустое изображение, а затем экспортирует файловую redis
контейнера redis
в это пустое изображение. Чтобы импортировать из архива tarball, используйте:
docker import ./redis.tar redis-imported:3.0.7
Эта команда создаст изображение redis-imported:3.0.7
, из которого могут быть созданы контейнеры. Также возможно создавать изменения при импорте, а также устанавливать сообщение фиксации:
docker import -c="ENV DEBUG true" -m="enable debug mode" ./redis.tar redis-changed
Директивы Dockerfile, доступные для использования с параметром командной строки -c
- CMD
, ENTRYPOINT
, ENV
, EXPOSE
, ONBUILD
, USER
, VOLUME
, WORKDIR
.