Doing one thing with a task container
The dockeronwindows/ch02-powershell-env:2e image is an example of a packaged application which is meant to run in a container and perform a single task. The image is based on Microsoft Windows Server Core and is set up to run a simple PowerShell script when it starts, printing details about the current environment. Let's see what happens when I run a container directly from the image:
> docker container run dockeronwindows/ch02-powershell-env:2e
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\ContainerAdministrator\AppData\Roaming
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME 8A7D5B9A4021
...
Without any options, the container runs a PowerShell script which is built into the image, and the script prints out some basic information about the operating system environment. I call this a task container because the container performs one task and then exits.
If you run docker container ls, which lists all the active containers, you won't see this container. But if you run docker container ls --all, which shows containers in all states, you'll see it in the Exited status:
> docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS
8a7d5b9a4021 dockeronwindows/ch02-powershell-env:2e "powershell.exe C:..." 30 seconds ago Exited
Task containers are very useful in automating repetitive tasks, like running scripts to set up an environment, backing up data, or collecting log files. Your container image packages the script to run, along with the exact version of all the requirements that the script needs, so anyone with Docker installed can run the script without having to install pre-requisites.
This is especially useful for PowerShell, where scripts can be dependent on several PowerShell modules. The modules may be publicly available, but your script can be dependent on specific versions. Instead of sharing a script that requires users to install the correct version of many different modules, you build an image that has the modules already installed. Then you only need Docker to run the script task.
Images are self-contained units, but you can also use them as a template. An image may be configured to do one thing, but you can run containers from an image in different ways to do different things.