Работая с локальной средой или с кластером Docker Swarm очень часто приходится обращаться к базовым функциям Docker Engine, о них и поговорим.
Для локальной разработки я использую
Docker Engine
совместно сDocker Compose
(о нем поговорим вдругой раз), так как последний позволяет минимизировать рутину. Поэтому в данном статье рассмотрю лишь необходимый функционал самогоDocker Engine
.
Страница будет изменяться по мере необходимости - как только какой-то функционал Docker Engine станет моей обыденностью.
Для более детального изучения необходимо обратиться к документации по Docker CLI.
Почитать о том что такое Docker Engine
можно в официальной документации или по-русски здесь.
Инструкция по установке проста, ее можно найти в документации.
Docker Engine
требует работы от юзера в группе docker
(но можно и от sudo
), добавим текущего (нужного) пользователя в группу docker
и от него можно запускать без sudo
:
$ sudo usermod -aG docker <USER>
У некоторых списочных команд Docker есть 2 интеерсных флага:
-q
, --quiet
- показать только идентификаторы, полезно для массовых действий, например, удалить все образы (сначала запрашивается список идентификаторов всех образов, а потом передается в команду удаления:$ docker rmi $(docker images -q)
-f
, --force
- принудительное применение действия, например когда образ не может быть удален, потому что используется в контейнере
Образ Docker
- это то что разворачивается в контейнере. Образы создаются из Dockerfile.
Список локальных образов:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mdk_php latest c2aff72a5148 5 hours ago 487MB
php 7.3-cli d29faad18647 2 weeks ago 467MB
mysql 5.7 c20987f18b13 2 weeks ago 448MB
Удалить образ(ы):
$ docker rmi ID
Собрать образ:
$ docker build -t name:tag -f path_to_dockerfile .
Реестр Docker - это постоянное хранилище образов, может быть локальным или удаленным.
По умолчанию Docker Engine использует DockerHub, но можно использовать другие решения, например Gitlab Container Registry.
Авторизация в реестре:
$ docker login registry.example.com
Далее будет предложено ввести авторизационные данные.
Залить образ в реестр:
$ docker push registry.example.com/byurrer/name:tag
Запуск контейнера (детали в доке):
$ docker run <container_name> <command>
command
будет запущена в контейнере при его запуске.
Некоторые опции:
--name
- задать имя контейнеру-i
- интерактивный режим (foreground), терминал не отдаст упраление пока контейнер работает-d
- запустить в фоне (background)-w
- указать рабочую директорию--expose
- открытие портов в контенйере, чтобы можно было подключаться к этим портам (--expose 80
открытие 80
порта в контейнере)-p
- публикация портов из контейнера на хост-машине (-p 8080:80
- публикация 80
порта из контейнера на 8080
порту хост-машины)Список контейнеров (без аргументов/по умолчанию - запущенных)
$ docker ps
# или
# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7808a98abfc9 mysql:5.7 "docker-entrypoint.s…" 4 hours ago Exited (0) 3 hours ago mysql
e766de48ddbb php:7.1-cli "docker-php-entrypoi…" 3 days ago Exited (0) 3 days ago adoring_dhawan
5137e6cf2aca hello-world "/hello" 3 days ago Exited (0) 3 days ago laughing_brattain
аргументы:
-a
, --all
- показать все контейнеры (запущенные/остановленные)-n
, --last
N - показать N последних созданных контейнеров-s
, --size
- добавить в сводную таблицу столбец с обозначающий размер образаЗайти в запущенный контейнер:
$ docker exec -it <id_or_name> /bin/bash
В данном случае используется 2 опции, которые позволяют в интерактивном режиме войти в контейнер и предоставить средства для ввода команд:
-i
, --interactive
- запустить в интерактивном режиме-t
, --tty
- выделить псевдо TTYДругие опции exec
:
-u
, --user
- указать пользователя, от имени которого будет выполняться команда (<name|uid>[:<group|gid>)
)-w
, --workdir
- указать рабочую директорию для выполнения командыТакже можно просто выполнить команду в контейнере:
$ docker exec <id_or_name> <command>
Подключиться к контейнеру:
$ docker attach -i <id_or_name>
Получить информацию о контейнере:
$ docker container inspect <id_or_name>
[
{
"Id": "7e586b8ba2ea0f2d14c71df87db428d3ce8e4dee40cb4b822f1850ee77803b36",
"Created": "2022-07-21T10:19:21.651313648Z",
"Path": "docker-php-entrypoint",
"Args": [
"/bin/sh",
"-c",
"/bin/bash -c \"su -l www-data -s /bin/bash -c 'cd /var/www/html/ && composer install' && php-fpm -F\""
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 7872,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-07-21T10:19:22.812952491Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...
}
]
Получить вывод контейнера:
$ docker container logs <id_or_name>
Удалить контейнер(ы):
$ docker rm <id_or_name>
-f
, --force
- принудительное удаление работающего (SIGKILL
)-v
, --volumes
- удалить тома связанные с контейнеромОбщее описание в доке, а тут по swarm.
Список сетей:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
5ed3c66871b5 bridge bridge local
92fa558c94fd app-network bridge local
fc3a6f2c3c05 opencart30_app-network bridge local
722176324d31 shop-script_app-network bridge local
Информация по одной или нескольким сетям (где в качестве указания сети может быть ID
или NAME
):
$ docker network inspect <id_or_name>
[
{
"Name": "app-network",
"Id": "92fa558c94fdd9aeaa9eef9942955d4185ef8ddf68c86c619d840ff197756918",
"Created": "2022-02-06T13:16:38.612580291+03:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.0.1/24",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {
"com.docker.compose.network": "app-network",
"com.docker.compose.project": "mdk",
"com.docker.compose.version": "1.25.0"
}
}
]
Создать сеть:
$ docker network create --driver overlay --subnet 172.22.1.1/24 <new_network_name>
Удалить сеть:
$ docker network rm <id_or_name>
Занимаемое пространство ресурсами docker:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 2 433.8MB 216.5kB (0%)
Containers 2 2 2.733kB 0B (0%)
Local Volumes 1 1 478.7kB 0B (0%)
Build Cache 0 0 0B 0B
Просмотр статистики работы контейнеров (почти как top):
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7e586b8ba2ea interlayer-production 0.01% 33.22MiB / 976.8MiB 3.40% 8.19MB / 175kB 1.68MB / 7.05MB 4
69a4007af02c interlayer-production 0.00% 2.551MiB / 976.8MiB 0.26% 40.6kB / 56.2kB 786kB / 4.1kB 2
7f6063809896 portainer_agent 0.10% 7.121MiB / 976.8MiB 0.73% 1.8kB / 0B 5.39MB / 0B 4
Все что контейнеры выводят в stdout, docker хранит в -json.log
лог файлах без ротации, файлы растут, занимая место на диске. Очистить все логи stdout контейнеров:
$ truncate -s 0 /var/lib/docker/containers/*/*-json.log
Удалить все ресурсы (образы, тома, сети) не связанные с контейнерами (висящие ресурсы):
$ docker system prune
-a
, --all
- удалить все ресурсы не связанные с запущенными контейнерами (и висящие и неиспользуемые ресурсы), т.е. удалить все кроме работающего