docker使用
1.docker ps 查看運行中的容器
2. docker images 查看docker映像
3. docker rm id 查看docker映像
3. (容器id) 刪除容器(容器id可以透過docker ps查看,容器必須停止後才能刪除)
3.1 刪除全部的容器docker rm `docker ps -a -q`
444444444444 。
7. docker run -it ubuntu:16.04 建立並執行容器容器
-t 表示在新容器內指定一個偽終端或終端機
-t 表示在新容器內指定一個偽終端或終端機
-i對容器內的(stdin) 進行互動
-p 指定映射埠
-d 在後台運行容器並列印容器id
7.建立並後台運行容器
7.2 docker run -ditp 8080:8080(主機連接埠:容器連接埠) ubuntu:16.04 建立並後台運行容器且映射容器的連接埠
ach8. (容器id) 進入正在運作中的容器環境
9.退出容器
9.1 exit 直接退出容器並終止容器運作
9.2 [ctrl p] [
rlC.2 [ctrl p] [ct ](快捷鍵) 退出容器,但不會終止容器運行
好了,大家了解了docker,以下是本文介紹的重點,一起看看吧。
nginx 自己沒有處理日誌的滾動問題,它把這個球踢給了使用者。一般情況下,你可以使用 logrotate 工具來完成這個任務,或者如果你願意,你可以寫各式各樣的腳本完成同樣的任務。本文筆者介紹如何滾動運行在 docker 中的 nginx 日誌檔案(下圖來自互聯網)。
想法
rotating log-files
•先把舊的日誌檔案重新命名
•然後給nginx master 程序發送usr1 訊號
•工作者進程打開新的日誌檔案並關閉舊的日誌檔案
其實真正需要我們做的工作只有前面兩點!
建立測試環境
假設你的系統中已經安裝好了docker,這裡我們直接執行一個nginx 容器:
$ docker run -d \ -p 80:80 \ -v $(pwd)/logs/nginx:/var/log/nginx \ --restart=always \ --name=mynginx \ nginx:1.11.3注意,我們把nginx 的日誌綁定掛載到了目前目錄下的logs 目錄下。
把下面的內容儲存到 test.sh 檔案中:
#!/bin/bash for ((i=1;i<=100000;i++)) do curl http://localhost > /dev/null sleep 1 done
然後執行這個腳本,就可以模擬產生連續的日誌記錄。
建立滾動日誌的腳本
建立rotatelog.sh 文件,其內容如下:
#!/bin/bash getdatestring() { tz='asia/chongqing' date "+%y%m%d%h%m" } datestring=$(getdatestring) mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log kill -usr1 `cat /var/run/nginx.pid`
getdatestring 函數取當前的時間並格式化為字串,例如"201807241310 ",筆者比較喜歡用日期和時間來命名文件。注意這裡透過 tz='asia/chongqing' 指定了時區,因為預設格式化的是 utc 時間,用起來怪怪的(要實時腦補 8 小時)。下面的兩個 mv 指令用來重新命名日誌檔。最後透過 kill 指令向 nginx master 程序發送 usr1 訊號。
透過下面的命令為rotatelog.sh 檔案新增可執行權限並複製到$(pwd)/logs/nginx 目錄下:$ chmod +x rotatelog.sh
$ sudo cp rotatelog.sh $(pwd)/logs/nginx
我們的nginx 運行在容器中,所以需要在容器中給nginx master 程序發送usr1 訊號。因此我們需要透過docker exec 指令在mynginx 容器中執行rotatelog.sh 腳本:
執行一次上面的指令,會如期產生一批新的日誌檔:
######下面我們把這個指令設定在定時任務中,讓它每天早上 1 點鐘執行一次。執行crontab -e 指令,並在檔案的末端加入下面的行:
* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh
#儲存並退出就可以了。下圖是筆者測試過程中每 5 分鐘滾動一次的效果:
#為什麼不在宿主機中直接 mv 日誌檔案?
理論上這麼做是可以的,因為透過綁定掛載的資料卷中的內容從宿主機上看和從容器中看都是一樣的。但是真正這麼做的時候你很可能碰到權限問題。在宿主機中,你一般使用的是普通用戶,而在容器中產生的日誌檔案的擁有者是會是特殊的用戶,並且一般不會給其它用戶寫和執行的權限:
#當然,如果你在宿主機中使用的是root 使用者就不會有問題。
能從宿主機發送的訊號嗎?
其實這個問題的全名應該是:能從宿主機中傳送訊號給 docker 容器中的 nginx master 程序嗎?
答案是,可以的。
筆者這一文中介紹了容器中訊號的捕捉問題,有興趣的朋友可以去看看。在那篇文章中我們介紹了 docker 向容器中進程發送訊號的 kill 指令。我們可以透過指令:
$ docker container kill mynginx -s usr
向容器中的1 號行程(nginx master)傳送usr1 訊號(這個方式只能傳送訊號給1 號程序):
結合上面的兩個問題,我們可以寫出另外的一種方式來捲動docker 中的nginx 日誌。這種方式不需要透過docker exec 指令在容器中執行指令,而完全在宿主機中完成所有的操作:
•先重新命名容器資料卷中的日誌檔案
•給容器中的1 號程序發送usr1 訊號
以上是怎麼滾動docker中的nginx日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!