Контейнер web работает — в нём можно выполнять команды и смотреть на его процессы изнутри.
docker exec <имя> <команда> запускает ещё одну команду в работающем контейнере. Список процессов изнутри:
Первой строкой стоит PID 1 — httpd -f -p 8080: внутри контейнера главный процесс идёт первым. Командную оболочку внутри даёт sudo docker exec -it web sh: -i и -t подключают к ней твой ввод и терминал, выход — exit.
С самого сервера тот же процесс виден в обычном списке процессов — со своим номером:
Контейнер — это процессы сервера, которым ядро ограничило обзор (пространства имён и cgroups): они видят только свои процессы и файлы своего образа. docker stop останавливает главный процесс, docker start запускает тот же контейнер снова.
Контейнер box в docker ps -a — Exited (0) 5 minutes ago. Что напечатает sudo docker exec box ls /?
-
Команда до контейнера не доходит: Docker отказывает с ошибкой
is not runningи ненулевым кодом. -
docker execдобавляет команду к процессам работающего контейнера. У остановленного процессов нет, и Docker отвечаетis not running. -
Сам
docker execконтейнер не запускает. Запустить его снова —sudo docker start box, и только потомexec.
docker exec выполняет команду рядом с главным процессом работающего контейнера. У остановленного контейнера процессов нет: сначала docker start, потом exec.
Главное в шаге
-
docker execвыполняет ещё одну команду в работающем контейнере;docker exec -it … sh— оболочка внутри. -
Внутри контейнера главный процесс — PID 1, а на сервере он виден в
psпод своим номером. - Контейнер — процессы сервера с ограниченным обзором: свои процессы и файлы своего образа.