Docker 實用技巧拾遺

前言

最近發現身邊很多的運維老鳥對於一些 Docker 經常使用操做還不太清楚,或者使用來一些比較複雜的實現方式。文本主要記錄一下可能不太常見,可是很是實用的 Docker 小技巧。git

信息查看

查看容器資源使用狀況

docker stats
複製代碼

查看容器內進程

docker top <container>
複製代碼

查看數據佔用

docker system df
複製代碼

這幾個命令很簡單,通常你們都知道,還有些圖形界面的服務,可視化展現的,如 Google 的 cAdvisorPrometheus。還有些商業化軟件就不寫了。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
複製代碼

清除未使用的卷(Volume)

docker volume prune
複製代碼

以及,終極命令,上面命令的集合ui

清除全部未使用的資源

docker system prune
複製代碼

配置

Docker Daemon 有不少配置很是有用,必要時能夠修改。配置文件的地址是:/etc/docker/daemon.json

不存在就建立,修改後須要重啓 docker 服務生效。

修改鏡像源

這個不少人都知道,因爲國內網絡的緣由,除非忍受力很是好,基本是必改的。不少雲服務商都是提供鏡像加速地址的,例如阿里雲的,只要有帳戶就能夠生成,無償使用。

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
複製代碼

修改 Docker 存儲路徑

由於 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 配合使用的只有這三個。

  • local
  • json-file
  • journald

log-opts 是日誌驅動的配置,對於 json-file 的主要配置 max-sizemax-file 配置滾動日誌的最大單文件大小和數量。

而 json 日誌文件存放在 /var/lib/docker/containers/<container_id>/<container_id>_json.log

ulimit 設置

部分容器運行對 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 配置

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
複製代碼

參考

相關文章
相關標籤/搜索