更換容器配置文件如何生效
Ⅰ Docker:容器管理(啟動參數,查看容器和日誌,進入和修改容器)
摘要: Docker
容器是一個精簡版的操作系統,一般一個容器只運行一個應用,容器通過鏡像創建,使用 docker run 命令創建,容器起到了 隔離 作用,容器和容器之間獨享空間和網路等
容器的基本操作包括創建(啟動),停止,重啟,查看,檢查等,容器通過鏡像創建,使用 docker run 命令創建,需要指定run參數,鏡像名,容器執行命令,語句格式如下
在實際使用中啟動一個鏡像,例如
-e 設置環境變數,格式是 -e k1=v1 -e k2=v2 ,使得在docker鏡像中的程序能夠直接訪問到環境變數,同時可以作為配置參數放在docker run啟動鏡像的時候設置,而不是寫死在dockerfile在build的過程中,-e和dockerfile中的 ENV 變數作用相同,當變數重名時-e替換ENV,下面測試一些-e參數,在Dockerfile指定環境變數
直接構建成容器
開啟一個終端啟動容器內部,列印指定的環境變數a
此時在run指令中增加-e設置環境變數,可見-e替換了Dockerfile中指定的環境變數
因為一個鏡像可以啟動多個容器,所以可以通過設置不同-e達到設置不同配置參數的目的,比如下一個例子在Dockerfile中設置和將環境變數寫入yaml文件再供Python調用,執行的內容為列印yaml配置文件的參數內容,比如下面這個例子先看下目錄結構
其中config.yml是一個空配置文件,在run.sh中先使用echo寫入追加配置參數到config.yml在執行Python腳本
Dockerfile中啟動run.sh腳本作為容器執行命令
在啟動容器時,使用-e指定環境變數,在run.sh中echo將環境變數拿到和寫入配置文件,測試多次以不同的配置參數啟動容器如下
-v 設置掛載運行,將宿主機當前目錄下的文件掛載到容器中/home目錄下,例如
如果掛載的目錄和Dockerfile中的COPY的目錄不一致, -v會替代COPY或者ADD ,例如現在Docker中COPY一個文件到容器/home目錄下
同目錄下start.sh內容是列印1
構建鏡像結束後,指定-v啟動,起始掛載另外一個目錄,目錄下start.sh內容是列印2
docker run參數中最後的COMMAND會覆蓋Dockerfile中指定的 CMD ,例如執行echo 2替換原始Dockerfile中的CMD echo 1,輸出結果是2且執行完畢後退出
對於Dockerfile中的 ENTRYPOINT 指定的啟動命令docker run的COMMAND不會覆蓋,如果要覆蓋Docker中的ENTRYPOINT需要指定docker run中的 --entrypoint 參數,格式是
測試一個Dockerfile輸出1
在docker run中使用--entrypoint覆蓋Dockerfile中的ENTRYPOINT
容器啟動後通過 docker ps 或者 docker container ls 查看容器,可以增加額外參數比如 -a 顯示所有容器,默認只顯示運行的容器,可以增加 --no-trunc 參數使得顯示結果不截斷,例如
顯示結果分別顯示了容器的ID,鏡像,執行命令,創建時間,狀態,埠映射(宿主機->容器)和容器名稱。對於已經運行的容器可以使用 docker stop 停止,如果在docker run時增加--rm參數則停止的容器保留不會自動刪除,例如
除了docker stop命令還有一種停止容器的命令 docker kill ,相比於docker stop,docker kill是 強制立即停止 ,而docker stop是先給了容器10秒(默認)的時間,使得容器有一定的時間處理、保存程序執行現場, 優雅的退出程序 ,例如
在容器停止之後可以使用 docker start 再啟動一個停止的容器,例如
除此之外可以使用 docker restart ,此時容器可以使停止的也可以是在運行中的,例如
查看容器詳情使用 docker inspect ,比如
在以上截取的內容中展示了容器詳情,包括容器id,創建時間,執行命令和參數,執行狀態,容器pid,落腳點,環境變數,網路設置,埠映射等,也可以使用Go語言風格輸出指定的詳情,比如分別只看容器的pid和容器的執行命令
容器是一個操作系統,可以進入這個操作系統查看容器的運行情況,有多種方式進入容器,其中主要是使用 docker exec 進入容器,在一個運行中的容器中執行一個命令,使用 -it 並帶有 /bin/bash 命令就可以進入容器,比如
除了/bin/bash也可以是其他命令掛載exec後面則可以直接對一個運行中的容器執行命令,比如查看容器的進入落腳點路徑,容器中的內存情況
當容器以後台 -d 運行時,日誌運行在容器內部,可以進入容器內部查看日誌,也可以使用 docker logs 查看日誌,以一個flask api介面的容器為例,日誌寫入文件,同時也會輸出在flask的控制台
創建Dockerfile以及構建鏡像,啟動容器
啟動一個腳本不斷請求api介面
進入容器內部查看日誌
另一種方式是直接使用 docker logs 命令,比如使用 -f 追蹤輸出,並且從最後的第1行開始輸出
此時宿主機的logs目錄下為空,容器中的logs目錄下存在detail.log文件,如果使用 -v 將宿主機目錄掛載到容器作為容器寫入的目錄,則容器中數據的變動會同步到本地,這樣可以直接在本地查看日誌,修改容器啟動為 -v 掛載的形式
此時本地logs目錄下開始產生日誌,且這個日誌和容器內的logs目錄下一致
如果容器內的內容改變了,此時刪除容器從鏡像重新啟動容器則改動的內容將不會存在,如果相對修改過的容器保留下來則可以從容器生成新的鏡像,先測試以下容器內修改在刪除的容器後將不再生效,在已有容器中使用pip安裝Python包
此時退出容器,並且刪除容器,最後從鏡像重新生成容器
此時進入容器檢查,並不存在pymongo包
如果要容器變化保存下來需要以這個新容器生成一個鏡像,使用 docker commit ,語法如下
以新安裝pymongo的容器為例,對新容器使用docker commmit
新生成的鏡像叫做xiaogp/my_image_test:v2
從新鏡像啟動容器並進入容器查看存在新安裝的pymongo