zoukankan      html  css  js  c++  java
  • 使 .NET Core 应用程序容器化

    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 -itCtrl+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
  • 相关阅读:
    calc属性
    transform,transtion属性
    cursor:属性
    html页面禁止用户右键粘贴复制保存的代码
    git 删除与撤回
    git 仓库原理
    git 创建本地仓库
    git提示错误关于错误:ssh: Could not resolve hostname github.com: Name or service not known.fatal: Could not read from remote repository.
    AttributeError: module 'socket' has no attribute 'SO_REUSEPORT'
    python paramiko模块sftp异常:paramiko.ssh_exception.SSHException: EOF during negotiation
  • 原文地址:https://www.cnblogs.com/yetsen/p/13697173.html
Copyright © 2011-2022 走看看