Docker筆記01-發佈一個dotnetcore應用

OS:Widows 10html

IDE: VS2017web

Docker:Docker Desktop for Windowsdocker

Windows下安裝Docker須要先啓用Hyper-v 數據庫

在Windows 容器的運行目錄在C盤這個改不了,可是能夠改image的保存路徑 json

Desktop 右鍵 > Settings > Daemon > 點擊 Basic > 輸入  "graph": "D:\\docker\\images"

 本地環境搭好後開始準備項目製做鏡像windows

1.新建項目時添加Docker支持或者在現有項目上右鍵添加Docker支持api

2.將生成的Dockerfile複製到解決方案目錄下 *****貌似若是須要用命令行Build鏡像就必須手動複製到解決方案目錄下,應該算是vs的bug****bash

   VS自動生成的一個Dockerfile 紅色部分是後加的說明app

 

#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 搭建日誌平臺  

http://www.javashuo.com/article/p-unridlon-hw.html

相關文章
相關標籤/搜索