zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/dbycl/p/10875449.html
Copyright © 2011-2022 走看看