windows容器實踐之路

1.dockerfile

使用dockerfile構建鏡像的命令爲:docker build -t image:v1 -f df .

-t image:v1 表示新建的鏡像名字爲image標籤爲v1

-f df 構建鏡像的腳本命令 在名爲df的文件中

. 此點表示當前目錄,用來指定上下文路徑, docker build 命令構建鏡像,其實並非在本地構建,而是在服務端,也就是 Docker 引擎中構建的,當構建的時候,用戶會指定構建鏡像上下文的路徑, docker build 命令得知這個路徑後,會將路徑下的所有內容打包,然後上傳給 Docker 引擎。這樣 Docker 引擎收到這個上下文包後,展開就會獲得構建鏡像所需的一切文件。COPY 這類指令複製的是上下文(context) 目錄下的文件或文件夾,所以這類指令中的源文件的路徑都是相對路徑。這也是初學者經常會問的爲什麼 COPY ../package.json /app 或者 COPY /opt/xxxx /app 無法工作的原因。

2.在容器中啓動自己寫的程序時找不到相關文件

在容器中運行程序的時候必須切換(cd 命令)到程序所在目錄,再啓動。如若不然程序中使用的相對路徑是找不到相應文件的。如上圖第一次執行失敗,切換到exe所在目錄再啓動就正常。

3.在容器中啓動自己寫的程序時無反應,無任何反饋信息。

出現這種情況是在容器的系統中程序因爲缺少依賴的dll而啓動失敗, 缺少的dll往往爲系統dll以及運行時dll。可以用dumpbin 查看exe需要的dll,然後將缺少的dll補上,就解決此問題了。另外需要說明的是要基於servercore系統,nanoserver似乎仍然失敗。

4.容器目錄掛載到主機

docker run -v ./dir1:c:/dir2

在啓動容器時需要加-v指令 前面路徑代表主機路徑,使用相對路徑,docker會統一管理掛載的目錄,否則容器不易遷移。

5.容器主機端口映射

docker run -p 3000:3001

在啓動容器時需要加-p指令 前面端口代表主機端口。這樣從外部訪問主機的3000端口就會映射到容器的3001端口實現通信。

6.操縱容器的僞終端

docker -it powershell

通常的解釋是: -t讓docker分配一個僞終端並綁定到容器的標準輸入上, -i則讓容器的標準輸入保持打開。這樣我們就可以通過powershell命令操作容器。如果要直接啓動容器中的程序,而不想操作容器可以使用CMD命令啓動目標程序,但是在這之前需要在dockerfile中設置當前路徑(WORKDIR可以理解爲cd ,不同之處在於沒用路徑會創建)。另外需要注意的是-it 會讓CMD命令失效,加了-it 容器啓動後不會執行CMD命令。

7.控制檯程序在容器中輸出的gbk中文字符亂碼

出現此問題的原因爲編碼頁不匹配,程序輸出的文本爲gbk格式,但是容器中系統控制檯默認是utf8編碼頁,需要修改控制檯輸出編碼頁爲gbk,在main函數最開始加入::SetConsoleOutputCP(936);即可完成對控制檯代碼頁的修改。另外 在cmd中使用chcp 936會提示無效代碼頁,所以只能在c++代碼中修改。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章