Difference between Running and Starting a Docker container

后端 未结 6 1341
你的背包
你的背包 2020-12-12 08:39

In practice to start a container I do:

docker run a8asd8f9asdf0

If thats the case, what does:

docker start         


        
6条回答
  •  攒了一身酷
    2020-12-12 09:28

    run command creates a container from the image and then starts the root process on this container. Running it with run --rm flag would save you the trouble of removing the useless dead container afterward and would allow you to ignore the existence of docker start and docker remove altogether.

    run command does a few different things:

    docker run --name dname image_name bash -c "whoami"
    
    1. Creates a Container from the image. At this point container would have an id, might have a name if one is given, will show up in docker ps
    2. Starts/executes the root process of the container. In the code above that would execute bash -c "whoami". If one runs docker run --name dname image_name without a command to execute container would go into stopped state immediately.
    3. Once the root process is finished, the container is stopped. At this point, it is pretty much useless. One can not execute anything anymore or resurrect the container. There are basically 2 ways out of stopped state: remove the container or create a checkpoint (i.e. an image) out of stopped container to run something else. One has to run docker remove before launching container under the same name.

    How to remove container once it is stopped automatically? Add an --rm flag to run command:

    docker run --rm --name dname image_name bash -c "whoami"
    

    How to execute multiple commands in a single container? By preventing that root process from dying. This can be done by running some useless command at start with --detached flag and then using "execute" to run actual commands:

    docker run --rm -d --name dname image_name tail -f /dev/null
    docker exec dname bash -c "whoami"
    docker exec dname bash -c "echo 'Nnice'"
    

    Why do we need docker stop then? To stop this lingering container that we launched in the previous snippet with the endless command tail -f /dev/null.

提交回复
热议问题