First of all, a container is not a virtual machine. A container is an isolation environment for running a process. The life-cycle of the container is bound to the process running inside it. When the process exits, the container also exits, and the isolation environment is gone. The meaning of “attach to container” or “enter an container” actually means you go inside the isolation environment of the running process, so if your process has been exited, your container has also been exited, thus there’s no container for you to
enter. So the command of
docker exec are target at running container.
Which process will be started when you
docker run is configured in a
Dockerfile and built into a docker image. Take image
ubuntu as an example, if you run
docker inspect ubuntu, you’ll find the following configs in the output:
which means the process got started when you run
docker run ubuntu is
/bin/bash, but you’re not in an interactive mode and does not allocate a tty to it, so the process exited immediately and the container exited. That’s why you have no way to enter the container again.
To start a container and enter
bash, just try:
docker run -it ubuntu
Then you’ll be brought into the container shell. If you open another terminal and
docker ps, you’ll find the container is running and you can
docker attach to it or
docker exec -it <container_id> bash to enter it again.
You can also refer to this link for more info.