Ubuntu Docker 部署 .NET Core MVC

环境

  • Ubuntu 16.04
  • Docker version 18.09.0
  • .net core 2.1

步骤

  1. 主机安装docker
    wget -qO- https://get.docker.com/ | sh

    其他系统见:多平台安装Docker

  2. docker 下载 .net core镜像
    docker pull microsoft/dotnet
  3. 主机安装.NET Core 官方安装指南
    # 适用于Ubuntu 16.04
    wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    sudo apt-get install apt-transport-https
    sudo apt-get update
    sudo apt-get install dotnet-sdk-2.1
  4. 新建.NET Core MVC项目(由本地上传代码可以略过此步)
    mkdir dotnet/test
    cd dotnet/test
    dotnet new mvc
  5. 测试项目,设置nginx代理
    • .NET Core默认端口为5000和5001(分别对应http和https),我为了避免端口冲突而修改默认端口,编辑Program.cs文件
      //修改Webhost.CreateDefaultBuilder行,添加UseUrls()
      Webhost.CreateDefaultBuilder(args)
          .UseUrls(“http://*:60000”) //这里的*很关键,设置为localhost会导致宿主机无法访问容器内的Web页面
          .UseStartup<Startup>();
    • 生成后运行项目(如果不在项目目录内,则需要输入路径)
      dotnet build
      dotnet run

      此时在本机curl端口会输出html代码

    • 配置nginx,编辑nginx.conf文件,在http块末尾添加
      server {
          listen [Your Port];
          server_name [Your Name];
          location / {
              proxy_pass http://127.0.0.1:[Your Project Port];
          } 
      }

      检查配置文件并重新载入nginx

      nginx -t
      nginx -s reload

      此时访问服务器的公网IP+端口是可以看到页面的

  6. 创建Dockerfile
    • 在项目内新建Dockerfile文件,输入指令
      vim Dockerfile
      # 在Dockerfile中添加行
      FROM microsoft/dotnet
      COPY [你的项目目录] [容器中项目所在目录]
      WORKDIR [容器中的工作目录]
      EXPOSE [项目端口]
      # CMD ["", "", ...] 设置容器开启时执行的指令,由于进入容器后需要生成项目,我这里不做设置
    • 其中WORKDIR设置的目录是进入容器后的默认目录;EXPOSE设置的是容器对外开放的端口。
  7. 生成项目镜像
    docker build -t test:1.0 .

    注意末尾的点,镜像名称中冒号后的是版本号。

  8. 运行docker镜像
    docker run -itd -q 60000:60000 test:1.0

    其中,-i 代表以交互模式运行容器;-t 代表为容器重新分配一个伪输入终端,通常与 -i 同时使用;-d 代表后台运行容器;-q 为容器与主机间进行端口映射。输入镜像名称时需要加版本号。

  9. 查看容器ID并进入容器
    docker ps
    
    docker attach [Your Container ID]
  10. 以与第5步相同的操作启动项目
    • 由于nginx已经设置代理,此时直接访问公网IP+端口即可看到Web页面

关于阿里云

如果使用阿里云平台,一定要在阿里云控制台的防火墙设置端口白名单!!