最近發現身邊很多的運維老鳥對於一些 Docker 經常使用操做還不太清楚,或者使用來一些比較複雜的實現方式。文本主要記錄一下可能不太常見,可是很是實用的 Docker 小技巧。git
docker stats
複製代碼
docker top <container>
複製代碼
docker system df
複製代碼
這幾個命令很簡單,通常你們都知道,還有些圖形界面的服務,可視化展現的,如 Google 的 cAdvisor 和Prometheus。還有些商業化軟件就不寫了。github
清除無用的數據很是常見,例如刪除失敗的容器,刪除沒有運行的鏡像等等,最近發現有些人仍是使用 ps 列出 ID 以後一個個複製刪除,其實有更高效的方法。docker
docker ps 有個 -f 參數能夠幫助咱們篩選容器。json
例如,獲取正在運行的容器bash
docker ps -f status=running
複製代碼
獲取狀態爲 exited
的容器服務器
docker ps -f status=exited
複製代碼
配合 -q 參數(只輸出 ID)和 docker rm
命令能夠快速刪除容器。網絡
docker rm $(docker ps -qf status=exited)
複製代碼
仍是嫌麻煩?Docker 其實直接給我提供了命令。運維
docker container prune
複製代碼
這個命令能夠直接刪除中止的容器(會詢問,-f 選項強制),不過刪除需謹慎,請確認後再操做。 一樣的還有其餘的清除命令。ide
docker image prune
複製代碼
docker network prune
複製代碼
docker volume prune
複製代碼
以及,終極命令,上面命令的集合ui
docker system prune
複製代碼
Docker Daemon 有不少配置很是有用,必要時能夠修改。配置文件的地址是:/etc/docker/daemon.json
。
不存在就建立,修改後須要重啓 docker 服務生效。
這個不少人都知道,因爲國內網絡的緣由,除非忍受力很是好,基本是必改的。不少雲服務商都是提供鏡像加速地址的,例如阿里雲的,只要有帳戶就能夠生成,無償使用。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
複製代碼
由於 Docker 存儲目錄可能很是大,咱們有時候須要移到其餘磁盤上。能夠修改配置生效。
{
"data-root": "/mnt/docker-data"
}
複製代碼
還有一個辦法就是將目錄移動到其餘磁盤後,建立一個軟連接。
mv /var/lib/docker /mnt/docker-data
ln -s /mnt/docker-data /var/lib/docker
複製代碼
Docker 的日誌輸出也能夠配置,就是 docker logs
看到的。同時也避免日誌文件過大,佔用過多磁盤空間。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
複製代碼
log-driver 配置日誌驅動,驅動很是多,還有第三方的插件,最經常使用的就是 json-file(也是默認的),Docker CE 能和 docker logs 配合使用的只有這三個。
log-opts 是日誌驅動的配置,對於 json-file
的主要配置 max-size
和 max-file
配置滾動日誌的最大單文件大小和數量。
而 json 日誌文件存放在 /var/lib/docker/containers/<container_id>/<container_id>_json.log
。
部分容器運行對 ulimit 有要求,如 Elasticsearch,咱們能夠在運行時指定,
docker run -d --ulimit nofile=20480:40960 nproc=1024:2048 <image>
複製代碼
也能夠進行全局配置
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
複製代碼
通常狀況下,Docker Daemon 不穩定或重啓時,全部的容器進程都會中止。咱們能夠開啓 live-restore 功能,這樣即便 Docker Daemon 掛掉,容器的進程也不會被殺死。對於咱們須要常常升級版本、更改配置等緣由重啓 Docker,可是不想要重啓全部容器的時候很是有用。
{
"live-restore": true
}
複製代碼
須要注意的是,個別大版本更新或者修改了 Daemon 的 bridge IP,graph driver 等配置,Docker Daemon 重啓後會沒法恢復對容器的控制,容器進程將會失去 Docker 的管理,須要手動干預。
CGroups 是 Control Groups 的縮寫,是 Docker 用來限制容器資源使用的組件,如 CPU,內存的限制等。在用容器編排的時候很是有用,如 Kubernetes 中使用 Docker。Docker 默認的 cgroups 驅動是 cgroupfs,而對於有 systemd 的系統來講,systemd 和 cgroups 有更緊密的鏈接且針對單個進程控制。Kubernetes 也推薦使用 systemd 做爲 cgroups 驅動,否則能夠看到相似以下的警告:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
複製代碼
修改 cgroups 驅動配置。
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
複製代碼
網絡代理適用於不能直接訪問外網下載鏡像,或者鏡像服務器在特殊的內網,不能直接訪問的狀況。
下面是使用 systemd 下的配置,首先建立配置目錄
mkdir -p /etc/systemd/system/docker.service.d
複製代碼
建立配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf
,加入以下內容,相似於 Linux 的代理設置,這裏也是配置 HTTP_PROXY
環境變量。
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
複製代碼
固然能夠更靈活,用 HTTP_PROXY
配置 HTTP 代理,HTTPS_PROXY
配置 HTTPS 代理,NO_PROXY
配置不用代理。
[Service]
Environment="HTTP_PROXY=http://proxy-addr:proxy-port" "HTTPS_PROXY=http://proxy-addr:proxy-port" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
複製代碼
而後,須要從新載入配置和重啓服務。
sudo systemctl daemon-reload
sudo systemctl restart docker
複製代碼
能夠經過以下命令查看是否配置成功。
systemctl show --property=Environment docker
複製代碼