• Docker技术初体验


    什么是Docker

    Docker技术和虚拟机技术类似,他们都能在一个Host系统中划分出多个相互独立隔离的运行环境。借助官方配图:

    虚拟机的示意图是这样的

    我们需要为每个虚拟机安装自己的操作系统,即使我们只是想在里面运行一个应用。然后需要去对每个操作系统进行管理。

    再看看Docker的示意图:

    Docker也是在Host系统中产生多个相互隔离的环境,但是他不需要为每个隔离环境安装独立的操作系统,而是多个容器通过Docker Engine来共享一个Host操作系统。我们可以将每个容器(应用运行依赖的Runtime,各种依赖库,应用代码)生成为一个镜像,然后这个镜像可以在其他机器的Docker环境上运行。这样部署应用的时候会非常方便,也方便对应用运行环境进行扩展提高吞吐量。

    Docker环境搭建(MacOS环境下)

    要搭建Docker环境我们只需要从官网下载并安装Docker Engine即可。验证是否安装成功的方法就是在terminal中执行命令docker -v查看Docker版本。如果terminal输出

    Docker version 17.03.0-ce, build 60ccb22

    证明安装成功了。

    创建.NetCore项目

    接下来我们创建一个.NET Core项目用于部署到Docker 容器中。在terminal中执行如下命令(假设已安装.NetCoreSDK):

    mkdir DotnetHelloWorld
    cd DotnetHelloWorld
    dotnet new mvc -n HelloDotnet
    cd HelloDotnet

    生成Docker镜像

    在我们生成一个容器之前,我们必须先生成一个容器的镜像。我们先要定义一个Dockerfile文件。在Dockerfile中,我们需要定义生成镜像过程中需要执行的命令。如下:

    FROM microsoft/dotnet:latest //这里是指定了当前镜像的Base镜像,这个Docker在生成镜像的时候会根据该标示符(这里的格式为username/repository:tag)去官方的镜像仓库中去找。
    COPY . /app //拷贝当前目录所有文件到容器/app目录
    WORKDIR /app //设定工作目录为/app
    RUN ["dotnet","restore"] //在容器中运行dotnet restore命令
    RUN ["dotnet","build"] //在容器中运行dotnet build命令
    
    EXPOSE 5000/tcp //暴露容器的5000网络端口给外界
    ENV ASPNETCORE_URLS http://*:5000 //设定环境变量来绑定ASP.NET Core应用到5000端口
    
    ENTRYPOINT ["dotnet","run"]//设定镜像的入口为运行dotnet run命令
    

    在该Dockerfile里面我们是基于microsoft/dotnet:latest来创建自己的镜像的(改镜像已包含运行.net core app所依赖的运行时)。dotnet core的官方docker镜像介绍在这

    具体的Dockerfile编写指导,以及Dockerfile中可以使用的命令看这里

    定义好Dockerfile后(将其放置于HelloDotnet目录中),我们运行如下命令生成Docker镜像:(假设当前目录为HelloDotnet)

    docker build -t hello-dot-net/v1 .

    随后会看到docker会执行我们在Dockerfile中所定义的所有操作。

    Step 1/8 : FROM microsoft/dotnet:latest
     ---> b86bafdfcb89
    Step 2/8 : COPY . /app
     ---> 2ce53e7e50af
    Removing intermediate container 81c780b1b014
    Step 3/8 : WORKDIR /app
     ---> 66ffb590a424
    Removing intermediate container aedce4076f6c
    Step 4/8 : RUN dotnet restore
     ---> Running in 1432f4fbc0ec
      Restoring packages for /app/HelloDotnetCore.csproj...
      Generating MSBuild file /app/obj/HelloDotnetCore.csproj.nuget.g.props.
      Generating MSBuild file /app/obj/HelloDotnetCore.csproj.nuget.g.targets.
      Writing lock file to disk. Path: /app/obj/project.assets.json
      Restore completed in 1.67 sec for /app/HelloDotnetCore.csproj.
      
      NuGet Config files used:
          /root/.nuget/NuGet/NuGet.Config
      
      Feeds used:
          https://api.nuget.org/v3/index.json
     ---> 55431d69c00b
    Removing intermediate container 1432f4fbc0ec
    Step 5/8 : RUN dotnet build
     ---> Running in 7cdd931d7fb7
    Microsoft (R) Build Engine version 15.1.1012.6693
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      HelloDotnetCore -> /app/bin/Debug/netcoreapp1.1/HelloDotnetCore.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:03.26
     ---> 6123169f2c23
    Removing intermediate container 7cdd931d7fb7
    Step 6/8 : EXPOSE 5000/tcp
     ---> Running in 0abb5563744d
     ---> cbd8b4ff8291
    Removing intermediate container 0abb5563744d
    Step 7/8 : ENV ASPNETCORE_URLS http://*:5000
     ---> Running in df5a740765f1
     ---> c9b0a9e73f99
    Removing intermediate container df5a740765f1
    Step 8/8 : ENTRYPOINT dotnet run
     ---> Running in 083a7788c435
     ---> 9f386273dce3
    Removing intermediate container 083a7788c435
    Successfully built 9f386273dce3

    这表明我们的镜像已经产生。

    我们可以通过docker images来查看我们的镜像是否存在于列表中。

    运行Docker镜像/shell交互

    接下来我们可以通过如下命令运行我们的镜像了

    docker run -p 8081:5000 -t hello-dot-net/v1 //-p 8081:5000表示将host8081端口映射到容器的5000端口

    运行成功后你会看到如下输出

    Hosting environment: Production
    Content root path: /app
    Now listening on: http://*:5000
    Application started. Press Ctrl+C to shut down.

    说明容器运行成功。接下来你可以通过docker ps命令查看正在运行的容器.

    也可以通过浏览器访问localhost:8081来访问部署才容器中的应用。你会看到如下页面。

    我们可以通过如下命令来在容器中执行bash命令来获取shell控制:

    docker exec -i -t hello-dot-net/v1 /bin/bash

    获得如下输出

    root@f047f48045ed:/app# 

    接下来便可以通过shell与容器交互了。可以先执行个ls命令看看。

  • 相关阅读:
    Android ANR的产生与分析
    The module is an Android project without build variants, and cannot be built
    ExpandableListView使用(三)-ScrollView嵌套ExpandableListView,列表显示不全
    在代码中设置RelativeLayout布局中标签的android:layout_toLeftOf、android:layout_toRightOf等属性
    git报ssh variant 'simple' does not support setting port解决办法
    解决ScrollView嵌套RecyclerView出现item显示不全的问题
    解决ScrollView嵌套RecyclerView的显示及滑动问题
    Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
    android listview优化:滑动时颜色错乱问题
    映射的介绍与使用
  • 原文地址:https://www.cnblogs.com/Code-life/p/7354415.html
Copyright © 2020-2023  润新知