1. 创建并发布一个控制台应用,假设目录结构如下
docker-working
└──App
├──NetCore.Docker.csproj
├──Program.cs
└──obj
├──NetCore.Docker.csproj.nuget.dgspec.json
├──NetCore.Docker.csproj.nuget.g.props
├──NetCore.Docker.csproj.nuget.g.targets
├──project.assets.json
└──project.nuget.cache
2. 在工程目录下创建Dockerfile 文件,内容如下
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
对控制台应用,其实用mcr.microsoft.com/dotnet/core/runtime:3.1更合适
3. 生成映像。在工程目录下运行
docker build -t counter-image -f Dockerfile .
docker build
命令中的 .
指示 Docker 在当前文件夹中查找 Dockerfile 。 此命令生成映像,并创建指向相应映像的本地存储库“counter-image” 。
在此命令完成后,运行 docker images
以列出已安装的映像:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE counter-image latest e6780479db63 4 days ago 190MB mcr.microsoft.com/dotnet/core/aspnet 3.1 e6780479db63 4 days ago 190MB
两个映像共用相同的“IMAGE ID” 值。 两个映像使用的 ID 值相同是因为,Dockerfile 中的唯一命令是在现有映像的基础之上生成新映像。
接下来,在 Dockerfile 中添加三个命令 。 两个命令都新建映像层,最后一个命令表示 counter-image 存储库条目指向的映像 。
COPY bin/Release/netcoreapp3.1/publish/ App/ WORKDIR /App ENTRYPOINT ["dotnet", "NetCore.Docker.dll"]
COPY
命令指示 Docker 将计算机上的指定文件夹复制到容器中的文件夹。 在此示例中,“publish”文件夹被复制到容器中的“App”文件夹 。
WORKDIR
命令将容器内的当前目录更改为“App” 。
下一个命令 ENTRYPOINT
指示 Docker 将容器配置为可执行文件运行。 在容器启动时,ENTRYPOINT
命令运行。 当此命令结束时,容器也会自动停止。
再次运行
docker build -t counter-image -f Dockerfile .
此时会生成新的映像如下
docker images REPOSITORY TAG IMAGE ID CREATED SIZE counter-image latest cd11c3df9b19 41 seconds ago 190MB mcr.microsoft.com/dotnet/core/aspnet 3.1 e6780479db63 4 days ago 190MB
可以看到生成了不同的映像ID
4. 至此,已有包含应用的映像,可以创建容器了。
docker create --name core-counter counter-image
若要查看所有 容器的列表,请使用 docker ps -a
命令:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f281cb3af99 counter-image "dotnet NetCore.Dock…" 40 seconds ago Created core-counter
使用 docker start
命令来启动容器
docker start core-counter
然后使用 docker ps
命令仅显示正在运行的容器:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f6424a7ddce counter-image "dotnet NetCore.Dock…" 2 minutes ago Up 11 seconds core-counter
5. 在容器运行后,可以连接到它来查看输出。 使用docker attach
命令,查看输出流。
docker attach --sig-proxy=false core-counter
--sig-proxy=false
参数可确保 Ctrl+C 不会停止容器中的进程。
6. docker stop用来停止容器,docker rm
命令来删除容器
docker rm core-counter
7. 删除容器后才能删除映像
docker rmi counter-image:latest
单次运行
Docker 提供了 docker run
命令,用于将容器作为单一命令进行创建和运行。 使用此命令,无需依次运行 docker create
和 docker start
。 另外,还可以将此命令设置为,在容器停止时自动删除容器。 例如,使用 docker run -it --rm
可以执行两项操作,先自动使用当前终端连接到容器,再在容器完成时删除容器:(实测无法删除容器)
docker run -it --rm counter-image Counter: 1 Counter: 2 Counter: 3 Counter: 4 Counter: 5 ^C
使用 docker run -it
,Ctrl+C 命令会停止在容器中运行的进程,进而停止容器。
使用 docker run
命令,还可以修改 Dockerfile 中的 ENTRYPOINT
命令,并运行其他内容,但只能针对相应容器。
docker run -it --rm --entrypoint "bash" counter-image root@b735b9799abf:/App# ls NetCore.Docker.deps.json NetCore.Docker.dll NetCore.Docker.exe NetCore.Docker.pdb NetCore.Docker.runtimeconfig.json root@b735b9799abf:/App# dotnet NetCore.Docker.dll 3 Counter: 1 Counter: 2 Counter: 3 root@b735b9799abf:/App# exit exit