Docker笔记01-发布一个dotnetcore应用
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()
4.docker容器中时区问题,和宿主机相差8小时
解决方案:
1.貌似需要重启容器
docker cp /etc/localtime containerId:/etc/
docker restart containerId
2.启动时挂载进去
docker run -d -p 8889:80 --name test_supplier -e ASPNETCORE_ENVIRONMENT=release --log-driver=json-file --log-opt max-size=1k --log-opt max-file=5 -v /etc/localtime:/etc/localtime:ro -v /data/logs/dev/test:/app/App_Data/Logs -v /data/logs/dev/test:/app/LogFiles develop/supplier:1.0
查看容器时间:
docker exec containerId date
5.乱码问题
发现日志记录中的中文存在乱码,但并不是所有中文都是乱码?!消息弹窗也是部分中文乱码
后来发现是源文件的编码格式导致的,转成UTF-8就好了
Windows环境下VS默认文件编码格式是GBK(gb2312),可以安装插件ForceUTF8(with BOM)重新保存后解决 直接在Centos中修改
# sudo yum install -y enca 安装enca
# find -type f -name "*.cs" -exec enca -L zh_CN -x UTF-8 {} \; 批量把cs文件编码改为UTF-8
# enca -L zh_CN filename 查看指定文件的编码
# enca -L zh_CN -x UTF-8 filename 修改指定文件的编码格式为UTF-8
下一篇 docker + elk 搭建日志平台
https://www.cnblogs.com/dbycl/p/10876373.html
Docker笔记01-发布一个dotnetcore应用的更多相关文章
- docker 笔记(3)第一个dockerfile
#vim Dockerfile FROM ubuntu RUN apt-get update && apt-get install -y vim #docker build -t ub ...
- Docker笔记(四):Docker镜像管理
原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...
- Docker笔记--镜像&基于GO项目创建Docker镜像
Docker笔记--镜像&基于GO项目创建Docker镜像 核心概念 Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础. Docker容器--如果把 ...
- Redis:学习笔记-01
Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《The Linux Command Line》 读书笔记01 基本命令介绍
<The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...
- PHP 学习笔记 01
例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...
- Java发布一个简单 webservice应用 并发送SOAP请求
一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...
随机推荐
- hive 导出数据的几种方式
1.使用insert导出 这种方式的优点在于既可以导出到hdfs上还可以导出到本地目录 下面以导出emp表中数据为例 insert overwrite local directory "/o ...
- 华为云软件开发云:容器DevOps,原来如此简单!
当开发团队把代码提交到 Git 应用仓库的那一刻,他们心里在想什么? 祈祷没有bug?渴望回家补觉?产品经理Go Die? 对,也不对.因为这只是最终发布万里长征的一小步,接下来要面对测试环境.生产环 ...
- 微信小程序bnner滚动
首先是轮播图,autoplay 自动播放,interval 轮播的时间,duration 切换速度,可以根据自己需求去添加. Delete:是删除按钮,加载进来是隐藏的,需用户点轮播图进去后,轮播图全 ...
- C#性能优化:延迟初始化Lazy
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- JAVA SortedMap接口
SortedMap接口主要提供有序的Map实现. Map的主要实现有HashMap,TreeMap,HashTable,LinkedHashMap. TreeMap实现了SortedMap接口,保证了 ...
- C#中的Lambda总结
Lambda的前世今生 早在C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...
- 【oracle ocp 知识点二】
1.数据库操作语言 DML在运行时下面的语句 添加一个新行到表 更新表现出一定的线 从表删除现有行 一个事务处理是由一系列的DML语句逻辑组成 A.insert 每次插入一行数据 字符和日期的须要单引 ...
- DM365 IPNC软件架构具体解释
于2013在上半场 - 年DM365.DM368的IPNC(网络摄像机)与稳定性测试工作产品结束. 1.简单介绍: TI针对TMS320DM365.DM368进行了DVR和IPNC的应用方案參考.DV ...
- ZOJ 2334 HDU 1512 Monkey King
题意: 猴子们打架 认识的猴子不会打架 两仅仅猴子打完以后就认识了 A认识B B认识C A也认识C 每次打架由两伙猴子进行 分别选出自己的最高战斗力 在战斗之后两仅仅猴子战斗力减半 给出 ...
- WPF扑克牌之红桃K
原文:WPF扑克牌之红桃K 有些什么用途呢?我想,如果你有兴趣,可用来制作WPF扑克牌游戏. 没有任何技术含量,需要做的是在Blend中绘图或者使用Illustrator,CoreDraw等矢图设计软 ...