• 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

  • 相关阅读:
    vue生命周期总结
    Generator的基本用法
    React context基本用法
    盗链
    Linux 黑白界面显示
    nginx 反向代理Apache
    apache+php windows下配置
    正则表达式匹配空行
    列表页条目不刷新删除
    linux终端自定义设置
  • 原文地址:https://www.cnblogs.com/dbycl/p/10875449.html
Copyright © 2020-2023  润新知