发布于 

在Mac的Docker中运行DotNetCore2.0

最近学习Angular4,服务端准备使用DotNetCore API来实现,本文简单介绍下在Mac中怎样将DotNetCore程序部署在Docker中,并使用Nginx做反向代理让程序可以跑起来。

具体步骤如下

  1. 安装Docker
  2. 拉取DotNetCore镜像
  3. 使用VS For Mac创建DotNetCore应用
  4. 发布应用到Docker
  5. 安装Nginx
  6. 配置Nginx代理Docker中的DotNetCore应用

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
docker pull 镜像名称 #拉取镜像
docker rm -f 容器id #强制删除容器
docker rmi imageid #删除镜像
docker logs -f 容器ID #查看容器日志
docker ps -a #查看所有的容器
docker attach 容器id #进入到容器
docker build -t s2appadmin . #使用Dockerfile文件编译Docker
dotnet publish #发布dotnetcore应用
dotnet run #启动dotnetcore应用
dotnet *.dll #在发布后的目录中执行dotnet 程序集的dll文件名,启动应用
nginx -v #查看nginx版本
nginx -s reload #重新加载nginx
nginx -s stop #停止nginx

Mac中安装Docker

在下面链接中下载Mac版的Docker安装文件进行Docker的安装
https://docs.docker.com/docker-for-mac/install/

安装成功后,在系统的顶栏中可以看到下图代表安装成功:

在终端中执行docker --version 查看下Doker的版本

1
2
fengwei@localhost:~$ docker --version
Docker version 17.06.2-ce, build cec0b72

在Docker中拉取NetCore镜像

直接执行下面命令,拉取最新版本的microsoft/dotnet镜像

1
docker pull microsoft/dotnet:latest

启动一个容器实例

1
docker run -itd -p 5000:5000 microsoft/dotnet

因为DotNetCore的默认端口监听为5000,所以将容器的5000端口映射到宿主机到5000端口。启动成功后执行docker ps -a ,如一切顺利,可以看到如下图所示:

主要关注STATUS,状态为up表示是正常启动,否则通过docker logs -f 容器id来查看相关日志,通常可以看到容器没有启动成功的错误日志,然后Google之。

创建DotNetCore应用

在创建应用之前先将VS For Mac升级到最新版本,因为稍微老一点的版本不支持NetCore 2.0,即便是安装了最新的dotnet-sdk-2.0.0,最后发布的程序运行在Docker中时会遇到各种问题。所以为了避免麻烦,先升级VS

在VS中创建新项目,选择API项目:

我的API项目的名称为S2AppAdmin,在终端中进入到项目的目录中,执行dotnet publish,如下图:

在终端中进入到publish目录中,执行dotnet S2AppAdmin.dll,如下图:

可以看出已经监听了5000端,现在在浏览器中输入http://localhost:5000/api/values/get,可以看到API接口的返回值已经在界面显示了。

发布应用到Docker

在网上找了很多资料,都是使用Dockerfile来发布应用到Docker中,用此方法试过很多次,但没有运行成功,后面找到原因再单独开篇来介绍,下面介绍另一种方法。

前面已经使用docker run 命令运行起一个Docker实例来,容器id为:3be4cfc30126,执行下面命令进入到容器中:

1
docker attach 3be4cfc30126

进入到home目录后,使用mkdir s2app命令创建s2app目录,如下图:

执行exit,退出容器回到宿主环境,进入到S2AppAdmin项目的目录中,执行下面命令将publish的文件复制到容器中

1
docker cp bin/Debug/netcoreapp2.0/publish/ hardcore_leavitt:/home/s2app/

注意:上面的hardcore_leavitt为容器的名称。

再次执行docker attach 3be4cfc30126进入容器,在publish目录中执行dotnet S2AppAdmin.dll,如下图:

这时在宿主环境中访问http://localhost:5000/api/values/get,发现无法访问,说明容器和宿主没有打通。

在VS中打开Program.cs文件,添加.UseUrls("http://*:5000"),如下图:

在项目目录下执行下面命令:

1
2
dotnet publish
docker cp bin/Debug/netcoreapp2.0/publish/ hardcore_leavitt:/home/s2app/

在容器内执行:

1
dotnet S2APPAdmin.dll

再在浏览器中访问http://localhost:5000/api/values/get,发现结果已经可以正常显示了。

Nginx安装

使用brew来安装Nginx,至于什么是brew,自行去Google。下面先看几个brew的常用命令

1
2
3
4
5
brew search nginx #brew 搜索软件
brew install nginx #brew 安装软件
brew uninstall nginx #brew 卸载软件
sudo brew info nginx #查看安装信息
brew list #查看已经安装的软件

安装成功后,输入nginx -v,可以看到nginx的版本信息

/usr/local/etc/nginx目录中找到并打开nginx.conf文件,添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 8000;
#listen somename:8080;
server_name localhost;

location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

如下图:

正常情况下,在浏览器中输入http://localhost:8000/api/values/get,可以看到API的输出结果。

常见问题

问题:nginx-1.8.0 already installed, it’s just not linked

1
解决:执行命令:brew link nginx

问题:出现如下错误信息:

1
2
3
4
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/man/man8/nginx.8
/usr/local/share/man/man8 is not writable.
1
解决: /usr/local/share/man/man8  设置权限