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 ](快捷鍵) 退出容器,但不會終止容器運行
思路
##nginx 官方其實給如何捲動日誌的說明:
rotating log-files
in order to rotate log files, they need to be renamed first. after that usr1 signal should be sent to the master process. the master process will then re-open all currently open log files and assign themleg y re-open all currently open log files and assign themleg unna are running, as an owner. after successful re-opening, the master process closes all open files and sends the message to worker process to ask them to re-open files. worker processes also open new files andclose older processes also a result, old files are almost immediately available for post processing, such as compression.
這段說明的大意是:
•先把舊的日誌檔案重命名
•然後給nginx master 程序發送usr1 信號
•nginx master 程序收到信號後會做一些處理,然後要求工作者程序重新打開日誌文件
$ docker run -d \ -p 80:80 \ -v $(pwd)/logs/nginx:/var/log/nginx \ --restart=always \ --name=mynginx \ nginx:1.11.3
#!/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 腳本:
$ docker exec mynginx bash /var/log/nginx/rotatelog.sh
* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh
儲存並退出就可以了。下圖是筆者測試過程中每 5 分鐘滾動一次的效果:
#為什麼不在宿主機中直接 mv 日誌檔案?
理論上這麼做是可以的,因為透過綁定掛載的資料卷中的內容從宿主機上看和從容器中看都是一樣的。但是真正這麼做的時候你很可能碰到權限問題。在宿主機中,你一般使用的是普通用戶,而在容器中產生的日誌檔案的擁有者是會是特殊的用戶,並且一般不會給其它用戶寫和執行的權限:
#當然,如果你在宿主機中使用的是root 使用者就不會有問題。
能從宿主機發送的訊號嗎?
其實這個問題的全名應該是:能從宿主機中傳送訊號給 docker 容器中的 nginx master 程序嗎?
答案是,可以的。
我們可以透過指令:
$ docker container kill mynginx -s usr
#到容器中的1 號行程(nginx master )發送usr1 訊號(這種方式只能傳送訊號給1 號程序):
結合上面的兩個問題,我們可以寫出另外的一種方式來滾動docker 中的nginx 日誌。這種方式不需要透過docker exec 指令在容器中執行指令,而完全在宿主機中完成所有的操作:
•先重新命名容器資料卷中的日誌檔案
•給容器中的1 號程序發送usr1 訊號
以上是如何滾動docker中的nginx日誌文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!