当前位置: 移动技术网 > IT编程>开发语言>.net > Docker笔记01-发布一个dotnetcore应用

Docker笔记01-发布一个dotnetcore应用

2019年05月17日  | 移动技术网IT编程  | 我要评论

迷你忍者没有声音,sejishikong,applyfor

os:widows 10

ide: vs2017

docker:docker desktop for windows

windows下安装docker需要先启用hyper-v 

在windows 容器的运行目录在c盘这个改不了,但是可以改image的保存路径 

desktop 右键 > settings > daemon > 点击 basic > 输入  "graph": "d:\\docker\\images"

 本地环境搭好后开始准备项目制作镜像

1.新建项目时添加docker支持或者在现有项目上右键添加docker支持

2.将生成的dockerfile复制到解决方案目录下 *****貌似如果需要用命令行build镜像就必须手动复制到解决方案目录下,应该算是vs的bug****

   vs自动生成的一个dockerfile 红色部分是后加的说明

 

#depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the from statement may need to be changed.
#for more information, please see https://aka.ms/containercompat

# 这是一个运行时的基础镜像,表示这个api依赖这个runtime,别名是base 工作目录是/app 运行端口是 80 #
from microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1803 as base
workdir /app
expose 80

# 这是dotnet的sdk镜像,也是一个基础镜像 别名 build 构建镜像的过程中需要使用各种dotnet的命令,所以也是必不可少的 #
from microsoft/dotnet:2.1-sdk-nanoserver-1803 as build
workdir /src
copy ["helloapi/helloapi.csproj", "helloapi/"]      # 把helloapi/helloapi.csproj 复制到 helloapi/ 下 #
run dotnet restore "helloapi/helloapi.csproj"       # 运行 dotnet 的 restore 命令 # 
copy . .                                            # 把当前目录下文件复制到运行目录#
workdir "/src/helloapi"
run dotnet build "helloapi.csproj" -c release -o /app  # 运行dotnet的build命令 打包成release 输出目录是 /app #

from build as publish
run dotnet publish "helloapi.csproj" -c release -o /app  #发布命令#

from base as final
workdir /app
copy --from=publish /app .                         
entrypoint ["dotnet", "helloapi.dll"]      # 程序入口 使用dotnet命令启动helloapi.dll文件 #

 

 

3.打开cmd命令行工具进入到dockerfile目录(也可以不进入,但是需要输入dockerfile文件的路径) 

docker build -t erp/myapi:1.0 .
# -t 表示给镜像起名字 格式是 name:version 如果不加上版本号 会默认成 laster
# . 表示当前目录 也可是完整路径

 

4.查看docker镜像

docker images

5.运行一个镜像(镜像跑起来就是容器了)

# 基于镜像erp/myapi:1.0运行一个名为api的容器 
# -d 后台运行 -it 控制台运行
# -p 端口映射 容器80端口映射到宿主机8080端口上  -p 端口动态映射 每次启动容器时端口随机
# --log-driver 容器日志收集方式json文本
# --log-opt max-size 容器日志单文件大小上线 max-file 最多保存多少个日志文件
# -v volume数据卷 表示把宿主机目录和容器目录做映射,通常是将容器中的应用日志映射到宿主机上,容器中的数据库文件映射到宿主机 避免删除容器时数据库等也被删除
# sh 控制台启动后可使用sh功能 windows环境下 是cmd
docker run -d -p 8080:80 --log-driver=json-file --log-opt max-size=1k --log-opt max-file=5 -v /data/logs:/app/app_data/logs --name api erp/myapi:1.0  
docker run -it -p --name box busybox sh

其他常用参数 -e 环境变量  如 -e aspnetcore_environment=release 项目运行环境是release 可使用多次

 

 

6.查看所有容器

# -a 表示查看所有容器 不加-a表示查看所有运行中的容器
docker ps -a

 

7.查看指定容器的详细信息

docker inspect  <容器名称 or 容器id>

8.进入一个运行的容器内

docker exec -it <容器名称 or 容器id> sh
docker exec -it <容器名称 or 容器id>  /bin/bash

eg: docker exec -it api /bin/bash
退出 ctrl + p ,q 或者输入 exit

   

这样在docker中运行一个dnc项目就算是完成了  

遇到的一些问题:  

1.运行时没有设置环境变量,dotnetcore没有按预期加载appsettings.{xxx}.json文件,导致数据库连接不通

2.desktop 默认在hyper-v中虚拟的是linux内核 可以desktop右键  点击switch to windows/linux containers 去切换环境  

   在linux内核中运行web项目,资源文件路径大小写敏感

3.路径问题 项目中不要使用  + "\\" 等来拼接路径 通常建议使用path.combine()

 

下一篇 docker + elk 搭建日志平台  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网